#include<reg52.h>
sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit kout1=P2^4;
sbit kout2=P2^5;
sbit kout3=P2^6;
sbit kout4=P2^7;
unsigned char ledchar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned char ledbuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char keycodeMap[4][4]={
{0x31,0x32,0x33,0x26}, //êy×Ö¼ü1£»êy×Ö¼ü2£»êy×Ö¼ü3£»ÏòéÏ ¼ó
{0x34,0x35,0x36,0x25}, //êy×Ö¼ü4£»êy×Ö¼ü5£»êy×Ö¼ü6£»Ïò×ó ¼õ
{0x37,0x38,0x39,0x28}, //êy×Ö¼ü7£»êy×Ö¼ü8£»êy×Ö¼ü9£»ÏòÏ 3Ë
{0x30,0x1B,0x0D,0x27} //êy×Ö¼ü0£»ESC¼ü£»»Ø3μ¼ü£» Ïòóò 3y
};
void keydrive();
void keyaction(unsigned char keycode);
void shownumber(unsigned long num);
void main ()
{
ENLED=0;
EA=1;
TMOD=0x01;
TH0=0xFE;
TL0=0xEF;
TR0=1; //′ò¿a¶¨ê±Æ÷
ET0=1; //′ò¿aÖD¶Ï
ledbuff[0]=ledchar[0];
while(1)
{
keydrive();
}
}
void shownumber(unsigned long num)
{
unsigned char buf[6];
signed int i;
for(i=0;i<6;i++)
{
buf[i]=num%10;
num=num/10;
}
for(i=5;i>=1;i--)
{
if(buf[i]==0)
{
ledbuff[i]=0xFF;
}
else
break;
}
for(;i>=0;i--)
{
ledbuff[i]=ledchar[buf[i]];
}
}
void keyaction(unsigned char keycode)
{
static signed long result=0;
static signed long addend=0;
static unsigned char i=0;//óÃóúÅD¶ÏoÎÖÖÔËËã
if((keycode>=0x30)&&(keycode<=0x39))//êäèëêy×Ö
{
addend=(addend*10)+(keycode-0x30);
shownumber(addend);
}
else if(keycode==0x26)//¼ó·¨¼ü
{ i=1;
result+=addend;
addend=0;
shownumber(addend);
}
else if(keycode==0x25)//¼õ·¨¼ü
{ i=2;
result-=addend;
addend=0;
shownumber(addend);
}
else if(keycode==0x28)//3Ë·¨¼ü
{ i=3;
if(result==0) //Ôú½øDDá¬DøÔËËãê±ÅD¶ÏÔËËãDÎê½
{result=addend; //èç1ûresult£¡=0£¬3D½óéÏ′ÎÔËËã½á1û
addend=0;
shownumber(addend);
}
else
{shownumber(addend);}
}
else if(keycode==0x27)//3y·¨¼ü
{ i=4;
if(result==0) //Ôú½øDDá¬DøÔËËãê±ÅD¶ÏÔËËãDÎê½
{ result=addend; //í¬éÏ
addend=0;
shownumber(addend);
}
else
{shownumber(addend);}
}
else if(keycode==0x0D)//»Ø3μ¼ü
{ switch(i)
{
case 1: result+=addend;addend=0;shownumber(result);break;
case 2: result-=addend;addend=0;shownumber(result);break;
case 3: result*=addend;addend=0;shownumber(result);break;
case 4: result/=addend;addend=0;shownumber(result);break;
default:break;
}
}
else if(keycode==0x1B)//ESC¼ü
{
addend=0;
result=0;
shownumber(result);
}
}
void keydrive()
{
unsigned int i,j; //iêÇDD£¬jêÇáD
static unsigned char backup[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keysta[i][j]!=backup[i][j])
{
if(backup[i][j]==0)
{
keyaction(keycodeMap[i][j]);
}
backup[i][j]=keysta[i][j];
}
}
}
}
void ledscan()
{
static unsigned int i=0;
P0=0xFF;
if(i==0)
{P20=121=022=1;i++0=ledbuff[0];}
else if(i==1)
{P20=021=022=1;i++0=ledbuff[1];}
else if(i==2)
{P20=121=122=0;i++0=ledbuff[2];}
else if(i==3)
{P20=021=1;P22=0;i++;P0=ledbuff[3];}
else if(i==4)
{P20=1;P21=0;P22=0;i++;P0=ledbuff[4];}
else if(i==5)
{P20=0;P21=0;P22=0;i=0;P0=ledbuff[5];}
}
void keyscan()
{
static unsigned int a=0;
static unsigned char keyout=0;
unsigned char i=0;
static unsigned char keybuf[4][4]={
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF
};
P20=1;P21=1;P22=1;P23=1;
keybuf[keyout][0]=(keybuf[keyout][0]<<1)|P20;
keybuf[keyout][1]=(keybuf[keyout][1]<<1)|P21;
keybuf[keyout][2]=(keybuf[keyout][2]<<1)|P22;
keybuf[keyout][3]=(keybuf[keyout][3]<<1)|P23;
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;
}
else{}
}
keyout++;
if(keyout>=4)
{
keyout=0;
}
// keyout=keyout&0x03;
switch(keyout)
{
case 0:kout1=1;kout2=1;kout3=1;kout4=0;break;
case 1:kout1=1;kout2=1;kout3=0;kout4=1;break;
case 2:kout1=1;kout2=0;kout3=1;kout4=1;break;
case 3:kout1=0;kout2=1;kout3=1;kout4=1;break;
default :break;
}
//P20=0;P21=0;P22=0;
P0=0xFF;
if(a==0)
{P20=1;P21=0;P22=1;a++;P0=ledbuff[0];}
else if(a==1)
{P20=0;P21=0;P22=1;a++;P0=ledbuff[1];}
else if(a==2)
{P20=1;P21=1;P22=0;a++;P0=ledbuff[2];}
else if(a==3)
{P20=0;P21=1;P22=0;a++;P0=ledbuff[3];}
else if(a==4)
{P20=1;P21=0;P22=0;a++;P0=ledbuff[4];}
else if(a==5)
{P20=0;P21=0;P22=0;a=0;P0=ledbuff[5];}
}
void interruptTime() interrupt 1
{
TH0=0xFE;
TL0=0xEF;
ledscan();
keyscan();
}
|