|
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcden=P2^1; //定義E口
- sbit lcdrs=P2^0; //定義RS口
- sbit beep=P2^2; //定義蜂鳴器
- uchar code table[]={'0','1','2','3','4','5','6', //創建鍵位數組,數字,運算符號,等于號,清零(小數點)
- '7','8','9','+','-','*','/','=','.'};
- uchar key,flag1,js,k1,k2;
- uchar a[20],b[20];
- float jieguo=0;
- void delay(uchar z) //延遲函數
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_cmd(uchar cmd) //寫命令函數
- {
- lcdrs=0;
- P1=cmd;
- delay(5);
- lcden=1;
- delay(4);
- lcden=0;
- }
- void write_data(uchar date) //寫數據函數
- {
- lcdrs=1;
- P1=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init() //LCD初始化函數
- {
- lcden=0;
- write_cmd(0x38); //設置16x2顯示,8位數據接口
- write_cmd(0x0c); //設置開顯示,不顯示光標(關顯示是0x08)
- write_cmd(0x06); //寫一個字符后地址指針加1
- write_cmd(0x01); //清屏
- }
- void keyscan()
- {
- uchar temp,uu=0xf7;
- uint i;
- for(i=0;i<4;i++)
- {
- uu=_crol_(uu,1); //左移
- P3=uu;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delay(10);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee:key=1;beep=0;delay(200);beep=1;break; //延遲200響聲
- case 0xde:key=2;beep=0;delay(200);beep=1;break;
- case 0xbe:key=3;beep=0;delay(200);beep=1;break;
- case 0x7e:key=10;beep=0;delay(200);beep=1;break;
- case 0xed:key=4;beep=0;delay(200);beep=1;break;
- case 0xdd:key=5;beep=0;delay(200);beep=1;break;
- case 0xbd:key=6;beep=0;delay(200);beep=1;break;
- case 0x7d:key=11;beep=0;delay(200);beep=1;break;
- case 0xeb:key=7;beep=0;delay(200);beep=1;break;
- case 0xdb:key=8;beep=0;delay(200);beep=1;break;
- case 0xbb:key=9;beep=0;delay(200);beep=1;break;
- case 0x7b:key=12;beep=0;delay(200);beep=1;break;
- case 0xe7:key=0;beep=0;delay(200);beep=1;break;
- case 0xd7:key=15;beep=0;delay(200);beep=1;
- beep=0;delay(200);beep=1;beep=0;delay(200);beep=1;break; //清零長響聲
- case 0xb7:key=13;beep=0;delay(200);beep=1;break;
- case 0x77:key=14;beep=0;delay(180);beep=1;delay(100);
- beep=0;delay(180);beep=1;break; //等于按鍵兩聲短響,中間較短間隔
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- flag1=1;
- }
- }
- }
- }
- void jscl() //計算顯示函數
- {
- uchar i,j,n;
- float s,temp2;
- long int s1,s2,a1,b1,c1,temp1;
- a1=1;
- b1=1;
- s1=0;
- s2=0;
- s=0;
- if(k2!=0)
- {
- for(j=0;j<k1+1;j++) //存放第一操作數
- {
- for(i=0;i<k1-j;i++)
- a1=a1*10;
- s1=s1+a[j]*a1;
- a1=1;
- }
- for(j=k1+1;j<k2+1;j++) //存放第二操作數
- {
- for(i=0;i<k2-j;i++)
- b1=b1*10;
- s2=s2+a[j]*b1;
- b1=1;
- }
- if(js==10) //判斷運算符號
- {
- s=s1+s2;
- }
- if(js==11)
- {
- s=s1-s2;
- }
- if(js==12)
- {
- s=s1*s2;
- }
- if(js==13)
- {
- s=(s1*0.1)/(s2*0.1);
- }
- jieguo=s;
- }
- else
- s=jieguo;
- if(jieguo>9999||s>=9999)
- {
- write_data('E');
- }
- else //運算結果小數的處理
- {
- c1=(long int)(s*1000)%10;
- if(c1>=5)
- s=s+0.01;
- temp1=(long int)(s);
- temp2=s-temp1;
- n=0;
- while(temp1)
- {
- b[n]=temp1%10;
- temp1=temp1/10;
- n++;
- }
- b[n]=temp2*10;
- b[n+1]=(uchar)(temp2*100)%10;
- for(i=n;i>0;i--)
- {
- write_data(table[b[i-1]]);
- }
- if(jieguo<1)
- {
- write_data(table[0]);
- write_data(table[15]);
- write_data(table[b[n]]);
- write_data(table[b[n+1]]);
- }
- else
- {
- write_data(table[15]);
- write_data(table[b[n]]);
- write_data(table[b[n+1]]);
- }
- }
- }
- void main()
- {
- uchar i,j;
- init();
- write_cmd(0x80); //將液晶指針定位在第一行第一個單元
- key=15;
- i=0;
- flag1=0;
- while(1)
- {
- keyscan();
- if(flag1==1)
- {
- if(key==15) //判斷為清零操作
- {
- write_cmd(0x01);
- i=0;
- for(j=0;j<20;j++)
- {
- a[j]=0;
- b[j]=0;
- }
- k1=0;
- k2=0;
- }
- else if(key<10) //判斷為數字
- {
- write_data(table[key]);
- a[i]=key;
- i++;
- }
- else if(key<14) //判斷為運算符號
- {
- write_data(table[key]);
- k1=i-1;
- js=key;
- }
- else //判斷為等于操作
- {
- write_data(table[key]);
- if(i==0)
- k2=0;
- else
- k2=i-1;
- write_cmd(0x80+0x40);
- jscl();
- }
- flag1=0;
- }
- }
- }
復制代碼
|
-
111.png
(34.29 KB, 下載次數: 32)
下載附件
2021-12-14 16:20 上傳
電路圖
|