引用 | 編輯
jack013338
2006-04-07 12:46 |
樓主
▼ |
||
x0
/********************************************* LEDK.C 2006/3/16 P2.0 ~ P2.7 P0.7 ~ P0.0 4X4 KEYBOARD *********************************************/ #include <REG51F.H> #define uchar unsigned char #define uint unsigned int sbit COLUMN1 = P1^0; sbit COLUMN2 = P1^1; sbit COLUMN3 = P1^2; sbit COLUMN4 = P1^3; sbit ROW1 = P1^4; sbit ROW2 = P1^5; sbit ROW3 = P1^6; sbit ROW4 = P1^7; bdata FLAG = 0x20; sbit C_FLAG = FLAG^0; sbit D_FLAG = FLAG^1; sbit F_FLAG = FLAG^2; sbit J_FLAG = FLAG^3; sbit L_FLAG = FLAG^4; sbit M_FLAG = FLAG^5; sbit N_FLAG = FLAG^6; sbit O_FLAG = FLAG^7; bdata FLAG1 = 0x21; sbit B_FLAG = FLAG1^0; uchar DCNT, KEY_NO, K_TEMP; void BLINK(void); void LRC(void); void LRD(void); void LRF(void); void LRJ(void); void LRL(void); void LRM(void); void LRN(void); void LRO(void); void Delay(uint del); void Kdelay(void); void SCAN(void); void SCAN_ON(void); void SCAN_OFF(void); void KEY_PRO(void); void main(void) { DCNT=5; SP+=2; while (1) { P2=0; P0=0xFF; Kdelay(); P2=0xFF; P0=0; Kdelay(); } } void BLINK(void) { FLAG=0; FLAG1=0; B_FLAG=1; while (1) { P2=P0=0; Kdelay(); P2=P0=0xFF; Kdelay(); } } void LRC(void) { uchar i,k=0; FLAG=0; FLAG1=0; C_FLAG=1; while (1) { for (i=8; i>0; i--) { P2=P0=k; Kdelay(); k<<=1; k+=1; } for (i=8; i>0; i--) { P2=P0=k; Kdelay(); k>>=1; } } } void LRD(void) { uchar i,k=0; FLAG=0; FLAG1=0; D_FLAG=1; while (1) { for (i=8; i>0; i--) { P2=P0=k; Kdelay(); k>>=1; k+=0x80; } for (i=8; i>0; i--) { P2=P0=k; Kdelay(); k<<=1; } } } void LRF(void) { uchar i,k; FLAG=0; FLAG1=0; F_FLAG=1; while (1) { k=0; for (i=8; i>0; i--) { P2=0; P0=k; Kdelay(); k<<=1; k+=1; } k=0; for (i=8; i>0; i--) { P2=k; P0=0xFF; Kdelay(); k>>=1; k+=0x80; } for (i=8; i>0; i--) { P2=k; P0=0xFF; Kdelay(); k<<=1; } k=0xFF; for (i=8; i>0; i--) { P2=0; P0=k; Kdelay(); k>>=1; } } } void LRJ(void) { uchar i,k=1; FLAG=0; FLAG1=0; J_FLAG=1; P2=P0=0; Kdelay(); while (1) { for (i=8; i>0; i--) { P2=0; P0=k; Kdelay(); k<<=1; } k=0x80; for (i=7; i>0; i--) { P2=k; P0=0; Kdelay(); k>>=1; } for (i=8; i>0; .. 訪客只能看到部份內容,免費 加入會員 x0
|
引用 | 編輯
cmovies
2006-04-07 20:32 |
1樓
▲ ▼ |
我有點看不懂你的程式在做什麼? 我幫你將掃瞄鍵盤改成用 Timer 中斷.
你只要判別相對應的 validKey? 做相對應的是就可以了 鍵盤的排列可能跟你要得有點顛倒, 你可以自己改一下 validKey? = validKeyData ^ ? #include <reg52.h> #include <intrins.h> typedef unsigned char BYTE; typedef unsigned int WORD; sbit COLUMN1 = P1^0; sbit COLUMN2 = P1^1; sbit COLUMN3 = P1^2; sbit COLUMN4 = P1^3; sbit ROW1 = P1^4; sbit ROW2 = P1^5; sbit ROW3 = P1^6; sbit ROW4 = P1^7; WORD data timerKeyData, pressKeyData, stateKeyData; WORD bdata validKeyData; sbit validKey0 = validKeyData ^ 0; sbit validKey1 = validKeyData ^ 1; sbit validKey2 = validKeyData ^ 2; sbit validKey3 = validKeyData ^ 3; sbit validKey4 = validKeyData ^ 4; sbit validKey5 = validKeyData ^ 5; sbit validKey6 = validKeyData ^ 6; sbit validKey7 = validKeyData ^ 7; sbit validKey8 = validKeyData ^ 8; sbit validKey9 = validKeyData ^ 9; sbit validKeyA = validKeyData ^ 10; sbit validKeyB = validKeyData ^ 11; sbit validKeyC = validKeyData ^ 12; sbit validKeyD = validKeyData ^ 13; sbit validKeyE = validKeyData ^ 14; sbit validKeyF = validKeyData ^ 15; BYTE KeyColNo, KeyColLine; void Timer0ISR(void) interrupt 1 { BYTE key; WORD tmp; TH0 = 256-120; // (11059200 / 12 / 32) / 120 = 240 Hz P1 = ~KeyColLine; // pull high ROWS KeyColLine <<= 1; KeyColNo++; key = ~P1 >> 4; timerKeyData = (timerKeyData << 4) | key; if (KeyColNo == 4) { KeyColNo = 0; KeyColLine = 0x01; tmp = pressKeyData & timerKeyData; pressKeyData = timerKeyData; validKeyData |= (tmp ^ stateKeyData); validKeyData &= pressKeyData; stateKeyData = tmp; } } void main() { TMOD = 0; TH0 = 256-120; // (11059200 / 12 / 32) / 120 = 240 Hz TR0 = 1; ET0 = 1; EA = 1; KeyColNo = 0x00; KeyColLine = 0x01; while (1) { if (_testbit_(validKey0)) ; } } x0 |
引用 | 編輯
jack013338
2006-04-08 15:02 |
2樓
▲ |
我的程式只是單存的跑馬燈~P1 P2 輸出~
4*4鍵盤 控制不同的狀態 x0 |