当前位置:文档之家› 矩阵式键盘程序设计

矩阵式键盘程序设计

else
flag=0;
scan=(scan<<1)+1;
}
if(flag==0)
return -1;
else
return(rol*4+col);
P1=table[key]; //查表或字型编码送P1口,数码管显示闭合按键的编码
}
(3)矩阵式键盘扫描程序设计
unsigned char scan_key(void)//键盘扫描子程序
{
unsigned char n,scan,col,rol,tmp;
bit flag=0; //设有键按下标志位
scan=0xef;
矩阵式键盘程序设计
(1)定义字型码表和10ms延时程序设计。4X4矩阵键盘的16个键分别对应0~9、A~F十六个字符,由于数码管显示使用共阴极LED数码管,所以字型码采用共阴极字型码。定义字型码表和软件去抖的10ms延时程序如下:
#include <AT89X52.H>
/*定义0~9,A~F十六个字符的字型码表*/
unsigned char table[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
/*10ms延时程序*/
void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
(2)矩阵式键盘主程序设计。4X4矩阵键盘的各行接P0口的P0.0~P0.3,矩阵键盘的各列接P0口的P0.4~P0.7,P1口的P1.0~P1.7接数码管的各段。矩阵式键盘主程序如下:
void main()
{
char k=0;
P0=0x0f; //P0口低四位做输入口,先输出全1
for(n=0;n<4;n++) //循环扫描4列,从0列开始
{
P0=scan; //逐列送出低电平
tmp=~P0; //读行值,并取反
tmp=tmp&0x0f;
col=n; //保存列号到col
flag=1;
/*判断哪一行有键按下,并保存行号到rol*/
unsigned char tmp,key;
P1=0x00;
P0=0x0f; // P0口低四位做输入口,先输出全1
tmp=P0;
while(1)
{
while(tmp==0x0f) //循环判断是否有键按下
{
P0=0x0f; //所有列输出低电平
tmp=P0; //读行信号
}
delay10ms(); //延时10ms去抖
P0=0x0f; //所有列输出低电平
tmp=P0; //再次读键盘状态
if(tmp==0x0f) continue; //如果无键按下则认为是按键抖动,重新扫描键盘
key=scan_key( ); //有键按下,调用键盘扫描程序,并把键值送key
while(k!=-1)
{delay10ms();k=scan_key();}
if(tmp==0x01)
{ rol=0; break;} //第0行有键按下
else if(tmp==0x02)
{ rol=1; break;} //第1行有键按下
else if(tmp==0x04)
{ rol=2; break;} //第2行有键按下
else if(tmபைடு நூலகம்==0x08)
{ rol=3; break;} //第3行有键按下
相关主题