4X4键盘扫描程序,采用查表方式,适用于AVR 单片机 。
此处为4X4键盘软件部分,硬件部分设计请参照:
此程序对应的键盘电路为:
/*
键盘扫描函数
读取当前键盘的状态
有按键按下返回相应按键值
无按键按下返回"0x00"
*/
unsigned char key_read(void){
unsigned char i;
DDRA = 0x00;/*获取列地址*/
PORTA = 0x0F;
DDRA = 0xF0;
i = PINA;
DDRA = 0x00;/*获取行地址*/
PORTA = 0xF0;
DDRA = 0x0F;
i |= PINA;
DDRA = 0x00;/*输出复位*/
PORTA = 0xFF;
switch (i) {/*将按键码转换成键值*/
case 0x00: return 0x00;
case 0xEE: return '1';
case 0xDE: return '2';
case 0xBE: return '3';
case 0x7E: return 'A';
case 0xED: return '4';
case 0xDD: return '5';
case 0xBD: return '6';
case 0x7D: return 'B';
case 0xEB: return '7';
case 0xDB: return '8';
case 0xBB: return '9';
case 0x7B: return 'C';
case 0xE7: return '*';
case 0xD7: return '0';
case 0xB7: return '#';
case 0x77: return 'D';
default : return 0x00;
}
}
/*
按键获取函数
获取按键信号,其中包含有状态记录及按键去颤抖。
有正确按键按下返回相应按键值
无正确按键按下返回"0x00"
*/
unsigned char get_key(void){
unsigned char i;
statIC unsigned char j;/*按键记录*/i = key_read();
if (i == 0x00){/*无有效按键按下*/
j = 0x00;/*清除按键记录*/
return 0x00;/*程序退出*/
}
if (j == 0x00) {/*为新按键*/
j = i;/*保存本次采样结果*/
delay_ms(10);/*去按键颤抖*/
i = key_read();
if(i == j) {
return i;
}
}
return 0x00;
}