4X4键盘扫描程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 <iom64v.h>
#include<macros.h>
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;
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;
}
void main (void)
{unsigned char f;
DDRB=0XFF;
DDRC=0XFF;
DDRD=0XFF;
DDRE=0XFF;
DDRF=0XFF;
for(;;)
{POR TB=0X00;
POR TC=0X00;
POR TD=0X00;
POR TE=0X00;
POR TF=0X00;
if((key_read())!=0)
f=get_key();
switch (f)
{
case 1: PORTB=0XFF;break; //B端口工作(例如:点亮B口上的所有LED)case 2: PORTC=0XFF;break; //C端口工作
case 3: PORTD=0XFF;break; //D端口工作
case 4: PORTE=0XFF;break; //E端口工作
case 5: PORTF=0XFF;break; //F端口工作
case 6: PORTB=0X55;break; //B端口工作
case 7: PORTC=0X55;break; //C端口工作
case 8: PORTD=0X55;break; //D端口工作
case 9: PORTE=0X55;break; //E端口工作
case 10: POR TF=0X55;break;// F端口工作
case 11: POR TB=0XAA;break;// B端口工作
case 12: POR TC=0XAA;break; //C端口工作
case 13: POR TD=0XAA;break; //D端口工作
case 14: POR TE=0XAA;break; //E端口工作
case 15: POR TF=0XAA;break; //F端口工作
case 16: POR TB=0XFF;POR TC=0XFF;PORTD=0XFF;PORTE=0XFF;POR TF=0XFF;break; }
}
}。