4X4键盘扫描程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;",返回值到哪里?

回复:(dudubeibei)我有两个问题关于这个程序请教:一...

1、无按键按下返回"0x00",这是自己定义的。就是为了表明现在没有按键按下。

2、case 0xEE: return '1';这个地方我可能没说清楚,返回的是ASCII码,要把它转换成十六进制码才能用。或者修改这个地方不用ASCII码,直接用十六进制码。

3、return i;这个是函数的返回,返回给调用它的地方。

调用有返回值的函时可以写成下面方式,这样就可以得到函数的返回值了。(i)

temp = key();

建议:C语言的函数部分再复习一次,加深一下理解。

没见有主程序!!!

我参考后编了个你们帮我看看是不是这样用的!!

#include

#include

delay_ms//延时子程序省略

unsigned char key_read(void)

{ unsigned char i;

DDRA = 0x00;/*获取列地址*/

POR TA = 0x0F;

DDRA = 0xF0;

i = PINA;

DDRA = 0x00;/*获取行地址*/

POR TA = 0xF0;

DDRA = 0x0F;

i |= PINA;

DDRA = 0x00;/*输出复位*/

POR TA = 0xFF;

switch (i)

{/*将按键码转换成键值*/

case 0x00: return 0x00;

case 0xEE: return 1;

case 0xDE: return 2;

case 0xBE: return 3;

case 0x7E: return 4;

case 0xED: return 5;

case 0xDD: return 6;

case 0xBD: return 7;

case 0x7D: return 8;

case 0xEB: return 9;

case 0xDB: return 10;

case 0xBB: return 11;

case 0x7B: return 12;

case 0xE7: return 13;

case 0xD7: return 14;

case 0xB7: return 15;

case 0x77: return 16;

default : return 0x00;

}

}

/*按键获取函数获取按键信号,其中包含有状态记录及按键去颤抖。有正确按键按下返回相应按键值无正确按键按下返回"0x00"*/

unsigned char get_key(void)

{

unsigned char i;

相关文档
最新文档