由于单片机上引脚P202122有重复使用
所以对他们的赋值会改变;
#include <reg52.h>
sbit ADDR2 = P2^2;
sbit ADDR1 = P2^1;
sbit ADDR0 = P2^0;
sbit ENLED = P1^1;
sbit KOUT4 = P2^7;
sbit KOUT3 = P2^6;
sbit KOUT2 = P2^5;
sbit KOUT1 = P2^4;
sbit KEY4 = P2^3;
unsigned char keysta[4][4] = {
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned int ledchar[]={
0xC6,0xA1,0x86,0x8E,0x80,0x90,0x88,0x83,
0x99,0x92,0x82,0xF8,0xC0,0xF9,0xA4,0xB0,
};
void main()
{
unsigned char backup[4][4] = {
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char i,j;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 1;
KEY4 = 1;
EA = 1;
TMOD = 0x01;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
TR0=1;
ET0=1;
P0 = ledchar[0];
while(1)
{
ENLED = 0;
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(backup [j] != keysta [j])
{
if(backup [j] == 0)
{
P0 = ledchar[i*4+j];
}
backup [j] = keysta [j];
}
}
}
}
}
void InterruptTime() interrupt 1
{
static unsigned char KOUT = 0;
unsigned char i = 0;
static unsigned char keybuff[4] [4] = {
{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF}
};
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 1;
KEY4 = 1;
TL0 = 0x18;
TH0 = 0xFC;
keybuff[KOUT] [0] = (keybuff[KOUT] [0] <<1) |ADDR0;
keybuff[KOUT] [1] = (keybuff[KOUT] [1] <<1) |ADDR1;
keybuff[KOUT] [2] = (keybuff[KOUT] [2] <<1) |ADDR2;
keybuff[KOUT] [3] = (keybuff[KOUT] [3] <<1) |KEY4;
for(i=0;i<4;i++)
{
if((keybuff[KOUT] &0x0F)==0x00)
{keysta[KOUT] = 0;}
else if((keybuff[KOUT] &0x0F)==0x0F)
{keysta[KOUT] = 1;}
}
KOUT++;
if(KOUT>=4)
{
KOUT=0;
}
switch(KOUT)
{
case 0:KOUT4=1;KOUT3=1;KOUT2=1;KOUT1=0;break;
case 1:KOUT4=1;KOUT3=1;KOUT2=0;KOUT1=1;break;
case 2:KOUT4=1;KOUT3=0;KOUT2=1;KOUT1=1;break;
case 3:KOUT4=0;KOUT3=1;KOUT2=1;KOUT1=1;break;
default : break;
}
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1;
}
|