|
本帖最后由 了解@ 于 2020-12-9 00:28 編輯
計算器五位數以內+,-,*,/ 能識別優先級運算符
刪除一個數或一個運算符
lcd1602顯示
矩陣按鍵
程序proteus仿真原理圖:
1602.PNG (85.54 KB, 下載次數: 81)
下載附件
2020-12-8 22:50 上傳
仿真代碼:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P2^0;//指令0,數據1
- sbit rw=P2^1;//讀0,寫1,引腳
- sbit lcden=P2^2;//使能端
- uchar temp,num,flag,i,j,k,n,m,aa[10]={0},bb[11]={0};
- uint sum[20]={0},count;
- /**********************************************
- 延時函數 ms
- *********************************************/
- void delayms(uint t)
- {
- uint x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- /**********************************************
- 1602指令,數據,初始化
- *********************************************/
- void write_1602com(uchar com)
- {
- P0=com;
- rs=0;//指令
- rw=0;//寫
- lcden=0;
- delayms(20);
- lcden=1;
- delayms(20);
- lcden=0;
- }
- void write_1602date(uchar date)
- {
- P0=date;
- rs=1;//數據
- rw=0;//寫
- lcden=0;
- delayms(20);
- lcden=1;
- delayms(20);
- lcden=0;
- }
- void init_lcd1602()
- {
- write_1602com(0x38);//選擇16x2顯示,5x7點陣
- delayms(20);
- write_1602com(0x0f);//開顯示,開光標,光標閃爍
- delayms(20);
- write_1602com(0x06);//讀或寫后,指針加一,光標加一
- delayms(20);
- write_1602com(0x01);//清屏
- delayms(20);
- }
- /*****************************************
- 檢測按鍵并輸出
- ******************************************/
- uchar keyscan()
- {
- P3=0xfe;
- temp=P3;
- while(temp!=0xfe)
- {
- delayms(5);
- temp=P3;
- while(temp!=0xfe)
- {
- switch(temp)
- {
- case 0xee:num=7;
- break;
- case 0xde:num=8;
- break;
- case 0xbe:num=9;
- break;
- case 0x7e:num='/';
- break;
- }
- while(temp!=0xfe)
- {
- flag=1;
- temp=P3;
- }
- }
- }
- P3=0xfd;
- temp=P3;
- while(temp!=0xfd)
- {
- delayms(5);
- temp=P3;
- while(temp!=0xfd)
- {
- switch(temp)
- {
- case 0xed:num=4;
- break;
- case 0xdd:num=5;
- break;
- case 0xbd:num=6;
- break;
- case 0x7d:num='*';
- break;
- }
- while(temp!=0xfd)
- {
- flag=1;
- temp=P3;
- }
- }
- }
-
- P3=0xfb;
- temp=P3;
- while(temp!=0xfb)
- {
- delayms(5);
- temp=P3;
- while(temp!=0xfb)
- {
- switch(temp)
- {
- case 0xeb:num=1;
- break;
- case 0xdb:num=2;
- break;
- case 0xbb:num=3;
- break;
- case 0x7b:num='-';
- break;
- }
- while(temp!=0xfb)
- {
- flag=1;
- temp=P3;
- }
- }
- }
- P3=0xf7;
- temp=P3;
- while(temp!=0xf7)
- {
- delayms(5);
- temp=P3;
- while(temp!=0xf7)
- {
- switch(temp)
- {
- case 0xe7:num='c';
- break;
- case 0xd7:num=0;
- break;
- case 0xb7:num='=';
- break;
- case 0x77:num='+';
- break;
- }
- while(temp!=0xf7)
- {
- flag=1;
- temp=P3;
- }
- }
- }
- return num;
- }
- /*********************************************
- 將逐個輸入數 aa[] 轉化為整數
- *********************************************/
- void zuan_shu()
- {
- switch(n)
- {
- case 0:sum[j++]=0;break;
- case 1:sum[j++]=aa[0];break;
- case 2:sum[j++]=aa[0]*10+aa[1];break;
- case 3:sum[j++]=aa[0]*100+aa[1]*10+aa[2];break;
- case 4:sum[j++]=aa[0]*1000+aa[1]*100+aa[2]*10+aa[3];break;
- /* case 5:sum[j++]=aa[0]*10000+aa[1]*1000+aa[2]*100+aa[3]*10+aa[4];break;
- case 6:sum[j++]=aa[0]*100000+aa[1]*10000+aa[2]*1000+aa[3]*100+aa[4]*10+aa[5];break;
- case 7:sum[j++]=aa[0]*1000000+aa[1]*100000+aa[2]*10000+aa[3]*1000+aa[4]*100+aa[5]*10+aa[6];break;
- case 8:sum[j++]=aa[0]*10000000+aa[1]*1000000+aa[2]*100000+aa[3]*10000+aa[4]*1000+aa[5]*100+aa[6]*10+aa[7];break;
- */
- }
- }
- /****************************************************
- 液晶顯示函數
- ******************************************************/
- void lcd1602_display(uint count)
- {
- uchar a,b,c,d,e; //f,g,h;
- a=count%10;
- b=count/10%10;
- c=count/100%10;
- d=count/1000%10;
- e=count/10000%10;
- /* f=count/100000%10;
- g=count/1000000%10;
- h=count/10000000%10;
- write_date(0x30+h);
- write_date(0x30+g);
- write_date(0x30+f);
- */
- if(e!=0)
- write_1602date(0x30+e);
- if((e==0&&d!=0)||e!=0)
- write_1602date(0x30+d);
- if((e==0&&d==0&&c!=0)||e!=0||d!=0)
- write_1602date(0x30+c);
- if((e==0&&d==0&&c==0&&b!=0)||e!=0||d!=0||c!=0)
- write_1602date(0x30+b);
- write_1602date(0x30+a);
- }
- /*************************************************
- 運算結果函數并保存至 sum[k]
- **************************************************/
- void yunsuan()
- {
- uchar m;
- for(k=0;bb[k]!=0&&k<10;k++) //先找出高級運算符運算
- {
- if(bb[k]=='*')
- {
- sum[k+1]=sum[k]*sum[k+1];
- sum[k]='N';
- }
- if(bb[k]=='/')
- {
- sum[k+1]=sum[k]/sum[k+1];
- sum[k]='N';
- }
- }
- for(k=0;bb[k]!=0&&k<10;k++)
- {
- if(bb[k]=='+')
- {
- for(m=1;sum[k+m]=='N';)
- {
- m++;
- }
- sum[k+m]=sum[k]+sum[k+m];
- }
- if(bb[k]=='-')
- {
- for(m=1;sum[k+m]=='N';)
- {
- m++;
- }
- sum[k+m]=sum[k]-sum[k+m];
- }
- }
- }
- /*************************************************
- main函數
- ***************************************************/
- void main()
- {
- init_lcd1602();
- while(1)
- {
- flag=0;
- keyscan();
- if(flag!=0)
- {
- if(num>=0&&num<=9)
- {
- aa[i++]=num;
- write_1602date(0x30+num);
- n++;
- }
- if(num=='+')
- {
- write_1602date(0x20+11);//1602 '+'符
- bb[k++]=num;
- zuan_shu();
- for(i=0;i<n;i++)
- aa[i]=0;[/i][i]
- i=0;
- n=0;
- }
- if(num=='-')
- {
- write_1602date(0x20+13);//1602 '-'符
- bb[k++]=num;
- zuan_shu();
- for(i=0;i<n;i++)
- aa[i]=0;[/i][i]
- i=0;
- n=0;
- }
- if(num=='*')
- {
- write_1602date(0x20+10);//1602 '*'符
- bb[k++]=num;
- zuan_shu();
- for(i=0;i<n;i++)
- aa[i]=0;[/i][i]
- i=0;
- n=0;
- }
- if(num=='/')
- {
- write_1602date(0xf0+13);//1602 '/'符
- bb[k++]=num;
- zuan_shu();
- for(i=0;i<n;i++)
- aa[i]=0;[/i][i]
- i=0;
- n=0;
- }
- if(num=='c'&&m==0) //刪除一個數或一個運算符
- {
- write_1602com(0x04);//讀或寫后,指針減一,光標減一
- write_1602date(' ');//1602 空符
- write_1602com(0x06);//讀或寫后,指針加一,光標加一
- if(n!=0)
- {
- n--;
- aa[--i]=0;
- }
- else
- {
- bb[--k]=0;
- }
- }
- if(num=='=')
- {
- m=1;
- write_1602com(0xc0);
- write_1602date(0x30+13);//1602 '='符
- zuan_shu();
- yunsuan();
- count=sum[k];
- lcd1602_display(count);
- write_1602com(0x0c);
- }
- }
- }
- }
復制代碼
全部資料51hei下載地址:
計算器.zip
(128.74 KB, 下載次數: 70)
2020-12-8 23:10 上傳
點擊文件名下載附件
計算器 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|