欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 基于51單片機(jī)的計(jì)算器 小數(shù)點(diǎn)不知道該怎么寫(xiě)程序 求幫助 [打印本頁(yè)]

作者: 1334479405    時(shí)間: 2020-6-22 15:54
標(biāo)題: 基于51單片機(jī)的計(jì)算器 小數(shù)點(diǎn)不知道該怎么寫(xiě)程序 求幫助
設(shè)計(jì)一個(gè)矩陣鍵盤5*5的計(jì)算器,要求有括號(hào)的優(yōu)先級(jí)。還有小數(shù)點(diǎn)。。寫(xiě)到小數(shù)點(diǎn)就不知道該怎么寫(xiě)。。請(qǐng)各幫幫忙。
  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];                                        //儲(chǔ)存數(shù)值
  20. double value;                                                //儲(chǔ)存結(jié)果
  21. char flag;                                                //運(yùn)算符判斷
  22. uchar KeyValue = 30;        //按鍵值


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


  29. /*********************** 定時(shí)器0初始化 ***********************/
  30. //void Init_timer0()
  31. //{
  32. //        EA = 1;
  33. //        ET0 = 1;
  34. //        TR0 = 1;
  35. //        TMOD = 0x01;
  36. //        TH0 = 0xED;                //定時(shí)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);  //松手檢測(cè)
  70.                         }
  71.                 }
  72.         }
  73. }


  74. /*********************** LCD1602 ***********************/
  75. void Read_Busy() //判忙函數(shù)
  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) //寫(xiě)指令
  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) //寫(xiě)數(shù)據(jù)
  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); //開(kāi)顯示
  112.         Write_Cmd(0x01); //清屏
  113.         Write_Cmd(0x06); //讀寫(xiě)一字節(jié)后,地址指針加1
  114. }


  115. /*********************** 獲取數(shù)值 ***********************/
  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. /*********************** 運(yùn)算符號(hào) ***********************/
  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. /*********************** 計(jì)算結(jié)果 ***********************/
  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位數(shù)
  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位數(shù)
  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位數(shù)
  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數(shù)值
  228.                         GetNum(0);
  229.                
  230.                 if(anjian[KeyValue] == '=')
  231.                         calculate();
  232.                 else
  233.                         GetFlag();
  234.         }
  235. }


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




捕獲.PNG (92.65 KB, 下載次數(shù): 85)

仿真圖

仿真圖

作者: lovezjf234    時(shí)間: 2020-6-22 17:34
按小數(shù)點(diǎn)以后,按一個(gè)數(shù)字就乘以10,然后顯示的總數(shù)除以10的n次方就是你的小數(shù)部分了
作者: lovezjf234    時(shí)間: 2020-6-22 17:35
以小數(shù)點(diǎn)為界,后面的數(shù)字按n次就是10的n次方,然后用整數(shù)做除法就行了




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1