找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9830|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于STM32F103RCT6的簡易計算器、簡易密碼鎖程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:817022 發(fā)表于 2021-7-1 20:25 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
分享一篇個人的博客,如有錯誤,請各位指出,不勝感激
https://blog.csdn.net/weixin_46757367/article/details/118395307

以下程序所使用的GPIO口是不連續(xù)的,使用者應(yīng)注意。



STM32單片機源程序如下:
  1. /*******************************************************************************
  2. * 項目名稱       : 簡易計算器
  3. * 項目功能                          : 1、矩陣鍵盤輸入,LCD1602顯示數(shù)字、符號
  4.                                                                          2、實現(xiàn) 兩個 正整數(shù) 的加減乘除,結(jié)果精確至小數(shù)點后兩位
  5. * 修改內(nèi)容                         : 2021.6.27(完成功能1、2)
  6. * 項目缺陷                          : 1、不能進行連續(xù)的運算,即每次只能進行兩個數(shù)的加減乘除
  7.                                                                          2、不能進行負數(shù)、小數(shù)以及其它更復(fù)雜的運算
  8.                                                                          3、其它
  9. * 注意事項                         : 無
  10. *******************************************************************************/

  11. #include "calculator_main.h"

  12. void Result(float fin);
  13. void Yunsuan(uint dat1);
  14. void Select(void);

  15. uchar num[] = {'0','1','2','3','4','5','6','7','8','9'};
  16. uchar CHAR[] = {'=','/','*','-','+'};
  17. int Num_1=0,Num_2=0;//用以存儲運算符前后的兩個數(shù)
  18. static float Tatal = 0;//存儲運算結(jié)果
  19. uint FLAG = 0, FLAG_X = 0;

  20. int main(void)
  21. {
  22.         //delay_init();
  23.         LCD_Init();
  24.         KEY_Init();
  25.         while(1)
  26.         {
  27.                 Select();
  28.         }
  29. }



  30. /*******************************************************************************
  31. * 函 數(shù) 名       : Result()
  32. * 函數(shù)功能                          : 在LCD1602第2行顯示運算結(jié)果
  33. * 輸    入       : 運算結(jié)果
  34. * 輸    出       : 無
  35. *******************************************************************************/
  36. void Result(float fin)
  37. {
  38.         uint k;
  39.         char buf[16];
  40.         LCDWriteCom(0xc0);                //設(shè)置數(shù)據(jù)指針起點:第二行,第一個
  41.         LCDWriteData('=');
  42.         sprintf(buf,"%.2f",fin);//將結(jié)果 fin 轉(zhuǎn)化為字符串 buf,然后向LCD1602打印
  43.         for(k=0;k<strlen(buf);k++)
  44.                 LCDWriteData(buf[k]);
  45. }


  46. /*******************************************************************************
  47. * 函 數(shù) 名       : Yunsuan()
  48. * 函數(shù)功能                          : 按下運算符鍵的處理
  49. * 輸    入       : 鍵值
  50. * 輸    出       : 無
  51. *******************************************************************************/
  52. void Yunsuan(uint dat1)
  53. {
  54.         switch( CHAR[dat1-11] )//**********************************加減乘除
  55.         {
  56.                 case '/':
  57.                         LCDWriteData('/');
  58.                         Select();
  59.                         if(FLAG==0)                                                                                         break;//若清零
  60.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若為運算符鍵,則繼續(xù)檢測按鍵
  61.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  62.                         break;
  63.                 case '*':
  64.                         LCDWriteData('*');
  65.                         Select();
  66.                         if(FLAG==0)                                                                                         break;//若清零
  67.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若為運算符鍵,繼續(xù)檢測按鍵
  68.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  69.                         break;
  70.                 case '-':
  71.                         LCDWriteData('-');
  72.                         Select();
  73.                         if(FLAG==0)                                                                                         break;//若清零
  74.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若為運算符鍵,繼續(xù)檢測按鍵
  75.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  76.                         break;
  77.                 case '+':
  78.                         LCDWriteData('+');
  79.                         Select();
  80.                         if(FLAG==0)                                                                                         break;//若清零
  81.                         else if(FLAG>=1 && FLAG_X!=1)                        Select();//若為運算符鍵,繼續(xù)檢測按鍵
  82.                         else if(FLAG_X==1)                                                                Yunsuan(11);//'='
  83.                         break;
  84.                 case '=':
  85.                         if( (Num_1>0||Num_1==0) && Num_2==0 )
  86.                         {
  87.                                 Tatal = (float)Num_1;
  88.                                 if(FLAG==1||FLAG==2)        Tatal = 0;
  89.                         }
  90.                         else if(Num_1==0 && Num_2!=0 && FLAG!=0 )
  91.                         {
  92.                                 switch(FLAG)
  93.                                 {
  94.                                         default: Tatal = 0; break;
  95.                                         case 3:  Tatal = (float)Num_1 - (float)Num_2;                break;
  96.                                         case 4:  Tatal = (float)Num_1 + (float)Num_2;         break;
  97.                                 }
  98.                         }
  99.                         else if(Num_1!=0 && Num_2!=0 && FLAG!=0 )
  100.                         {
  101.                                 switch(FLAG)
  102.                                 {
  103.                                         case 1:  Tatal = (float)Num_1 / (float)Num_2;                break;
  104.                                         case 2:  Tatal = (float)Num_1 * (float)Num_2;         break;
  105.                                         case 3:  Tatal = (float)Num_1 - (float)Num_2;                break;
  106.                                         case 4:  Tatal = (float)Num_1 + (float)Num_2;         break;
  107.                                 }
  108.                         }
  109.                         Result(Tatal);
  110.                         break;
  111.         }
  112. }


  113. /*******************************************************************************
  114. * 函 數(shù) 名       : Select()
  115. * 函數(shù)功能                          : 判斷按鍵的類型
  116. * 輸    入       : 無
  117. * 輸    出       : 無
  118. *******************************************************************************/
  119. void Select(void)
  120. {
  121.         uint flag;
  122.         int Keyvalue;
  123.         while( (Keyvalue=(int)KEY_Input())==16 );//讀取鍵值
  124.         if(Keyvalue<10)//數(shù)字鍵
  125.                 flag = 1;
  126.         else if(Keyvalue>10 && Keyvalue<16)//符號鍵
  127.                 flag = 2;
  128.         else if(Keyvalue==10)//清零鍵
  129.                 flag = 3;
  130.        
  131.         switch( flag )
  132.         {
  133.                 case 1: //數(shù)字
  134.                         LCDWriteData(num[Keyvalue]);
  135.                         if(FLAG==0)        //運算符前的數(shù)字
  136.                         {
  137.                                 Num_1 = Num_1 * 10 + Keyvalue;
  138.                                 Select();
  139.                         }
  140.                         if(FLAG>=1 && FLAG_X!=1)        //運算符后的數(shù)字
  141.                         {
  142.                                 Num_2 = Num_2 * 10 + Keyvalue;
  143.                                 Select();
  144.                         }
  145.                         break;
  146.                 case 2: //字符
  147.                         if(Keyvalue==11)                                FLAG_X = 1;//'='
  148.                         else if(Keyvalue==12)                FLAG          = 1;//'/'
  149.                         else if(Keyvalue==13)                FLAG          = 2;//'*'
  150.                         else if(Keyvalue==14)                FLAG          = 3;//'-'
  151.                         else if(Keyvalue==15)                FLAG   = 4;//'+'
  152.                         Yunsuan(Keyvalue);
  153.                         break;
  154.                 case 3: //清零
  155.                         LCDWriteCom(0x01);
  156.                         Num_1 = Num_2 = FLAG = FLAG_X = Tatal = 0;
  157.                         break;
  158.         }
  159. }
復(fù)制代碼


全部資料51hei下載地址:
簡易計算器程序.7z (181.77 KB, 下載次數(shù): 278)
簡易密碼鎖程序.7z (179.63 KB, 下載次數(shù): 156)

1、現(xiàn)代電子技術(shù)期末作品原理圖.rar

1.41 MB, 下載次數(shù): 84, 下載積分: 黑幣 -5

2、期末作品原理圖 程序流程圖.pdf

335.15 KB, 下載次數(shù): 69, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:947480 發(fā)表于 2021-7-22 08:56 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

板凳
ID:146782 發(fā)表于 2021-7-29 09:57 | 只看該作者
有源代碼的嗎
回復(fù)

使用道具 舉報

地板
ID:1058512 發(fā)表于 2023-1-14 11:41 | 只看該作者

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

5#
ID:1062205 發(fā)表于 2023-2-11 15:19 | 只看該作者

這個特別好
回復(fù)

使用道具 舉報

6#
ID:1075951 發(fā)表于 2023-5-7 23:08 | 只看該作者
只有程序沒有仿真,自己連的運行不了
回復(fù)

使用道具 舉報

7#
ID:1126741 發(fā)表于 2024-6-24 14:44 | 只看該作者
  好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表