2.png (29.92 KB, 下載次數: 96)
下載附件
2021-7-13 19:05 上傳
1. 一次只能計算兩數;
2. +,-,*,/分別對應P,-,H,d
3. 計算范圍[0,1000000)
4. 不支持負數運算
5. 小數只有兩位
6. 式子問題為ERROR
7. 溢出顯示OVER
單片機源程序如下:
- /*
- 請看計算器4.0的說明Word
- */
- #include <reg52.h>
- #define GPIO_DIG P0
- #define GPIO_KEY P1
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- uchar code smg[]=
- {
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,
- 0x77,0x7c,0x39,0x5e,0x79,0x71
- };
- long Value1,Value2,Value3;
- uchar a,b,c,x,minus,err,dian; //a是數字1的flag,b是數字2的flag,c是運算符的flag,x是運算符,minus是負號
- void count(uchar);
- void display(long);
- void Keyscan(void);
- void delay_ms(uint);
- void delay_ms(uint n) //n毫秒
- {
- uint i=0,j=0;
- for(i=0; i<n; i++)
- for(j=0; j<123; j++);
- }
- void Keyscan()
- {
- uchar KeyValue;
- GPIO_KEY=0xf0;
- if(GPIO_KEY!=0xf0)
- {
- delay_ms(10);
- if(GPIO_KEY!=0xf0)
- {
- switch(GPIO_KEY)
- {
- case 0x70:
- KeyValue=3;
- break;
- case 0xb0:
- KeyValue=2;
- break;
- case 0xd0:
- KeyValue=1;
- break;
- case 0xe0:
- KeyValue=0;
- break;
- }
- GPIO_KEY=0x0f;
- switch(GPIO_KEY)
- {
- case 0x0e:
- break;
- case 0x07:
- KeyValue+=12;
- break;
- case 0x0b:
- KeyValue+=8;
- break;
- case 0x0d:
- KeyValue+=4;
- break;
- }
- while(GPIO_KEY!=0x0f);
- if(KeyValue<10)
- {
- if(a<7) //數字1
- {
- Value1=Value1*10+KeyValue;
- b=7;
- if(Value1!=0)
- a++;
- }
- if(b<7) //數字2
- {
- Value2=Value2*10+KeyValue;
- c=0;
- if(Value2!=0)
- b++;
- }
- }
- else
- {
- a=7; //跳出數字1
- b=0; //準備進數字2
- c=1; //顯示運算符
- switch(KeyValue)
- {
- case 10:
- x=1;
- break; //add
- case 11:
- x=2;
- break; //reduce
- case 12:
- x=3;
- break; //multiply
- case 13:
- x=4;
- break; //divide
- case 14:
- b=7;
- c=0;
- count(x);
- x=5;
- break; //equal
- case 15:
- a=0;
- b=0;
- x=0;
- c=0;
- minus=0;
- err=0;
- dian=0;
- Value1=0;
- Value2=0;
- Value3=0;
- break; //Zero
- }
- }
- }
- }
- }
- void display(long Temp)
- {
- uchar wei[7],n;
- wei[0]=Temp%10; //個位
- wei[1]=Temp/10%10;
- wei[2]=Temp/100%10;
- wei[3]=Temp/1000%10;
- wei[4]=Temp/10000%10;
- wei[5]=Temp/100000%10;
- wei[6]=Temp/1000000%10; //第七位
- if(c==1) //顯示運算符
- {
- switch(Temp)
- {
- case 1:
- LSC=1;
- LSB=1;
- LSC=1;
- GPIO_DIG=0x73;
- break; //顯示P代表+
- case 2:
- LSC=1;
- LSB=1;
- LSC=1;
- GPIO_DIG=0X40;
- break; //顯示-代表-
- case 3:
- LSC=1;
- LSB=1;
- LSC=1;
- GPIO_DIG=0x76;
- break; //顯示H代表*
- case 4:
- LSC=1;
- LSB=1;
- LSC=1;
- GPIO_DIG=0X5e;
- break; //顯示d代表/
- }
- }
- else if(err==1)
- {
- for(n=0; n<5; n++) //error
- {
- switch(n)
- {
- case 0:
- LSC=1;
- LSB=1;
- LSA=1;
- GPIO_DIG=0x70;
- break;
- case 1:
- LSC=1;
- LSB=1;
- LSA=0;
- GPIO_DIG=0x3f;
- break;
- case 2:
- LSC=1;
- LSB=0;
- LSA=1;
- GPIO_DIG=0x70;
- break;
- case 3:
- LSC=1;
- LSB=0;
- LSA=0;
- GPIO_DIG=0x70;
- break;
- case 4:
- LSC=0;
- LSB=1;
- LSA=1;
- GPIO_DIG=0x79;
- break;
- }
- delay_ms(4);
- GPIO_DIG=0x00;
- }
- }
- else if(Temp>9999999) //over
- {
- for(n=0; n<4; n++)
- {
- switch(n)
- {
- case 0:
- LSC=1;
- LSB=1;
- LSA=1;
- GPIO_DIG=0x70;
- break;
- case 1:
- LSC=1;
- LSB=1;
- LSA=0;
- GPIO_DIG=0x7b;
- break;
- case 2:
- LSC=1;
- LSB=0;
- LSA=1;
- GPIO_DIG=0x3e;
- break;
- case 3:
- LSC=1;
- LSB=0;
- LSA=0;
- GPIO_DIG=0x3f;
- break;
- }
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- }
- else
- {
- if(minus==1)
- {
- GPIO_DIG=0x40;
- LSC=0;
- LSB=0;
- LSA=0;
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- if(Temp>999999) //第7位
- {
- LSC=0;
- LSB=0;
- LSA=1;
- GPIO_DIG=smg[wei[6]];
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- if(Temp>99999) //第6位
- {
- LSC=0;
- LSB=1;
- LSA=0;
- GPIO_DIG=smg[wei[5]];
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- if(Temp>9999) //第5位
- {
- LSC=0;
- LSB=1;
- LSA=1;
- GPIO_DIG=smg[wei[4]];
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- if(Temp>999) //第4位
- {
- LSC=1;
- LSB=0;
- LSA=0;
- GPIO_DIG=smg[wei[3]];
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- if(Temp>99||dian==2) //第3位
- {
- LSC=1;
- LSB=0;
- LSA=1;
- GPIO_DIG=smg[wei[2]];
- if(dian==2)
- GPIO_DIG=0x80;
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- if(Temp>9||dian==1) //第2位
- {
- LSC=1;
- LSB=1;
- LSA=0;
- GPIO_DIG=smg[wei[1]];
- if(dian==1)
- GPIO_DIG=0x80;
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- //第1位
- {
- LSC=1;
- LSB=1;
- LSA=1;
- GPIO_DIG=smg[wei[0]];
- delay_ms(2);
- GPIO_DIG=0x00;
- }
- }
- }
- void count(uchar x)
- {
- uchar XiaoShu[2];
- long YuShu;
- switch(x)
- {
- case 1:
- Value3=Value1+Value2;
- break;
- case 2:
- if(Value1>=Value2)
- Value3=Value1-Value2;
- else
- {
- minus=1;
- Value3=Value2-Value1;
- }
- break;
- case 3:
- Value3=Value1*Value2;
- break;
- case 4:
- if(Value2==0) //error
- err=1;
- else
- {
- YuShu=(Value1*100)/Value2;
- XiaoShu[0]=YuShu%10; //小數點后第2位
- XiaoShu[1]=YuShu/10%10; //小數點后第1位
- if(XiaoShu[0]!=0)
- {
- dian=2;
- Value3=(Value1*100)/Value2;
- }
- else if(XiaoShu[1]!=0)
- {
- dian=1;
- Value3=(Value1*10)/Value2;
- }
- else
- {
- dian=0;
- Value3=Value1/Value2;
- }
- }
- break;
- case 0:
- break;
- }
- }
- void main()
- {
- while(1)
- {
- Keyscan();
- if(x==0) //運算符判斷是否數字1跳出
- display(Value1);
- else if(0<x&&x<5) //進入數字2
- {
- if(c==1) //該顯示運算符flag
- display(x);
- else
- display(Value2);
- }
- else
- {
- if(err==1)
- display(err);
- else
- display(Value3);
- }
- }
- }
復制代碼
Keil工程文件51hei提供下載:
計算器4.0.7z
(35.6 KB, 下載次數: 13)
2021-7-13 16:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|