|
1. 運(yùn)算過(guò)程、符號(hào)公式實(shí)時(shí)顯示在顯示屏上(I2C 1602)。
2. 自帶三角函數(shù)、開(kāi)根號(hào)、平方運(yùn)算。
3. 計(jì)算得出的結(jié)果可設(shè)置保存并用以下一次計(jì)算。
4. 所有運(yùn)算結(jié)果精確到至少小數(shù)點(diǎn)后兩位。
5. 運(yùn)算結(jié)果可通過(guò)串口發(fā)送給上位機(jī)。
6. 當(dāng)斷電重啟時(shí),能存儲(chǔ)并顯示斷電前正在計(jì)算的任務(wù)。(AT24C02)
硬件連接圖如下:
51hei截圖20200801141419.png (159.17 KB, 下載次數(shù): 39)
下載附件
2020-8-1 14:14 上傳
簡(jiǎn)易計(jì)算器按鍵草圖.png (17.71 KB, 下載次數(shù): 58)
下載附件
2020-8-1 14:56 上傳
實(shí)物圖如下:
IMG_20200530_224524.jpg (3.89 MB, 下載次數(shù): 48)
下載附件
2020-8-1 14:16 上傳
IMG_20200531_211400.jpg (3.49 MB, 下載次數(shù): 56)
下載附件
2020-8-1 14:17 上傳
IMG_20200531_211414.jpg (4.74 MB, 下載次數(shù): 49)
下載附件
2020-8-1 14:17 上傳
單片機(jī)源程序如下:
- main.c
- #include <REGX52.H>
- #include "Calculate.H"
- #include "Martixkey.h"
- #include "AT24C02.h"
- #include <stdio.h>
- #include "I2C.h"
- #include "1602.h"
- #include <string.h>
- #include "UART.h"
- long float number1=0,number2=0;
- long float result;//結(jié)果
- unsigned char i=0,x=0; //運(yùn)算符號(hào)標(biāo)志位
- unsigned char x1=1;//液晶屏第一行列標(biāo)志位x1
- unsigned char key;//矩陣鍵盤(pán)鍵值
- char strnum1[7]={'\0','\0','\0','\0','\0','\0','\0'};//數(shù)字1字符數(shù)組
- char strnum2[7]={'\0','\0','\0','\0','\0','\0','\0'};//數(shù)字2字符數(shù)組
- char strresult[14];//結(jié)果字符數(shù)組
- unsigned char n=0,m=7; //第1,2個(gè)數(shù)可以輸入6個(gè)有效數(shù)字
- void main()
- {
- init_lcd();//lcd初始化
- UART_Init();//串口初始化
- while(1)
- {
- key=Martixkey();//矩陣鍵盤(pán)掃描按鍵
- if(key==0) key=123;//返回鍵值為0時(shí)將key賦值為123
- if(key==100) key=0;//返回鍵值為100時(shí)視為0
-
- if(P0_0==0)//按鍵檢測(cè) 存儲(chǔ)正在計(jì)算的任務(wù)
- {
- for(i=0;i<7;i++)//循環(huán)寫(xiě)入數(shù)字1字符串
- {AT24C02_WriteByte(i,strnum1[i]); Delay(5);}
- AT24C02_WriteByte(i,x); Delay(5);//寫(xiě)入運(yùn)算符號(hào)
- for(i=8;i<15;i++)//循環(huán)寫(xiě)入數(shù)字2字符串
- {AT24C02_WriteByte(i,strnum2[i-8]); Delay(5);}
- }
- if(P0_5==0)//按鍵檢測(cè) 讀取上一次斷電前計(jì)算的任務(wù)
- {ShowString(1,1," ");ShowString(2,1," "); //將液晶屏第一,二行清空
- for(i=0;i<7;i++)
- strnum1[i]=AT24C02_ReadByte(i);
- x=AT24C02_ReadByte(7);
- for(i=8;i<15;i++)
- strnum2[i-8]=AT24C02_ReadByte(i);
- switch(x)
- {case 1:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'+');ShowString(1,x1,strnum2);break;
- case 2:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'-');ShowString(1,x1,strnum2);break;
- case 3:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'*');ShowString(1,x1,strnum2);break;
- case 4:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'/');ShowString(1,x1,strnum2);break;
- case 5:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'%');ShowString(1,x1,strnum2);break;
- case 6:ShowString(1,1,"Sin");ShowString(1,4,strnum1);x1=strlen(strnum1)+3;break;
- case 7:ShowString(1,1,"Cos");ShowString(1,4,strnum1);x1=strlen(strnum1)+3;break;
- case 8:ShowString(1,1,"Tan");ShowString(1,4,strnum1);x1=strlen(strnum1)+3;break;
- case 9:ShowChar(1,1,'V');ShowString(1,2,strnum1);x1=strlen(strnum1)+1;break;
- case 10:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowString(1,x1,"^2");break;}
- m=7;n=7;
- }
- if(key<=10)
- {
- if(n<7){m=7;if(key==10) {strnum1[n]='.';ShowChar(1,x1++,strnum1[n]);}else {strnum1[n]='0'+key;ShowChar(1,x1++,strnum1[n]);}}n++; //首先輸入第一個(gè)數(shù)
- if(m<7){n=7;if(key==10) {strnum2[m]='.';ShowChar(1,x1++,strnum2[m]);}else {strnum2[m]='0'+key;ShowChar(1,x1++,strnum2[m]);}}m++; //必須按下運(yùn)算符號(hào)才能輸入第二個(gè)數(shù)
- }
-
- else
- { switch(key) //功能鍵選擇
- {
- case 17:n=7;m=0;x=1;ShowChar(1,x1++,'+');break; //加
- case 18:n=7;m=0;x=2;ShowChar(1,x1++,'-');break; //減
- case 19:n=7;m=0;x=3;ShowChar(1,x1++,'*');break; //乘
- case 20:n=7;m=0;x=4;ShowChar(1,x1++,'/');break; //除
- case 21:n=7;m=0;x=5;ShowChar(1,x1++,'%');break; //求余
- case 11:n=0;m=7;x=6;ShowString(1,x1,"Sin");x1+=3;break; //sin
- case 12:n=0;m=7;x=7;ShowString(1,x1,"Cos");x1+=3;break; //cos
- case 13:n=0;m=7;x=8;ShowString(1,x1,"Tan");x1+=3;break; //tan
- case 14:n=0;m=7;x=9;ShowChar(1,x1++,'V');break; //開(kāi)根號(hào)
- case 15:n=0;m=7;x=10;ShowString(1,x1,"^2");x1+=2;break; //平方
-
- case 16:n=7;m=7;
- sscanf(strnum1,"%lf",&number1);
- sscanf(strnum2,"%lf",&number2);
- Calculate(x,number1,number2,&result);//計(jì)算
- sprintf(strresult,"%g",result);//將結(jié)果轉(zhuǎn)換為字符串形式
- ShowChar(2,1,'=');
- ShowString(2,3,strresult);
-
- for(i=0;strresult[i]!='\0';i++) //通過(guò)串口發(fā)送結(jié)果
- UART_SendByte(strresult[i]);
- UART_SendByte(' ');
- i=0;
- break;
-
- case 22:n=7;m=7;number1=result;//將結(jié)果賦值給number1
- ShowString(1,1," ");ShowString(2,1," "); //將液晶屏第一,二行清空
- Delay(10);sprintf(strnum1,"%g",number1);
- ShowString(1,1,strnum1); //在第一個(gè)數(shù)字位置顯示上一個(gè)結(jié)果
- x1=strlen(strnum1)+1;number2=0;
- for(i=0;i<7;i++)
- strnum2[i]='\0';
- i=0;
- break;
- case 23:if(n<7) {strnum1[--n]='\0'; ShowChar(1,--x1,' ');}
- if(m<7) {strnum2[--m]='\0';ShowChar(1,--x1,' ');}
- break;// 退位
- }
- }
- }
- }
復(fù)制代碼- Calculate.c
- #include "1602.h"
- #include <math.h>
- #define PI 3.1415926
- void Calculate(unsigned char x,long float number1,long float number2,long float *result)//運(yùn)算
- {
- switch(x) //功能鍵選擇
- {
- case 1:*result=number1+number2;break; //加
- case 2:if(number1>=number2){*result=number1-number2;} //減
- else{*result=number2-number1;ShowChar(2,2,'-');} break ; //負(fù)數(shù)符號(hào)
- case 3:*result=number1*number2;break; //乘
- case 4:if(number2==0){ShowString(1,1,"Error!");}
- else{*result=number1/number2;}break; //除
- case 5:*result=(int)number1%(int)number2;break; // 求余
- case 6:*result=sin(number1*PI/180);break; //SIN
- case 7:*result=cos(number1*PI/180);break; //COS
- case 8:*result=tan(number1*PI/180);break; //TAN
- case 9:*result=sqrt(number1);break; //開(kāi)根號(hào)
- case 10:*result=number1*number1;break; //平方運(yùn)算
- case 0:break;
- }
- }
復(fù)制代碼 全部資料51hei下載地址:
簡(jiǎn)易計(jì)算器.7z
(63.35 KB, 下載次數(shù): 52)
2020-8-1 14:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|