在矩阵键盘上按一个按键,在一位共阳极数码管上显示对应的数字
#include<reg52.h>
unsigned char kayma();
unsigned char kayscan();
unsigned char disp(unsigned char );
void delay();//ms级别
unsigned char biaozhi=0;//用于标志
unsigned char m;//m用于接收键值
void Init_INT0(void); //外部中断0初始化和
unsigned char code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
// 显示数值表0-9
main(){
void Init_INT0();
while(1){
P1=0xf0;//赋值用于中断检测,高四位必须是全一
P0=0x40;
if(biaozhi==1){
biaozhi=0;//标志位清零,以便下次使用
m=kayma();
if(m!=0xff){
P0=duanma[m];
delay();
}
}
}
}
void Init_INT0(void)
{
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
}
void delay(){
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
unsigned char keyscan(){//反转扫描
unsigned char h,l;
P1=0xf0;
l=P1;
if(l!=0xf0){
delay();//延时去抖
if((P1&0xf)!=0xf0){//确有按键按下
l=P1&0xf0;//取出列值
P1=l|0x0f;
h=P1&0x0f;//取行值
while((P1&0x0f)!=0x0f);//等待松开并输出
return(l+h);
}
}return(0xff);
}
unsigned char keyma(){
switch(keyscan()){
case 0x77:return 0;break;
case 0x7e:return 1;break;
case 0xbe:return 2;break;
case 0xde:return 3;break;
case 0x7d:return 4;break;
case 0xbd:return 5;break;
case 0xdd:return 6;break;
case 0x7b:return 7;break;
case 0xbb:return 8;break;
case 0xdb:return 9;break;
default:return 0xff;break;
}
}
void ISR_INT0(void) interrupt 0
{
biaozhi=1; //表明按键有动作,可以进行按键扫描
}