目前实现功能:
1.末尾数置0
2.加减乘的五位数计算
3.计算结果溢出时,报错“ERROR”
4.有删除键
#include <REGX52.H>
int digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9数字数码管的段选
int zero[]={0xff,0xc0};//0xff即数码管全灭,用作末位置0
unsigned long box[5]={0};//计算器的个十百千万位
int i;
unsigned int KeyValue; //用于定义16个按键
unsigned int KeySwitch; //用于判断按下的是数字还是符号
int w; w=0; //用于判断计算器是否该置0
//延时函数
void delay(int ms)
{int x,y;for(x= ms;x>0;x--)for(y=110;y>0;y--);
}
//显示函数void display() { if (w==0) //w初值赋为0,只有检测到有按键被按下时才为1{P2=0x01; //将前四位全灭,第五位亮0P0=zero[0];delay(10);P2=0x02; P0=zero[0];delay(10); P2=0x04;P0=zero[0];delay(10);P2=0x08;P0=zero[0];delay(10);P2=0x10;P0=zero[1];delay(10);}//当有按键被按下后,w赋为1,开始显示box列表里的值,box列表中五个值初值都置0,通过按下数字0~9来往里赋值if (w!=0){P2=0x01; //万位P0=digit[box[4]]; delay(10); P2=0x02; //千位P0=digit[box[3]]; delay(10);P2=0x04; //百位P0=digit[box[2]]; delay(10);P2=0x08; //十位P0=digit[box[1]];delay(10);P2=0x10; //个位P0=digit[box[0]];delay(10); }}
//按键函数void KeyDown(void){ int n;n=0; P3=0x0f; //定义好初值if(P3!=0x0f) //检测是否有按键被按下,查找到被按下的键,并给w赋为1{delay(20);if(P3!=0x0f){ P3=0x0f; //先检测列switch(P3){case(0X07): KeyValue=0;w=1;break;///将十六个键与keycalue联系起来,通过case(0X0b): KeyValue=1;w=1;break;///keyvalue来定义每个键的意义case(0X0d): KeyValue=2;w=1;break;case(0X0e): KeyValue=3;w=1;break;}P3=0xf0;///检测行switch(P3){case(0Xe0): KeyValue=KeyValue;w=1;break;case(0Xd0): KeyValue=KeyValue+4;w=1;break;case(0Xb0): KeyValue=KeyValue+8;w=1;break;case(0X70): KeyValue=KeyValue+12;w=1;break;}if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9){KeySwitch=1;//用keyswitch来区分数字和符号,数字0-9时为状态1}while((n<50)&&(P3!=0xF0)) //检测按键是否松开{delay(100);n++;}}}}
//主函数
void main(){ unsigned long a,b,c;while(1){display(); //调用显示函数和按键函数 KeyDown();if(KeySwitch==1) //如果被按下的是数字键,往box里赋值{ for(i=4;i>0;i--) {box[i]=box[i-1];} //多个数字被按下时前面的数字左移box[0]=KeyValue; KeySwitch=0; //结束时将keyswitch置0 }
//回删减if(KeyValue==15) //按下删除键,显示屏最后一位数字被删除,其他数字依次右移一位 { for(i=0;i<4;i++) {box[i]=box[i+1];} //之前box里储存的数字依次取代右一位box[4]=0; //全部取代完后,首个数字置0KeyValue=16; //随便将KeyValue赋个新值,不然主程序一直运行进来将所有数置0}
//清0键if(KeyValue==10) //计算器清零键,box里所有储存的值清0,并且w置0,计算器末位为0 { for(i=0;i<5;i++)box[i]=0; w=0;display(); }
//加法else if(KeyValue==12) {a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;//个十百千万存储到a delay(10);for(i=0;i<5;i++)box[i]=0; //清空box,以便后续存储加数while(1) {display();KeyDown(); if(KeySwitch==1) //输入加数{ for(i=4;i>0;i--){box[i]=box[i-1];}box[0]=KeyValue;KeySwitch=0;}//当按下加法键以后,程序进入加法死循环中,不按等号出不去,想用删除就要重新把删除段代码添加进来,减法,除法一样。 if(KeyValue==15) { for(i=0;i<4;i++){box[i]=box[i+1];}box[4]=0;KeyValue=16;}if(KeyValue==11) break; }b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000; //加数存储到b delay(10);c=a+b; //被加数与加数相加box[0]=c%10; //结果取余计算,返回到box中,个位数直接除10取余box[1]=c/10%10; //十位先除十,再除十取余box[2]=c/100%10;box[3]=c/1000%10;box[4]=c/10000%10;delay(10);display(); //显示结果 后续减法乘法除法过程雷同}//减法else if(KeyValue==13) {a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;for(i=0;i<5;i++)box[i]=0;delay(100);while(1){ display();KeyDown();if(KeySwitch==1){ for(i=4;i>0;i--){box[i]=box[i-1];}box[0]=KeyValue;KeySwitch=0;}if(KeyValue==15) { for(i=0;i<4;i++){box[i]=box[i+1];}box[4]=0;KeyValue=16;}if(KeyValue==11) break;}b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000; delay(100);c=a-b;box[0]=c%10; box[1]=c/10%10;box[2]=c/100%10;box[3]=c/1000%10;box[4]=c/10000%10;delay(100);display();}//乘法else if(KeyValue==14) {a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;for(i=0;i<5;i++)box[i]=0;delay(100); while(1){ display();KeyDown();if(KeySwitch==1){ for(i=4;i>0;i--){box[i]=box[i-1];}box[0]=KeyValue;KeySwitch=0;}if(KeyValue==15) { for(i=0;i<4;i++){box[i]=box[i+1];}box[4]=0;KeyValue=16;}if(KeyValue==11) break;}b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000;delay(100); c=a*b;box[0]=c%10; box[1]=c/10%10;box[2]=c/100%10;box[3]=c/1000%10;box[4]=c/10000%10;delay(100);display();}}}