|
分享一篇個人的博客,如有錯誤,請各位指出,不勝感激
https://blog.csdn.net/weixin_46757367/article/details/118395307
以下程序所使用的GPIO口是不連續(xù)的,使用者應(yīng)注意。
現(xiàn)代電子技術(shù)期末原理圖.png (149.3 KB, 下載次數(shù): 86)
下載附件
2021-7-1 20:23 上傳
STM32單片機源程序如下:
- /*******************************************************************************
- * 項目名稱 : 簡易計算器
- * 項目功能 : 1、矩陣鍵盤輸入,LCD1602顯示數(shù)字、符號
- 2、實現(xiàn) 兩個 正整數(shù) 的加減乘除,結(jié)果精確至小數(shù)點后兩位
- * 修改內(nèi)容 : 2021.6.27(完成功能1、2)
- * 項目缺陷 : 1、不能進行連續(xù)的運算,即每次只能進行兩個數(shù)的加減乘除
- 2、不能進行負數(shù)、小數(shù)以及其它更復(fù)雜的運算
- 3、其它
- * 注意事項 : 無
- *******************************************************************************/
- #include "calculator_main.h"
- void Result(float fin);
- void Yunsuan(uint dat1);
- void Select(void);
- uchar num[] = {'0','1','2','3','4','5','6','7','8','9'};
- uchar CHAR[] = {'=','/','*','-','+'};
- int Num_1=0,Num_2=0;//用以存儲運算符前后的兩個數(shù)
- static float Tatal = 0;//存儲運算結(jié)果
- uint FLAG = 0, FLAG_X = 0;
- int main(void)
- {
- //delay_init();
- LCD_Init();
- KEY_Init();
- while(1)
- {
- Select();
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Result()
- * 函數(shù)功能 : 在LCD1602第2行顯示運算結(jié)果
- * 輸 入 : 運算結(jié)果
- * 輸 出 : 無
- *******************************************************************************/
- void Result(float fin)
- {
- uint k;
- char buf[16];
- LCDWriteCom(0xc0); //設(shè)置數(shù)據(jù)指針起點:第二行,第一個
- LCDWriteData('=');
- sprintf(buf,"%.2f",fin);//將結(jié)果 fin 轉(zhuǎn)化為字符串 buf,然后向LCD1602打印
- for(k=0;k<strlen(buf);k++)
- LCDWriteData(buf[k]);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Yunsuan()
- * 函數(shù)功能 : 按下運算符鍵的處理
- * 輸 入 : 鍵值
- * 輸 出 : 無
- *******************************************************************************/
- void Yunsuan(uint dat1)
- {
- switch( CHAR[dat1-11] )//**********************************加減乘除
- {
- case '/':
- LCDWriteData('/');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若為運算符鍵,則繼續(xù)檢測按鍵
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '*':
- LCDWriteData('*');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若為運算符鍵,繼續(xù)檢測按鍵
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '-':
- LCDWriteData('-');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若為運算符鍵,繼續(xù)檢測按鍵
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '+':
- LCDWriteData('+');
- Select();
- if(FLAG==0) break;//若清零
- else if(FLAG>=1 && FLAG_X!=1) Select();//若為運算符鍵,繼續(xù)檢測按鍵
- else if(FLAG_X==1) Yunsuan(11);//'='
- break;
- case '=':
- if( (Num_1>0||Num_1==0) && Num_2==0 )
- {
- Tatal = (float)Num_1;
- if(FLAG==1||FLAG==2) Tatal = 0;
- }
- else if(Num_1==0 && Num_2!=0 && FLAG!=0 )
- {
- switch(FLAG)
- {
- default: Tatal = 0; break;
- case 3: Tatal = (float)Num_1 - (float)Num_2; break;
- case 4: Tatal = (float)Num_1 + (float)Num_2; break;
- }
- }
- else if(Num_1!=0 && Num_2!=0 && FLAG!=0 )
- {
- switch(FLAG)
- {
- case 1: Tatal = (float)Num_1 / (float)Num_2; break;
- case 2: Tatal = (float)Num_1 * (float)Num_2; break;
- case 3: Tatal = (float)Num_1 - (float)Num_2; break;
- case 4: Tatal = (float)Num_1 + (float)Num_2; break;
- }
- }
- Result(Tatal);
- break;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Select()
- * 函數(shù)功能 : 判斷按鍵的類型
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Select(void)
- {
- uint flag;
- int Keyvalue;
- while( (Keyvalue=(int)KEY_Input())==16 );//讀取鍵值
- if(Keyvalue<10)//數(shù)字鍵
- flag = 1;
- else if(Keyvalue>10 && Keyvalue<16)//符號鍵
- flag = 2;
- else if(Keyvalue==10)//清零鍵
- flag = 3;
-
- switch( flag )
- {
- case 1: //數(shù)字
- LCDWriteData(num[Keyvalue]);
- if(FLAG==0) //運算符前的數(shù)字
- {
- Num_1 = Num_1 * 10 + Keyvalue;
- Select();
- }
- if(FLAG>=1 && FLAG_X!=1) //運算符后的數(shù)字
- {
- Num_2 = Num_2 * 10 + Keyvalue;
- Select();
- }
- break;
- case 2: //字符
- if(Keyvalue==11) FLAG_X = 1;//'='
- else if(Keyvalue==12) FLAG = 1;//'/'
- else if(Keyvalue==13) FLAG = 2;//'*'
- else if(Keyvalue==14) FLAG = 3;//'-'
- else if(Keyvalue==15) FLAG = 4;//'+'
- Yunsuan(Keyvalue);
- break;
- case 3: //清零
- LCDWriteCom(0x01);
- Num_1 = Num_2 = FLAG = FLAG_X = Tatal = 0;
- break;
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
簡易計算器程序.7z
(181.77 KB, 下載次數(shù): 278)
2021-7-2 04:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
簡易密碼鎖程序.7z
(179.63 KB, 下載次數(shù): 156)
2021-7-2 04:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|