📄 矩阵键盘扫描程序.c
字号:
//MCU:AT89S51
//晶振:12M
#include"AT89X51.H"
unsigned char code numcode[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF
};//数字0~9及ABCDEF共阳数码管代码
unsigned char code charcode[]={0xc0,0xc7,0xc7,0x86,0x89};
// HELLO 字样共阳数码管代码
unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //数码管位选代码
unsigned char dispbuf[8]={16,16,16,0,1,2,3,4};
unsigned char disp_bit_count;
unsigned char disp_count;
unsigned char temp;
unsigned char key;
unsigned char i,j;
/********1ms延时子程序***********/
delay_nms(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=0;i<n;i++)
for(j=0;j<120;j++)
; //空操作
}
unsigned char keyscan(void)
{
P2=0xff;
P2_4=0;
temp=P2;
temp=temp&0x0f;
if (temp!=0x0f)
{
delay_nms(10);
temp=P2;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
temp=P2;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
}
}
}
P2=0xff;
P2_5=0;
temp=P2;
temp=temp&0x0f;
if (temp!=0x0f)
{
delay_nms(10);
temp=P2;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=11;
break;
}
temp=P2;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
}
}
}
P2=0xff;
P2_6=0;
temp=P2;
temp=temp&0x0f;
if (temp!=0x0f)
{
delay_nms(10);
temp=P2;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
temp=P2;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp&0x0f;
}
}
}
P2=0xff;
P2_7=0;
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay_nms(10);
temp=P2;
temp=temp&0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P2;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
}
}
}
return (key);
}
void main(void)
{
TMOD=0x02; //使用定时器0,选择方式2(常数自动重装的8位定时器)
TH0=0x06; //保存数值,用于自动重装
TL0=0x06; //定时250uS初值
TR0=1; //开定时器0
ET0=1; //开定时器0溢出中断
EA=1; //开总中断
while(1)
{
dispbuf[0]=keyscan();
}
}
/**********T0250uS中断服务程序***************/
void t0(void) interrupt 1 using 0
{
disp_count++;
if(disp_count==8)
{
disp_count=0;
if(disp_bit_count>=3)
P0=charcode[dispbuf[disp_bit_count]];
else
P0=numcode[dispbuf[disp_bit_count]];
P1=bitcode[disp_bit_count];
disp_count=0;
disp_bit_count++;
if(disp_bit_count==8)
{
disp_bit_count=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -