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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6788|回復: 3
打印 上一主題 下一主題
收起左側

求助一個51單片機控制的數(shù)碼管計算器帶小數(shù)點功能的

[復制鏈接]
跳轉到指定樓層
樓主
ID:240693 發(fā)表于 2017-10-28 19:16 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

最好有這里面的功能謝謝了或者幫忙加下小數(shù)點功能

  1. #include <REGX51.H>#define FOSC    12000000                            //--- 宏定義時鐘頻率 ---
  2. //=================================================================================================
  3. //--- 數(shù)碼管顯示定義與函數(shù)聲明區(qū) ---
  4. sfr P0M1    = 0x93;
  5. sfr P0M0    = 0x94;
  6. sfr P2M1    = 0x95;
  7. sfr P2M0    = 0x96;
  8. #define TIMER1MS    1000                            //--- 宏定義定時1ms,1000us ---
  9. unsigned char code SEGLED[] =                       //--- 顯示0~9,A~F筆段代碼表 ---
  10. {
  11. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,
  12. };
  13. unsigned char code DIGLED[] =                       //--- 數(shù)碼管顯示的位選通段代碼表 ---
  14. {
  15.   0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
  16. };
  17. unsigned char LEDBuffer[8] = {0,16,16,16,16,16,16,16};  //--- 定義的顯示緩沖區(qū) ---
  18. unsigned char LEDPointer;                               //--- 定義的掃描計數(shù)變量 ---
  19. unsigned char GetKeyCount=0;
  20. unsigned char GetKeyMaxFlag=0;
  21. unsigned long NumberA;
  22. unsigned long NumberB;
  23. long Result;
  24. unsigned char NagFlag=0;
  25. unsigned char DotPosition=0;
  26. unsigned char CurrentFunction=0;
  27. unsigned char Signal;
  28. unsigned char code KEYCODE[] =                      //--- 矩陣按鍵代碼表 --
  29. {
  30.   0x7e,0xbe,0xde,0xee,//0 1 2 3
  31.   0x7d,0xbd,0xdd,0xed,//4 5 6 7
  32.   0x7b,0xbb,0xdb,0xeb,//8 9 A b
  33.   0x77,0xb7,0xd7,0xe7,//C d E F
  34. };
  35. void DelaymS(unsigned char t)                       //--- 延時函數(shù) ---
  36. {
  37.   unsigned char i,j;
  38.   while(t --)
  39.     {
  40.       for(j=2;j>0;j--)
  41.         for(i=248;i>0;i--);                         //--- 12MHZ晶振延時約1mS ---
  42.     }
  43. }
  44. //=================================================================================================
  45. //--- main()主程序 ---
  46. void main(void)
  47. {
  48.   char i,j;
  49.   unsigned char Key;
  50.   unsigned char KeyTemp;
  51.   P0M1 = 0x00;                                      //--- 配置P0端口的P0.0~P0.7為推挽輸出模式 ---
  52.   P0M0 = 0xFF;
  53.   P2M1 = 0x00;                                      //--- 配置P2端口的P2.0~P2.7為推挽輸出模式 ---
  54.   P2M0 = 0xFF;

  55.   TMOD = 0x01;                                      //--- 配置T0為16位的定時方式 ---
  56.   TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256;       //--- 初始化T0定時1mS ---
  57.   TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
  58.   TR0 = 1;                                          //--- 啟動T0工作 ---
  59.   ET0 = 1;                                          //--- 使能T0的溢出中斷 ---
  60.   EA = 1;                                           //--- CPU開中斷 ---

  61.   while(1)
  62.     {
  63.       P1 = 0xF0;
  64.       if((P1 & 0xF0) != 0xF0)                       //--- 判斷是否有鍵按下 ---
  65.         {
  66.           DelaymS(5);                               //--- 去抖動 ---
  67.           if((P1 & 0xF0) != 0xF0)                   //--- 再判斷是否真得按下 ---
  68.             {
  69.               KeyTemp = P1 & 0xF0;                  //--- 反轉一次 ---
  70.               P1 = 0x0F;
  71.               KeyTemp |= (P1 & 0x0F);               //--- 讀取按鍵的內容 ---
  72.               Key = 0;
  73.               while(KeyTemp != KEYCODE[Key])Key ++; //--- 在代碼中尋找Key的數(shù)值 ---

  74.               switch(CurrentFunction)
  75.                 {
  76.                   case 0:                           //--- 輸入第1個數(shù)據(jù) ---
  77.                     if((Key >= 0) && (Key <= 9))
  78.                       {
  79.                         if(0 == GetKeyMaxFlag)
  80.                           {
  81.                             for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
  82.                             LEDBuffer[0] = Key;
  83.                             GetKeyCount++;
  84.                             if(8 == GetKeyCount)GetKeyMaxFlag = 1;
  85.                           }
  86.                       }
  87.                     else if((Key >= 10) && (Key <= 13))
  88.                       {
  89.                         NumberA = 0;
  90.                         i = 7;
  91.                         while(i >= 0)
  92.                           {
  93.                             if(16 != LEDBuffer[i])
  94.                               NumberA = NumberA * 10 + LEDBuffer[i];
  95.                             i --;
  96.                           }
  97.                         CurrentFunction = 1;
  98.                         Signal = Key;
  99.                         GetKeyMaxFlag = 0;
  100.                         GetKeyCount = 0;
  101.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  102.                         LEDBuffer[0] = 0;
  103.                       }
  104.                     else if(14 == Key)
  105.                       {
  106.                         CurrentFunction = 0;
  107.                         GetKeyMaxFlag = 0;
  108.                         GetKeyCount = 0;
  109.                         NagFlag = 0;
  110.                         DotPosition = 0;
  111.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  112.                         LEDBuffer[0] = 0;
  113.                       }
  114.                     else
  115.                       {

  116.                       }
  117.                     break;
  118.                   case 1:
  119.                     if((Key >= 0) && (Key <= 9))
  120.                       {
  121.                         if(0 == GetKeyMaxFlag)
  122.                           {
  123.                             for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
  124.                             LEDBuffer[0] = Key;
  125.                             GetKeyCount++;
  126.                             if(8 == GetKeyCount)GetKeyMaxFlag = 1;
  127.                           }
  128.                       }
  129.                     else if(15 == Key)
  130.                       {
  131.                         NumberB = 0;
  132.                         i = 7;
  133.                         while(i >= 0)
  134.                           {
  135.                             if(16 != LEDBuffer[i])
  136.                               NumberB = NumberB * 10 + LEDBuffer[i];
  137.                             i --;
  138.                           }
  139.                         switch(Signal)
  140.                           {
  141.                             case 10:
  142.                               Result = NumberA;
  143.                               Result += NumberB;
  144.                               break;
  145.                             case 11:
  146.                               Result = NumberA;
  147.                               Result -= NumberB;
  148.                               break;
  149.                             case 12:
  150.                               Result = NumberA;
  151.                               Result *= NumberB;
  152.                               break;
  153.                             case 13:
  154.                               Result = NumberA;
  155.                               Result *= 10000;
  156.                               Result /= NumberB;
  157.                               break;
  158.                           }
  159.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  160.                         LEDBuffer[0] = 0;
  161.                         DotPosition = 0;
  162.                         NagFlag = 0;
  163.                         if(Result < 0)
  164.                           {
  165.                             Result = ~Result;
  166.                             Result ++;
  167.                             NagFlag = 1;
  168.                           }
  169.                         if(13 == Signal)//除法運算中除得結果小于0的處理
  170.                           {
  171.                             if(Result >= 1000)DotPosition = 4;
  172.                             else if(Result >= 100)DotPosition = 3;
  173.                             else if(Result >= 10)DotPosition = 2;
  174.                             else if(Result >= 1)DotPosition = 1;
  175.                             for(i=DotPosition;i<5;i++)LEDBuffer[i] = 0;
  176.                             DotPosition = 4;
  177.                           }
  178.                         else DotPosition = 0;
  179.                         i = 0;//將運算結果送出顯示緩沖區(qū)
  180.                         while(Result)
  181.                           {
  182.                             LEDBuffer[i] = Result % 10;
  183.                             Result /= 10;
  184.                             i ++;
  185.                           }
  186.                         if(1 == NagFlag)LEDBuffer[i] = 17;//運算結果為負的處理
  187.                         if(13 == Signal)//除法運算中最后位"0"的處理
  188.                           {
  189.                             j = 0;
  190.                             while(0 == LEDBuffer[j])
  191.                               {
  192.                                 for(i=0;i<sizeof(LEDBuffer);i++)
  193.                                   LEDBuffer[i] = LEDBuffer[i+1];
  194.                                 LEDBuffer[sizeof(LEDBuffer)-1]=16;
  195.                                 DotPosition--;
  196.                               }
  197.                           }
  198.                         CurrentFunction = 2;
  199.                       }
  200.                     break;
  201.                   case 2:
  202.                     if(14 == Key)
  203.                       {
  204.                         CurrentFunction = 0;
  205.                         GetKeyMaxFlag = 0;
  206.                         GetKeyCount = 0;
  207.                         NagFlag = 0;
  208.                         DotPosition = 0;
  209.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  210.                         LEDBuffer[0] = 0;
  211.                       }
  212.                     break;
  213.                 }

  214.               while((P1 & 0x0F)!=0x0F);             //--- 等待按鍵釋放 ---
  215.             }
  216.         }

  217.     }
  218. }
  219. //=================================================================================================
  220. //--- 定時器T0溢出中斷服務程序 ---
  221. void T0_ISR(void) interrupt 1
  222. {
  223.   TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256;       //--- 重裝T0的定時初值 ---
  224.   TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
  225.   P0 = SEGLED[LEDBuffer[LEDPointer]];                   //--- 顯示數(shù)字 ---
  226.   if((0 != DotPosition) && (DotPosition == LEDPointer))
  227.     P0 |= 0x80;                                         //--- 顯示小數(shù)點 ---
  228.   P2 = DIGLED[LEDPointer];                              //--- 數(shù)碼管的位選段選擇 ---
  229.   LEDPointer++;                                         //--- 動態(tài)掃描計數(shù)變量加1 ---
  230.   if(sizeof(LEDBuffer) == LEDPointer)LEDPointer = 0;    //--- 所有數(shù)碼管掃描完,計數(shù)歸0 ---
  231. }

復制代碼






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2017-10-29 12:26 | 只看該作者
先畫出邏輯框圖,然后再寫程序就好了。
把你的框圖給出來,我給你看看。
回復

使用道具 舉報

板凳
ID:364328 發(fā)表于 2018-7-3 20:49 | 只看該作者
CurrentFunction是啥   博主只截了一小部分吧   
回復

使用道具 舉報

地板
ID:364328 發(fā)表于 2018-7-3 20:50 | 只看該作者
currentfuction啥玩意   只給了一小部分是吧
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久精品一区 | 99久久婷婷国产亚洲终合精品 | 亚洲成人精品在线观看 | 中文字幕精品一区二区三区在线 | 国产成年人视频 | 亚洲成人精品视频 | 久久久av一区 | 国产成人精品一区二区三 | 九九在线视频 | 蜜桃av鲁一鲁一鲁一鲁 | 人人cao | 欧洲一级视频 | 国产欧美一区二区精品忘忧草 | 欧美综合在线观看 | 亚洲综合色站 | 国产一级片一区二区三区 | 欧美一级欧美三级在线观看 | 国产av毛片 | 日日摸天天添天天添破 | 拍拍无遮挡人做人爱视频免费观看 | 日韩精品免费在线观看 | 欧洲性生活视频 | 国产三级日本三级 | 精品国产一区三区 | av在线免费观看网址 | 成人免费视频 | 国产视频线观看永久免费 | 欧美一二三 | 在线观看亚洲专区 | av影片在线 | 天天草视频 | 国产精品视频在线观看 | 国产精品久久久久永久免费观看 | 色综合久久88色综合天天 | 国产一级免费视频 | 久久精品国产精品青草 | 国产亚洲成av人片在线观看桃 | 日韩高清一区二区 | 中文字幕精品一区二区三区在线 | 免费在线观看成人av | 3p视频在线观看 |