4X4 键盘扫描程序,采用查表方式,适用于AVR 单片机。 此处为4X4 键盘软件部分,硬件部分设计请参照: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; } 我有两个问题关于这个程序请教: 一,无按键按下返回"0x00",这个"0x00"是自己规定的还是什么来头? 二,"case 0xEE: return '1';",返回'1'是键值?如果我要把按键的值用数码管显示,那么这个返回值应该在主函数里面怎么处理? 三,"return i;",返回值到哪里? 回复:(du du beibei)我有两个问题关于这个程序请教:一... 1、无按键按下返回"0x00",这是自己定义的。就是为了表明现在没有按键按下。 2、case 0xEE: return '1';这个地方我可能没说清楚,返回的是ASCII 码,...