久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 基于STM32F103RCT6的簡易計算器、簡易密碼鎖程序 [打印本頁]

作者: 楓雨    時間: 2021-7-1 20:25
標題: 基于STM32F103RCT6的簡易計算器、簡易密碼鎖程序
分享一篇個人的博客,如有錯誤,請各位指出,不勝感激
https://blog.csdn.net/weixin_46757367/article/details/118395307

以下程序所使用的GPIO口是不連續的,使用者應注意。



STM32單片機源程序如下:
  1. /*******************************************************************************
  2. * 項目名稱       : 簡易計算器
  3. * 項目功能                          : 1、矩陣鍵盤輸入,LCD1602顯示數字、符號
  4.                                                                          2、實現 兩個 正整數 的加減乘除,結果精確至小數點后兩位
  5. * 修改內容                         : 2021.6.27(完成功能1、2)
  6. * 項目缺陷                          : 1、不能進行連續的運算,即每次只能進行兩個數的加減乘除
  7.                                                                          2、不能進行負數、小數以及其它更復雜的運算
  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;//用以存儲運算符前后的兩個數
  18. static float Tatal = 0;//存儲運算結果
  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. * 函 數 名       : Result()
  32. * 函數功能                          : 在LCD1602第2行顯示運算結果
  33. * 輸    入       : 運算結果
  34. * 輸    出       : 無
  35. *******************************************************************************/
  36. void Result(float fin)
  37. {
  38.         uint k;
  39.         char buf[16];
  40.         LCDWriteCom(0xc0);                //設置數據指針起點:第二行,第一個
  41.         LCDWriteData('=');
  42.         sprintf(buf,"%.2f",fin);//將結果 fin 轉化為字符串 buf,然后向LCD1602打印
  43.         for(k=0;k<strlen(buf);k++)
  44.                 LCDWriteData(buf[k]);
  45. }


  46. /*******************************************************************************
  47. * 函 數 名       : Yunsuan()
  48. * 函數功能                          : 按下運算符鍵的處理
  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();//若為運算符鍵,則繼續檢測按鍵
  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();//若為運算符鍵,繼續檢測按鍵
  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();//若為運算符鍵,繼續檢測按鍵
  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();//若為運算符鍵,繼續檢測按鍵
  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. * 函 數 名       : Select()
  115. * 函數功能                          : 判斷按鍵的類型
  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)//數字鍵
  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: //數字
  134.                         LCDWriteData(num[Keyvalue]);
  135.                         if(FLAG==0)        //運算符前的數字
  136.                         {
  137.                                 Num_1 = Num_1 * 10 + Keyvalue;
  138.                                 Select();
  139.                         }
  140.                         if(FLAG>=1 && FLAG_X!=1)        //運算符后的數字
  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. }
復制代碼


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

1、現代電子技術期末作品原理圖.rar

1.41 MB, 下載次數: 84, 下載積分: 黑幣 -5

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

335.15 KB, 下載次數: 69, 下載積分: 黑幣 -5


作者: xcwdf    時間: 2021-7-22 08:56
好資料,51黑有你更精彩!!!
作者: aayon1979    時間: 2021-7-29 09:57
有源代碼的嗎
作者: BenAndrew    時間: 2023-1-14 11:41

好資料,51黑有你更精彩!!!
作者: yu1111讓人    時間: 2023-2-11 15:19
aayon1979 發表于 2021-7-29 09:57
有源代碼的嗎

這個特別好

作者: jingji2    時間: 2023-5-7 23:08
只有程序沒有仿真,自己連的運行不了
作者: nixiak    時間: 2024-6-24 14:44
  好資料,51黑有你更精彩!!!




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区小视频 | 成年免费大片黄在线观看一级 | 国产激情视频在线免费观看 | 粉色午夜视频 | 欧美一级视频免费看 | 欧美日韩一区二区三区四区五区 | 国产精品视频免费播放 | 国产综合精品一区二区三区 | 综合五月 | 国际精品鲁一鲁一区二区小说 | 欧美又大粗又爽又黄大片视频 | 免费av观看 | 久久久久国产精品午夜一区 | av一区二区三区四区 | 精品免费在线 | 91久久久久久久久久久久久 | 精品国产一区久久 | 成人黄在线观看 | 亚洲成人在线视频播放 | 亚洲一区二区三区免费在线 | 免费看色 | 欧美久久综合 | 中文字幕亚洲一区 | 瑟瑟视频在线看 | 激情一区二区三区 | 久久精品久久精品久久精品 | 久久午夜国产精品www忘忧草 | 成人av电影网 | 国产不卡在线播放 | 日韩无| 一区精品国产欧美在线 | av免费网站在线观看 | 男女网站在线观看 | 国产一区二区三区色淫影院 | 在线欧美视频 | 51ⅴ精品国产91久久久久久 | 亚洲精品第一国产综合野 | 五月免费视频 | 在线亚洲人成电影网站色www | 免费一区| 毛片免费观看视频 |