单片机学习:中断式矩阵键盘(转载)
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管
uchar code key_tab[]={0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};//矩阵键盘编码
sbit bell=P3^4;//bell
uchar my_key;
uchar oldkey;
void Display(uchar);
void Key_scan(void);
void main()//main
{
EA=1;
EX0=1;
IT0=1;
P0=0xf0; //~
while(1)
{
Display(my_key);
}
}
void key_down() interrupt 0//外部中断0有键按下,启动定时计数器
{
EX0=0;// close
TMOD&=0xf1;
TH0=0x2e;
TL0=0x00;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TR0=0;
Key_scan();
}
void Key_scan(void)
{
uchar i,j,key;
j=0xfe;
key=0xff;
for(i=0;i<4;i++)//循环4次
{
P0=j;
if((P0&0xf0)!=0xf0)//有键按下
{
key=P0;
break;
}
j=_crol_(j,1);
}
if(key==0xff)
{
oldkey=0xff;
P0=0xf0;
EX0=1;
bell=1;
return ;
}
bell=0;
if(oldkey==key)
{
TH0=0X2E;
TL0=0;
TR0=1;
return ;
}
TH0=0x2e;
TL0=0X00;
TR0=1;
oldkey=key;
for(i=0;i<17;i++)
{
if(key==key_tab[i])
{
my_key=i;
break;
}
}
}
void Display(uchar num)
{
P2=0;
P1&=0xf8;
P2=tab[num];
}