#include <STC89C5xRC.H>
unsigned char KeySta[3][4] = { {1,1,1,1},
{1,1,1,1},
{1,1,1,1}
};
unsigned char code LedChar[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,0x3f,0x77,0x7C,0x39,0x5E,0x79,0x71};
void main()
{
unsigned char backup[3][4] = { {1,1,1,1},
{1,1,1,1},
{1,1,1,1}
};
unsigned char i,j;
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值,1毫秒@12.000MHz
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
while(1)
{
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(backup[i][j] != KeySta[i][j])
{
if(backup[i][j] == 0)
{
P3 = LedChar[(i*4+j)];
}
backup[i][j] = KeySta[i][j];
}
}
}
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char keyout = 0;
unsigned char i = 0;
static unsigned char keybuf[3][4] = { {0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF}
};
TL0 = 0x18;
TH0 = 0xFC;
keybuf[keyout][0] = (keybuf[keyout][0]<<1) | P04;
keybuf[keyout][1] = (keybuf[keyout][1]<<1) | P05;
keybuf[keyout][2] = (keybuf[keyout][2]<<1) | P06;
keybuf[keyout][3] = (keybuf[keyout][3]<<1) | P07;
for(i=0;i<4;i++)
{
if((keybuf[keyout][i] & 0x0F) == 0x00)
{
KeySta[keyout][i] = 0;
}
else if((keybuf[keyout][i] & 0x0F) == 0x0F)
{
KeySta[keyout][i] = 1;
}
}
keyout++;
if(keyout>=3)
{
keyout = 0;
}
switch(keyout)
{
case 0: P03=1;P01=0; break;
case 1: P01=1;P02=0; break;
case 2: P02=1;P03=0; break;
default: break;
}
}