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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3346|回復: 2
收起左側

基于51單片機的計算器 小數點不知道該怎么寫程序 求幫助

[復制鏈接]
ID:620438 發表于 2020-6-22 15:54 | 顯示全部樓層 |閱讀模式
20黑幣
設計一個矩陣鍵盤5*5的計算器,要求有括號的優先級。還有小數點。。寫到小數點就不知道該怎么寫。。請各幫幫忙。
  1. #include<reg52.h>
  2. #include<math.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit rs = P2^0;
  6. sbit rw = P2^1;
  7. sbit lcden = P2^2;


  8. uchar code anjian[]={    //鍵盤值
  9.         'A','(',')','B','C',
  10.         '7','8','9','/','D',
  11.         '4','5','6','*','E',
  12.         '1','2','3','-','F',
  13.         'G','0','.','+','='
  14. };

  15. uchar code shuzhi[]={
  16.         '0','1','2','3','4',
  17.         '5','6','7','8','9'
  18. };


  19. double num[20];                                        //儲存數值
  20. double value;                                                //儲存結果
  21. char flag;                                                //運算符判斷
  22. uchar KeyValue = 30;        //按鍵值


  23. void delay(uint z) //毫秒級延時
  24. {
  25.         uint x,y;
  26.         for(x=z;x>0;x--)
  27.                 for(y=114;y>0;y--);
  28. }


  29. /*********************** 定時器0初始化 ***********************/
  30. //void Init_timer0()
  31. //{
  32. //        EA = 1;
  33. //        ET0 = 1;
  34. //        TR0 = 1;
  35. //        TMOD = 0x01;
  36. //        TH0 = 0xED;                //定時5ms
  37. //        TL0 = 0xFF;
  38. //}

  39. /*********************** 5*5矩陣鍵盤 ***********************/
  40. void KeyScan()
  41. {
  42.         P3 = 0xFF;  //列掃描
  43.         P1 = 0;
  44.         while(KeyValue == 30)
  45.         {
  46.                 if(P3 != 0xFF)
  47.                 {
  48.                         delay(10);
  49.                         if(P3 != 0xFF)
  50.                         {
  51.                                 switch(P3)
  52.                                 {
  53.                                         case 0xFE: KeyValue=0; break;
  54.                                         case 0xFD: KeyValue=1; break;
  55.                                         case 0xFB: KeyValue=2; break;
  56.                                         case 0xF7: KeyValue=3; break;
  57.                                         case 0xEF: KeyValue=4; break;
  58.                                 }
  59.                                 P1 = 0xFF;  //行掃描
  60.                                 P3 = 0;
  61.                                 switch(P1)
  62.                                 {
  63.                                         case 0xF7: KeyValue=KeyValue; break;
  64.                                         case 0xEF: KeyValue=KeyValue+5; break;
  65.                                         case 0xDF: KeyValue=KeyValue+10; break;
  66.                                         case 0xBF: KeyValue=KeyValue+15; break;
  67.                                         case 0x7F: KeyValue=KeyValue+20; break;               
  68.                                 }
  69.                                 while(P1 != 0xFF);  //松手檢測
  70.                         }
  71.                 }
  72.         }
  73. }


  74. /*********************** LCD1602 ***********************/
  75. void Read_Busy() //判忙函數
  76. {
  77.         uchar busy;
  78.         P0 = 0xFF;
  79.         rs = 0;
  80.         rw = 1;
  81.         do
  82.         {
  83.                 lcden = 1;
  84.                 busy         = P0;
  85.                 lcden = 0;
  86.         }while(busy & 0x80);
  87. }

  88. void Write_Cmd(uchar cmd) //寫指令
  89. {
  90.         Read_Busy();
  91.         rs = 0;
  92.         rw = 0;
  93.         P0 = cmd;
  94.         lcden = 1;
  95.         lcden = 0;
  96. }

  97. void Write_Dat(uchar dat) //寫數據
  98. {
  99.         Read_Busy();
  100.         rs = 1;
  101.         rw = 0;
  102.         P0 = dat;
  103.         lcden = 1;
  104.         lcden = 0;
  105.         
  106.         KeyValue = 30; //清按鍵值
  107. }

  108. void Init_lcd() //lcd初始化
  109. {
  110.         Write_Cmd(0x38); //16*2顯示
  111.         Write_Cmd(0x0C); //開顯示
  112.         Write_Cmd(0x01); //清屏
  113.         Write_Cmd(0x06); //讀寫一字節后,地址指針加1
  114. }


  115. /*********************** 獲取數值 ***********************/
  116. void GetNum(int x)
  117. {
  118.         num[x] = anjian[KeyValue] - 48;
  119.         Write_Dat(anjian[KeyValue]);
  120.         KeyScan();
  121.         while(48 <= anjian[KeyValue] && anjian[KeyValue] <= 57)
  122.         {
  123.                 num[x] = num[x] * 10 + (anjian[KeyValue] - 48);
  124.                 Write_Dat(anjian[KeyValue]);
  125.                 KeyScan();
  126.         }
  127. }


  128. /*********************** 運算符號 ***********************/
  129. void GetFlag()
  130. {
  131.         switch(anjian[KeyValue])
  132.         {
  133.                 case '+':
  134.                         flag = '+';
  135.                         Write_Dat('+'); break;
  136.                 case '-':
  137.                         flag = '-';
  138.                         Write_Dat('-'); break;
  139.                 case '*':
  140.                         flag = '*';
  141.                         Write_Dat('*'); break;
  142.                 case '/':
  143.                         flag = '/';
  144.                         Write_Dat('/'); break;
  145.         }
  146.         KeyScan();
  147.         GetNum(1);
  148. }


  149. /*********************** 計算結果 ***********************/
  150. void calculate()
  151. {
  152.         int ge, shi, bai;
  153.         
  154.         Write_Cmd(0xC0);
  155.         Write_Dat('=');
  156.         
  157.         switch(flag)
  158.         {
  159.                 case '+':
  160.                         value = num[0] + num[1]; break;
  161.                 case '-':
  162.                         value = num[0] - num[1]; break;
  163.                 case '*':
  164.                         value = num[0] * num[1]; break;
  165.                 case '/':
  166.                         value = num[0] / num[1]; break;
  167.         }
  168.         
  169.         if(0 <= fabs(value) && fabs(value) <= 9)                //1位數
  170.         {
  171.                 ge = fabs(value);
  172.                 if(value >= 0)
  173.                         Write_Dat(shuzhi[ge]);
  174.                 else
  175.                 {
  176.                         Write_Dat('-');
  177.                         Write_Dat(shuzhi[ge]);
  178.                 }
  179.         }
  180.         
  181.         if(10 <= fabs(value) && fabs(value) <= 99)        //2位數
  182.         {
  183.                 shi = fabs(value) / 10;
  184.                 ge = (int)fabs(value) % 10;
  185.                 if(value >= 0)
  186.                 {
  187.                         Write_Dat(shuzhi[shi]);
  188.                         Write_Dat(shuzhi[ge]);
  189.                 }
  190.                 else
  191.                 {
  192.                         Write_Dat('-');
  193.                         Write_Dat(shuzhi[shi]);
  194.                         Write_Dat(shuzhi[ge]);
  195.                 }
  196.         }
  197.         
  198.         if(100 <= fabs(value) && fabs(value) <= 999)        //3位數
  199.         {
  200.                 bai = fabs(value) / 100;
  201.                 shi = (int)fabs(value) /10 % 10;
  202.                 ge = (int)fabs(value) % 10;
  203.                 if(value >= 0)
  204.                 {
  205.                         Write_Dat(shuzhi[bai]);
  206.                         Write_Dat(shuzhi[shi]);
  207.                         Write_Dat(shuzhi[ge]);
  208.                 }
  209.                 else
  210.                 {
  211.                         Write_Dat('-');
  212.                         Write_Dat(shuzhi[bai]);
  213.                         Write_Dat(shuzhi[shi]);
  214.                         Write_Dat(shuzhi[ge]);
  215.                 }
  216.         }
  217. }

  218. void main()
  219. {
  220.         //Init_timer0();
  221.         Init_lcd();
  222.         Write_Cmd(0x80); //第一行顯示字符
  223.         
  224.         while(1)
  225.         {
  226.                 KeyScan();
  227.                 if(48 <= anjian[KeyValue] && anjian[KeyValue] <= 57) //獲取0~9數值
  228.                         GetNum(0);
  229.                
  230.                 if(anjian[KeyValue] == '=')
  231.                         calculate();
  232.                 else
  233.                         GetFlag();
  234.         }
  235. }


  236. /*********************** T0中斷函數 ***********************/
  237. //void timer0() interrupt 1
  238. //{
  239. //        TH0 = 0xED;                //定時5ms
  240. //        TL0 = 0xFF;
  241. //        
  242. //        if(anjian[KeyValue] == 'A')
  243. //        {
  244. //                Write_Cmd(0x01); //清屏
  245. //                Write_Cmd(0x80); //第一行顯示字符
  246. //                //KeyValue = 0;
  247. //        }
  248. //}
復制代碼




仿真圖

仿真圖
回復

使用道具 舉報

ID:739545 發表于 2020-6-22 17:34 | 顯示全部樓層
按小數點以后,按一個數字就乘以10,然后顯示的總數除以10的n次方就是你的小數部分了
回復

使用道具 舉報

ID:739545 發表于 2020-6-22 17:35 | 顯示全部樓層
以小數點為界,后面的數字按n次就是10的n次方,然后用整數做除法就行了
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美日韩一区二区三区在线 | 欧美精品二区 | 国产中文字幕在线 | 免费激情av | 亚洲一区二区三区在线播放 | 日本久久久久久 | 一级特黄色毛片 | 精品久久久久一区二区国产 | 亚洲视频免费在线观看 | 日韩在线一区二区 | 日韩福利 | 国产一区二区三区免费 | 偷拍自拍网 | 91精品国产综合久久久密闭 | 日韩一区中文字幕 | 欧美一级欧美三级在线观看 | 成人综合视频在线观看 | 国产亚洲一区二区三区在线观看 | 国产精品一区免费 | 伊人网站视频 | 中文字幕1区2区 | 中文字幕高清视频 | 成人久久久 | 国产精品激情 | 91精品国产乱码久久蜜臀 | 综合久久av | 中文成人在线 | 成人黄视频在线观看 | 罗宾被扒开腿做同人网站 | 国产剧情一区二区三区 | 国产精品免费一区二区三区四区 | 久久激情网 | 天堂一区在线 | 九九九国产 | 久久久高清 | 国产成人99av超碰超爽 | 亚洲一区国产精品 | 婷婷去俺也去 | 91婷婷韩国欧美一区二区 | 久久精品国产99国产精品 | 亚洲男人的天堂网站 |