8位显示 51单片机 键盘
#include
#define uchar unsigned char
unsigned char disdata[8];
uchar op=12;//按键位置
long a=0;//运算结果
bit flag=0;//上一次是数字键
uchar code dispcode[]={ 0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xff
};
unsigned char code dispbitcode[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
uchar disdata[]={16,16,16,16,16,16,16,16};
void init()//初始化
{ uchar op=12; a=0;
P0=0xff;P2=0xff;
}
uchar inkey() ///键定义
{
uchar i,j=1,k;//J=1表示00000001;
uchar code keytab[16]={0x81,0x41,0x21,0x11,
0x82,0x42,0x22,0x12,0x84,0x44,0x24,0x14,0x88,0x48,0x28,0x18};
for(i=0;i<4;i++)
{ P1=~j; k=~P1; k=k&0xf0; if(k!=0)break; j=j<<1;}
k=k+j;
for(i=0;i<16;i++)
if(keytab[i]==k)
break;
return i;
}
long disp2long()//把输入的数字转换为逻辑运算的数字
{
uchar i;long b=0;
for(i=0;i<8;i++)
{ b=b*10+disdata[i];}
return b;
}
void long2disp(long x)//把逻辑运算得到的数字转换为显示数组
{
uchar i;
for(i=8;i>0;i--)
{ disdata[i-1]=x%10;x=x/10;}
}
void keyaction(uchar x) //运算处理
{ uchar i,c;
uchar code err[]={0,0,0,10,11,11,12,11};
if(x<10)//本次是数字键
{if(flag==0) //上一次是数字键
{ for(i=0;i<7;i++)
disdata[i]=disdata[i+1];
disdata[7]=x;//显示本位
}
else//上一次是运算符
{for(i=0;i<7;i++) disdata[i]=0;disdata[7]=x;}
flag=0;
}
else//本次是运算键
{
if(flag==0)//上一次是数字键 则计算
{
switch(op)
{case 10: a=0;break;
case 11:break;
case 12:a=a+disp2long();break;
case 13:a=a-disp2long();break;
case 14:a=a*disp2long();break;
case 15:a=a/disp2long();break;
}
if((a>200000)||(a<-200000) )
{ for(i=0;i<8;i++) disdata[i]=err[i]; }
else
{ if(a<0&&a>-200000)//如果计算结果为负,则添加负号
{ c=0-a;long2disp(c);disdata[0]=0x0d;}
else long2disp(a);
}
}
flag=1;op=x; //前面是符号则覆盖
}
}
void main() //主程序
{
uchar key;
init();
TMOD=0x01;EA=1;ET0=1;
TR0=1;
while(1)
{
key=inkey();
if(key!=16)
{keyaction(key);break;}
}
}
void t0(void) interrupt 1
{uchar i;
TH0=(65536-5000) / 256;
TL0=(65536-5000) % 256;
P0=dispcode[disdata[i]];
P2=dispbitcode[i];
i++;
if(i=8)
i=0;
}