一、主要功能
按键消抖控制按键矩阵显示数码管数字
二、代码实现
#include <reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
sbit KEY1OUT=P2^7;
sbit KEY2OUT=P2^6;
sbit KEY3OUT=P2^5;
sbit KEY4OUT=P2^4;
sbit KEY1IN=P2^3;
sbit KEY2IN=P2^2;
sbit KEY3IN=P2^1;
sbit KEY4IN=P2^0;
unsigned char code LEDchar[]={
0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
unsigned char KEYSTATE[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
void main()
{
unsigned char i,j;
unsigned char backup[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};
TMOD=0X01;
ET0=1;
TR0=1;
EA=1;
ENLED=0;
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
P2=0XF7;
TH0=0X01;
TL0=0XFC;
P0=LEDchar[0];
while(1)
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if (backup[i][j] !=KEYSTATE[i][j])
{
if(backup[i][j]==0)
{
P0=LEDchar[i*4+j];
}
backup[i][j] =KEYSTATE[i][j];
}
}
}
}
}
void interupttime0()interrupt 1
{
static unsigned char keyout=0;
unsigned char i;
static unsigned char KEYbuff[4][4]={{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}};
TH0=0XFC;
TL0=0X67;
KEYbuff[keyout][0]=(KEYbuff[keyout][0]<<1) | KEY1IN;
KEYbuff[keyout][1]=(KEYbuff[keyout][1]<<1) | KEY2IN;
KEYbuff[keyout][2]=(KEYbuff[keyout][2]<<1) | KEY3IN;
KEYbuff[keyout][3]=(KEYbuff[keyout][3]<<1) | KEY4IN;
for(i=0;i<4;i++)
{
if((KEYbuff[keyout][i] & 0X0F==0x00))
{
KEYSTATE[keyout][i]=0;
}
else if((KEYbuff[keyout][i] & 0X0F==0xFF))
{
KEYSTATE[keyout][i]=1;
}
}
keyout++;
keyout=keyout&0x03;
switch(keyout)
{
case 0:KEY4OUT=1;KEY1OUT=0;break;
case 1:KEY1OUT=1;KEY2OUT=0;break;
case 2:KEY2OUT=1;KEY3OUT=0;break;
case 3:KEY3OUT=1;KEY4OUT=0;break;
default:break;
}
}