C51矩阵键盘
在一个4乘4的矩阵键盘中,本人的基本识别程序。。。(P1口低四位对应键盘行线,高四位对应键盘列线,P2口为6个动态LED数码管)
#i nclude<AT89X51.h>
#i nclude<intrins.h>
void delay(unsigned int i);
const unsigned char leddigit[12]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,
0x20,0x60,0xff,0xdf}; /* 字符 0-9 编码,0xff为关显示,0xdf为小数点 */
#define disp(a,b) P2=~(1<<(a));P0=leddigit[b]
#define uchar unsigned char
#define uint unsigned int
void key()
{
uchar k;
P1 = 0xf0;//低位置○,准备查询按键
k = P1;//取得当前P1口的状态
if(k != 0xf0)
{//如果有变化则表示有键按下
k = 0xfe;
do{//循环扫描每一行
P1 = k;
if(k != P1)
{
switch(P1)
{
//第一行
case 0x77:{disp(1,1);break;}
case 0xb7:{disp(1,2);break;}
case 0xd7:{disp(1,3);break;}
case 0xe7:{disp(1,4);break;}
//第二行
case 0x7b:{disp(1,5);break;}
case 0xbb:{disp(1,6);break;}
case 0xdb:{disp(1,7);break;}
case 0xeb:{disp(1,8);break;}
//第三行
case 0x7d:{disp(1,9);break;}
case 0xbd:{disp(1,10);break;}
case 0xdd:{disp(1,11);break;}
case 0xed:{disp(4,11);break;}
//第四行
case 0x7e:{disp(2,1);break;}
case 0xbe:{disp(2,2);break;}
case 0xde:{disp(3,3);break;}
case 0xee:{disp(4,4);break;}
}
}
k = _crol_(k,1);//移位,进入下一行扫描
}while(k !=0xef);//超过范围退出
}
}
main()
{
while(1)
{
key();
}
}