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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7267|回復: 8
收起左側

LCD1602簡易計算器實物與仿真

[復制鏈接]
ID:372961 發表于 2018-7-26 22:45 | 顯示全部樓層 |閱讀模式
proteus仿真:
微信截圖_20180726222907.png

實物:
微信圖片_20180726222950.jpg

  1. /*******************************************************************************
  2. *  標題:                       LCD1602簡易計算器                               *
  3. *  時間                      2018年7月26日22:32:18                                                   *
  4. *                                                                                                                                                           *
  5. *  實驗說明:1602簡易計算器,可以實現四位數以內的加減乘除,                                     *                                                      
  6. ********************************************************************************
  7. * 實驗心得:當內部ram不夠用的時候,可以定義成xdata,使用外部ram,但是有一個問題*
  8. 就是在用proteus仿真的時候,如果有xdata的代碼,可能仿真會出現點問題,因為peoteus*
  9. 不支持外部擴展ram                                                               *
  10. ********************************************************************************/
  11. #include<reg51.h>       
  12. #include"lcd.h"
  13. #include"math.h"

  14. //--定義使用的IO口--//       
  15. #define GPIO_KEY P1

  16. //--定義全局變量--//
  17. unsigned char code XuJian[16]="01470258=369+-x/";
  18. long value[16];
  19. unsigned char Num[8];//此處寫成unsigend char xdata Num[8]時,實物可以用,但是仿真有點問題,因為proteus不支持外部擴展ram.
  20. unsigned long result;//運算結果
  21. unsigned int flag=0;//標志位
  22. unsigned int  m;
  23. unsigned int c=0;
  24. long First=0;//輸入的第一位數
  25. long Second=0;//輸入的第二位數
  26. unsigned int Key;//符號判斷,如果key=12,為+,13,為-,14為×,15為/。
  27. unsigned char KeyValue=-1;
  28. //用來存放讀取到的鍵值

  29. //--聲明全局函數--//
  30. int KeyScan(void);//鍵值判斷函數
  31. void Delay10ms(unsigned int c);   //誤差 0us
  32. void RES();//結果運算函數

  33. /*******************************************************************************
  34. * 函 數 名         : main
  35. * 函數功能                   : 主函數
  36. * 輸    入         : 無
  37. * 輸    出         : 無
  38. *******************************************************************************/
  39. void main(void)
  40. {
  41.         LcdInit();
  42. //        for(i=0;i<7;i++)
  43. //        {
  44. //                LcdWriteData(TiShi[i]);
  45. //        }

  46.         while(1)
  47.         {
  48.             KeyValue=KeyScan();
  49.                 switch(KeyValue)
  50.                 {
  51.                         case(0):
  52.                         LcdWriteCom(0x01);
  53.                         KeyValue=-1;
  54.                         First=0;
  55.                         Second=0;
  56.                         c=0;
  57.                         break;

  58.                         case(1):                       
  59.                         if(flag==0)//flag為0時,正常計算
  60.                         {
  61.                         LcdWriteData(XuJian[1]);
  62.                         KeyValue=-1;
  63.                         if(c==0)
  64.                         First=10*First+1;
  65.                         else if(c==1)
  66.                         Second=10*Second+1;
  67.                         }

  68.                         else if(flag==1)//flag為1時,可以在第一次運算好后,繼續輸入數字,開始第二次計算
  69.                         {
  70.                     LcdWriteCom(0x01);
  71.                         LcdWriteData(XuJian[1]);
  72.                         KeyValue=-1;
  73.                         First=0;
  74.                         Second=0;
  75.                         c=0;
  76.                         flag=0;
  77.                        
  78.                         if(c==0)
  79.                         First=10*First+1;
  80.                         else if(c==1)
  81.                         Second=10*Second+1;       
  82.                         }
  83.                         break;

  84.                         case(2):
  85.                         if(flag==0)
  86.                         {
  87.                         LcdWriteData(XuJian[2]);
  88.                         KeyValue=-1;
  89.                         if(c==0)
  90.                         First=10*First+4;
  91.                         else if(c==1)
  92.                         Second=10*Second+4;       
  93.                         }

  94.                         else if(flag==1)
  95.                         {
  96.                         LcdWriteCom(0x01);
  97.                         LcdWriteData(XuJian[2]);
  98.                         KeyValue=-1;
  99.                         First=0;
  100.                         Second=0;
  101.                         c=0;
  102.                         flag=0;
  103.                        
  104.                         if(c==0)
  105.                         First=10*First+4;
  106.                         else if(c==1)
  107.                         Second=10*Second+4;               
  108.                         }
  109.                         break;

  110.                         case(3):
  111.                         if(flag==0)
  112.                         {
  113.                         LcdWriteData(XuJian[3]);
  114.                         KeyValue=-1;
  115.                         if(c==0)
  116.                         First=10*First+7;
  117.                         else if(c==1)
  118.                         Second=10*Second+7;
  119.                         }

  120.                         else if(flag==1)
  121.                         {
  122.                         LcdWriteCom(0x01);
  123.                         LcdWriteData(XuJian[3]);
  124.                         KeyValue=-1;
  125.                         First=0;
  126.                         Second=0;
  127.                         c=0;
  128.                         flag=0;
  129.                        
  130.                         if(c==0)
  131.                         First=10*First+7;
  132.                         else if(c==1)
  133.                         Second=10*Second+7;               
  134.                         }
  135.                         break;

  136.                         case(4):
  137.                         if(flag==0)
  138.                         {
  139.                         LcdWriteData(XuJian[4]);
  140.                         KeyValue=-1;
  141.                         if(c==0)
  142.                     First=10*First+0;
  143.                         else if(c==1)
  144.                     Second=10*Second+0;
  145.                         }

  146.                         else if(flag==1)
  147.                         {
  148.                         LcdWriteCom(0x01);
  149.                         LcdWriteData(XuJian[4]);
  150.                         KeyValue=-1;
  151.                         First=0;
  152.                         Second=0;
  153.                         c=0;
  154.                         flag=0;
  155.                        
  156.                         if(c==0)
  157.                         First=10*First+0;
  158.                         else if(c==1)
  159.                         Second=10*Second+0;       
  160.                         }
  161.                         break;

  162.                         case(5):
  163.                         if(flag==0)
  164.                         {
  165.                         LcdWriteData(XuJian[5]);
  166.                         KeyValue=-1;
  167.                         if(c==0)
  168.                         First=10*First+2;
  169.                         else if(c==1)
  170.                         Second=10*Second+2;
  171.                         }

  172.                         else if(flag==1)
  173.                         {
  174.                         LcdWriteCom(0x01);
  175.                         LcdWriteData(XuJian[5]);
  176.                         KeyValue=-1;
  177.                         First=0;
  178.                         Second=0;
  179.                         c=0;
  180.                         flag=0;
  181.                        
  182.                         if(c==0)
  183.                         First=10*First+2;
  184.                         else if(c==1)
  185.                         Second=10*Second+2;       
  186.                         }
  187.                         break;

  188.                         case(6):
  189.                         if(flag==0)
  190.                         {
  191.                         LcdWriteData(XuJian[6]);
  192.                         KeyValue=-1;
  193.                         if(c==0)
  194.                         First=10*First+5;
  195.                         else if(c==1)
  196.                         Second=10*Second+5;
  197.                         }
  198.                        
  199.                         else if(flag==1)
  200.                         {
  201.                         LcdWriteCom(0x01);
  202.                         LcdWriteData(XuJian[6]);
  203.                         KeyValue=-1;
  204.                         First=0;
  205.                         Second=0;
  206.                         c=0;
  207.                         flag=0;
  208.                        
  209.                         if(c==0)
  210.                         First=10*First+5;
  211.                         else if(c==1)
  212.                         Second=10*Second+5;       
  213.                         }
  214.                         break;

  215.                         case(7):
  216.                         if(flag==0)
  217.                         {
  218.                         LcdWriteData(XuJian[7]);
  219.                         KeyValue=-1;
  220.                         if(c==0)
  221.                         First=10*First+8;
  222.                         else if(c==1)
  223.                         First=10*Second+8;
  224.                         }

  225.                         else if(flag==1)
  226.                         {
  227.                         LcdWriteCom(0x01);
  228.                         LcdWriteData(XuJian[7]);
  229.                         KeyValue=-1;
  230.                         First=0;
  231.                         Second=0;
  232.                         c=0;
  233.                         flag=0;
  234.                        
  235.                         if(c==0)
  236.                         First=10*First+8;
  237.                         else if(c==1)
  238.                         Second=10*Second+8;               
  239.                         }
  240.                         break;

  241.                         case(8):
  242.                         flag=1;
  243.                         LcdWriteCom(0xc0);
  244.                         LcdWriteData(XuJian[8]);
  245.                         LcdWriteCom(0x0c);
  246.                         RES();
  247.                         KeyValue=-1;
  248.                         break;

  249.                         case(9):
  250.                         if(flag==0)
  251.                         {
  252.                         LcdWriteData(XuJian[9]);
  253.                         KeyValue=-1;
  254.                         if(c==0)
  255.                         First=10*First+3;
  256.                         else if(c==1)
  257.                         Second=10*Second+3;
  258.                         }

  259.                         else if(flag==1)
  260.                         {
  261.                         LcdWriteCom(0x01);
  262.                         LcdWriteData(XuJian[9]);
  263.                         KeyValue=-1;
  264.                         First=0;
  265.                         Second=0;
  266.                         c=0;
  267.                         flag=0;
  268.                        
  269.                         if(c==0)
  270.                         First=10*First+3;
  271.                         else if(c==1)
  272.                         Second=10*Second+3;               
  273.                         }
  274.                         break;

  275.                         case(10):
  276.                         if(flag==0)
  277.                         {
  278.                         LcdWriteData(XuJian[10]);
  279.                         KeyValue=-1;
  280.                         if(c==0)
  281.                         First=10*First+6;
  282.                         else if(c==1)
  283.                         Second=10*Second+6;
  284.                         }

  285.                         else if(flag==1)
  286.                         {
  287.                         LcdWriteCom(0x01);
  288.                         LcdWriteData(XuJian[10]);
  289.                         KeyValue=-1;
  290.                         First=0;
  291.                         Second=0;
  292.                         c=0;
  293.                         flag=0;
  294.                        
  295.                         if(c==0)
  296.                         First=10*First+6;
  297.                         else if(c==1)
  298.                         Second=10*Second+6;       
  299.                         }
  300.                         break;

  301.                         case(11):
  302.                         if(flag==0)
  303.                         {
  304.                         LcdWriteData(XuJian[11]);
  305.                         KeyValue=-1;
  306.                         if(c==0)
  307.                     First=10*First+9;
  308.                         else if(c==1)
  309.                         Second=10*Second+9;
  310.                         }

  311.                         else if(flag==1)
  312.                         {
  313.                         LcdWriteCom(0x01);
  314.                         LcdWriteData(XuJian[11]);
  315.                         KeyValue=-1;
  316.                         First=0;
  317.                         Second=0;
  318.                         c=0;
  319.                         flag=0;
  320.                        
  321.                         if(c==0)
  322.                         First=10*First+9;
  323.                         else if(c==1)
  324.                         Second=10*Second+9;       
  325.                         }
  326.                         break;

  327.                         case(12):
  328.                         LcdWriteData(XuJian[12]);
  329.                         Key=12;
  330.                         KeyValue=-1;
  331.                         c=1;
  332.                         break;

  333.                         case(13):
  334.                         LcdWriteData(XuJian[13]);
  335.                         Key=13;
  336.                         KeyValue=-1;
  337.                         c=1;
  338.                         break;

  339.                         case(14):
  340.                         LcdWriteData(XuJian[14]);
  341.                         Key=14;
  342.                         KeyValue=-1;
  343.                         c=1;
  344.                         break;

  345.                         case(15):
  346.                         LcdWriteData(XuJian[15]);
  347.                         Key=15;
  348.                         KeyValue=-1;
  349.                         c=1;
  350.                         break;

  351.                 }
  352.         }                       
  353. }

  354. void RES()
  355. {

  356.     unsigned int i,j;

  357.         i=0;

  358.         if(Key==12)
  359.         {
  360.                 result=First+Second;
  361.         }

  362.         else if(Key==13)
  363.         {
  364.                 result=First-Second;
  365.         }

  366.         else if(Key==14)
  367.         {
  368.                 result=First*Second;
  369.         }

  370.         else if(Key==15)
  371.         {
  372.                 result=First/Second;
  373.         }

  374.         do
  375.         {
  376.         value[i]=result%10;
  377.         result/=10;
  378.         i++;
  379.         }while((result/10)!=0);

  380.         value[i]=result;
  381.         m=i;

  382.         for(j=0;j<=i;j++) //for循環如果是for(j=i;j>=0;j++)就會出現不同的結果,很奇怪
  383.         {
  384.                   Num[j]=value[j]+'0';
  385.         }

  386.         for(i=0;i<=m;i++)//這里的for循環也是和上面一樣的結果,改成for(i=m;i>=0;i--)就會出現奇怪的結果,有興趣的可以試試。
  387.     {
  388.                 LcdWriteData(Num[m-i]);
  389.         }
  390.        

  391. }


  392. /*******************************************************************************
  393. * 函 數 名         : KeyScan
  394. * 函數功能                   : 檢測有按鍵按下并讀取鍵值
  395. * 輸    入         : 無
  396. * 輸    出         : 無
  397. *******************************************************************************/

  398. int KeyScan(void)          //測試行(row)的時候就是線是豎著的的那一列為1,測試列(col)的時候就是線是橫著的那幾行為1
  399. {
  400.         char a = 0;
  401.         GPIO_KEY=0x0f;
  402.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  403.         {
  404.                 Delay10ms(1);//延時10ms進行消抖
  405.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  406.                 {
  407.                        
  408.                         //測試列
  409.                         GPIO_KEY=0X0F;
  410.                         switch(GPIO_KEY)
  411.                         {
  412.                                 case(0X07):        KeyValue=0;break;
  413.                                 case(0X0b):        KeyValue=4;break;
  414.                                 case(0X0d): KeyValue=8;break;
  415.                                 case(0X0e):        KeyValue=12;break;
  416.                         }
  417.                         //測試行
  418.                         GPIO_KEY=0XF0;
  419.                         switch(GPIO_KEY)
  420.                         {
  421.                                 case(0X70):        KeyValue=KeyValue+3;break;
  422.                                 case(0Xb0):        KeyValue=KeyValue+2;break;
  423.                                 case(0Xd0): KeyValue=KeyValue+1;break;
  424.                                 case(0Xe0):        KeyValue=KeyValue;break;
  425.                         }
  426.                         while((a<50) && (GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  427.                         {
  428.                                 Delay10ms(1);
  429.                                 a++;
  430.                         }
  431.                 }
  432.         }
  433.         return KeyValue;

  434. }

  435. /*******************************************************************************
  436. * 函 數 名         : Delay10ms
  437. * 函數功能                   : 延時函數,延時10ms
  438. * 輸    入         : 無
  439. * 輸    出         : 無
  440. *******************************************************************************/

  441. void Delay10ms(unsigned int c)   //誤差 0us
  442. {
  443.     unsigned char a, b;

  444.         //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
  445.     for (;c>0;c--)
  446.         {
  447.                 for (b=38;b>0;b--)
  448.                 {
  449.                         for (a=130;a>0;a--);
  450.                 }         
  451.         }      
  452. }
  453. //因為有.h文件,所以復制上來會出錯,需要的在附件里下載
復制代碼



LCD1602簡易計算器.rar

63.74 KB, 下載次數: 210, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:661338 發表于 2019-12-23 15:23 | 顯示全部樓層
謝謝大神 學到了很多
回復

使用道具 舉報

ID:670990 發表于 2019-12-24 15:31 來自觸屏版 | 顯示全部樓層
樓主實物圖能拍的再詳細一些嗎 對我很有用!
回復

使用道具 舉報

ID:672877 發表于 2019-12-25 19:46 | 顯示全部樓層
復制進去有錯誤怎修改啊
回復

使用道具 舉報

ID:814018 發表于 2020-8-13 23:24 | 顯示全部樓層
請問下,這里面的C是個什么意思啊
回復

使用道具 舉報

ID:814033 發表于 2020-8-14 07:11 來自觸屏版 | 顯示全部樓層
厲害了,長知識了
回復

使用道具 舉報

ID:837654 發表于 2020-11-2 11:16 | 顯示全部樓層
有錯
回復

使用道具 舉報

ID:787495 發表于 2020-12-18 16:58 | 顯示全部樓層
有大神能做匯編語言嗎
回復

使用道具 舉報

ID:881846 發表于 2021-2-2 14:51 | 顯示全部樓層
國有化 發表于 2020-8-13 23:24
請問下,這里面的C是個什么意思啊

對啊 c是什么
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区久久 | www.五月天婷婷 | 国产.com| 欧美国产日本一区 | 欧美激情黄色 | 91在线视频免费观看 | 欧美精品在线观看 | 超碰97在线免费 | 最新国产精品 | 一区二区三区在线观看视频 | 欧美不卡在线 | 精品久久久久久久久久久久 | 欧美日一区二区 | 亚洲精品一区二区三区中文字幕 | 国产三级日本三级 | 久久精品日产第一区二区三区 | 久久久女女女女999久久 | 亚洲区一区二 | 99亚洲精品 | a黄视频 | 欧美成人精品一区二区男人看 | 精品久久久久香蕉网 | 精品欧美乱码久久久久久 | 超碰在线影院 | 日韩av在线一区 | 亚洲综合国产精品 | 久久久国产精品视频 | 日韩免费av网站 | 天天综合久久 | 国产一区二区三区四区hd | 亚洲国产欧美在线 | 亚洲精品不卡 | 国产激情一区二区三区 | 日韩国产一区二区三区 | 国产专区在线 | 亚洲精品电影在线观看 | 99久久免费观看 | 中文字幕第一页在线 | 亚洲一区二区三区四区五区中文 | 91天堂| 亚洲最大的黄色网址 |