#include <reg52.h>
unsigned char code ledchar[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,//0-9
0x77,0x7C,0x39,0x5E,0x79,0x71 } ; //a-f
unsigned char keycode[4][4] = {{ 0x31, 0x32, 0x33, 0x26 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵
{ 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵
{ 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵
{ 0x30, 0x1B, 0x0D, 0x27 }} ; //數(shù)字鍵 0、 ESC 鍵、 回車鍵、 向右鍵}
unsigned char keysta[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char ledbuf[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
sbit keyout1 = P2^7;
sbit keyout2 = P2^6;
sbit keyout3 = P2^5;
sbit keyout4 = P2^4;
sbit keyin1 = P2^3;
sbit keyin2 = P2^2;
sbit keyin3 = P2^1;
sbit keyin4 = P2^0;
sbit ADDRA = P1^0;
sbit ADDRB = P1^1;
sbit ADDRC = P1^2;
void Timer0Init(void);
void keyscan();
void keyaction(unsigned char keycode);
void keydriver();
void shownum(unsigned long num);
void main()
{
EA = 1;
Timer0Init();
ET0 = 1;
TR0 = 1;
ledbuf[0] = ledchar[0];
while(1)
{
keydriver();
}
}
void keyscan()
{
static unsigned char keybuf[4][4] = {{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
static unsigned char keyout = 0;
unsigned char i;
keybuf[keyout][0] = (keybuf[keyout][0] << 1) | keyin1;
keybuf[keyout][1] = (keybuf[keyout][1] << 1) | keyin2;
keybuf[keyout][2] = (keybuf[keyout][2] << 1) | keyin3;
keybuf[keyout][3] = (keybuf[keyout][3] << 1) | keyin4;
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++;
keyout &= 0x03;
switch(keyout)
{
case 0: keyout4 = 1; keyout1 = 0; break;
case 1: keyout1 = 1; keyout2 = 0; break;
case 2: keyout2 = 1; keyout3 = 0; break;
case 3: keyout3 = 1; keyout4 = 0; break;
default: break;
}
}
void keydriver()
{
static unsigned char keyback[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char i;
unsigned char j;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 4;j++)
{
if(keyback[i][j] != keysta[i][j])
{
if(keyback[i][j] != 0)
{
keyaction(keycode[i][j]);
}
keyback[i][j] = keysta[i][j];
}
}
}
}
void shownum(unsigned long num)
{
unsigned char buf[6];
signed char i = 0;
for(i = 0;i < 6; i++)
{
buf[i] = num % 10;
num /= 10;
}
for(i = 5;i >= 1;i--)
{
if(buf[i] == 0)
{
ledbuf[i] = 0x00;
}
else
{
break;
}
}
for(;i >= 0;i--)
{
ledbuf[i] = ledchar[buf[i]];
}
}
void ledscan()
{
static unsigned char i = 0;
P0 = 0x00;
switch (i)
{
case 0: ADDRC=0; ADDRB=0; ADDRA=0; i++; P0=ledbuf[5]; break;
case 1: ADDRC=0; ADDRB=0; ADDRA=1; i++; P0=ledbuf[4]; break;
case 2: ADDRC=0; ADDRB=1; ADDRA=0; i++; P0=ledbuf[3]; break;
case 3: ADDRC=0; ADDRB=1; ADDRA=1; i++; P0=ledbuf[2]; break;
case 4: ADDRC=1; ADDRB=0; ADDRA=0; i++; P0=ledbuf[1]; break;
case 5: ADDRC=1; ADDRB=0; ADDRA=1; i=0; P0=ledbuf[0]; break;
default: break;
}
}
void keyaction(unsigned char keycode)
{
static unsigned long add = 0;
static unsigned long result = 0;
if((keycode >= 0x30) && (keycode <= 0x39))
{
add = (keycode - 0x30) + (add*10);
shownum(add);
}
else if(keycode == 0x26)
{
result = result + add;
add = 0;
shownum(result);
}
else if(keycode == 0x0D)
{
result = result + add;
add = 0;
shownum(result);
}
else if(keycode == 0x1B )
{
result = 0;
add = 0;
shownum(add);
}
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0;
TL0 = 0x66;
TH0 = 0xFC;
}
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x66;
keyscan();
ledscan();
}
根據(jù)51論壇上的教程寫的簡易加法計算器,現(xiàn)在出現(xiàn)按鍵按下后數(shù)碼管顯示要延時很久才出現(xiàn),想了好久,沒明白究竟為什么?求教大神了。
|