cmovies

|
分享:
▲
▼
我有點看不懂你的程式在做什麼? 我幫你將掃瞄鍵盤改成用 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)) ; } }
|