unsigned char code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段选码表
long value1,value2,result;
bit s;
int keyt;
int key1;
/*****************************************************
函数名称:getkey()
作用:扫描键盘并获得键值,利用反选法扫描键盘
*****************************************************/
void delay()
{
int i;
for(i=0;i<10;i++);
}
int getkey()
{ int key=0;
P3=0xfe;
P1=0xff;
while(P1!=0xff) //行扫描有低电平信号出现
{
switch(P1) //则在P1口全输出高电平的情况下进行列扫描
{
case 0xfe:key=7;break; //得出键值
case 0xfd:key=8;break;
case 0xfb:key=9;break;
case 0xf7:key=14;break;
}
}
if(key) return(key);
P3=0xfd;
P1=0xff;
while(P1!=0xff)
{
switch(P1)
{
case 0xfe:key=4;break;
case 0xfd:key=5;break;
case 0xfb:key=6;break;
case 0xf7:key=13;break;
}
}
if(key) return(key);
P3=0xfb;
P1=0xff;
while(P1!=0xff)
{
switch(P1)
{
case 0xfe:key=1;break;
case 0xfd:key=2;break;
case 0xfb:key=3;break;
case 0xf7:key=12;break;
}
}
if(key) return(key);
P3=0xf7;
P1=0xff;
while(P1!=0xff)
{
switch(P1)
{
case 0xfe:key=16;break;
case 0xfd:key=10;break;
case 0xfb:key=15;break;
case 0xf7:key=11;break;
}
}
return(key);
}
/****************************************************************
函数名称:display()
功能:动态显示任意999999以内的十进制整数,同时监测键盘
****************************************************************/
void display(long value)
{ int neg=0,tempkey=0; //neg代表是否为负值
int k[6]={0};
if(value<0) {value=-value;neg=1;}
k[5]=value/100000; //分解整数各位
k[4]=(value/10000)%10;
k[3]=(value/1000)%10;
k[2]=(value/100)%10;
k[1]=(value/10)%10;
k[0]=value%10;
while(1) //分别显示各位
{
if(value>=100000)
led3=tab[k[5]];
delay();
if(value>=10000)
led4=tab[k[4]];
delay();
if(value>=1000)
led5=tab[k[3]];
delay();
if(value>=100)
led6=tab[k[2]];
delay();
if(value>=10)
led7=tab[k[1]];
delay();
led8=tab[k[0]];
if(neg==1) led1=tab[10];
tempkey=getkey();
if(tempkey!=0) {key1=tempkey;break;} //有键按下,则退出循环向下执行
}
neg=0;
}
/***********************************************************
主函数:main()
功能:进行接收数据和命令,完成计算器计算流程
注:key=1~9分别表示按键数字1~8,key=10表示按键数字0,key=11~16
分别代表计算器功能键"+" "-" "*" "/" "=" "CE"(清零)
***********************************************************/
main()
{
key1=0;
//读入初值
reset1: s=0; //s代表是否有"上一次计算结果"
reset: value1=result=0;