|
#define int8 unsigned int #define int16 unsigned char #define int32 unsigned long #define KEY_PORT PORTD #define KEY_PIN PIND #define ROW1 (1<<0) #define ROW2 (1<<1) #define ROW3 (1<<2) #define ROW4 (1<<3) static int8 scan_X(void); static delay(void); int8 scan_key(void); /* 函數原型:int8 scan_key(void) 功能: 返回按下的按鍵的行列值, 如返回第二行第三列,即按鍵“6”, 返回值0x23,高位為行,低位為列 鍵盤: 7 8 9 / 4 5 6 * 1 2 3 + C 0 = - 返回值: 0x11 0x12 0x13 0x14 0x21 0x22 0x23 0x24 0x31 0x32 0x33 0x34 0x41 0x42 0x43 0x44 作者: Benny Email: 89S53@163.com 2005 */ int8 scan_key(void){ //第四行---------------- KEY_PORT|=0xff; KEY_PORT&=~ROW4; if ((KEY_PIN&0xf0)!=0xf0) { delay();//去抖動 if ((KEY_PIN&0xf0)!=0xf0) { return (0x40|scan_X()); } } //第三行---------------- KEY_PORT|=0xff; KEY_PORT&=~ROW3; if ((KEY_PIN&0xf0)!=0xf0) { delay();//去抖動 if ((KEY_PIN&0xf0)!=0xf0) { return (0x30|scan_X()); } } //第二行---------------- KEY_PORT|=0xff; KEY_PORT&=~ROW2; if ((KEY_PIN&0xf0)!=0xf0) { delay();//去抖動 if ((KEY_PIN&0xf0)!=0xf0) { return (0x20|scan_X()); } } //第一行: 7 8 9 / KEY_PORT|=0xff; KEY_PORT&=~ROW1; if ((KEY_PIN&0xf0)!=0xf0) { delay();//去抖動 if ((KEY_PIN&0xf0)!=0xf0) { return (0x10|scan_X()); } } } //列掃描函數 static int8 scan_X(void){ if ((KEY_PIN&0xf0)==0xe0) { //"7" while((KEY_PIN&0xf0)==0xe0); return 0x01; //第一列 } else if((KEY_PIN&0xf0)==0xd0) { while((KEY_PIN&0xf0)==0xd0); return 0x02;//第二列 } else if((KEY_PIN&0xf0)==0xb0) { while((KEY_PIN&0xf0)==0xb0); return 0x03;//第三列 } else if((KEY_PIN&0xf0)==0x70) { while((KEY_PIN&0xf0)==0x70); return 0x04; //第四列 } } static delay(void){ //去抖動 int16 i,j; for (i=0;i<10;i++) { for (j=0;j<100;j++) {} } } |