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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機計算器程序代碼 數碼管顯示加矩陣鍵盤加電路介紹

[復制鏈接]
ID:76127 發表于 2015-4-16 03:13 | 顯示全部樓層 |閱讀模式
51單片機做的計算器程序代碼 姬家寨電子科技實驗室 程序編程:姬學瑞   版權所有,侵權必究!51hei補充:程序采用stc單片機強推挽輸出免去了驅動芯片,電路圖很簡單這里不畫了
電路介紹:矩陣鍵盤接在接在P1口,八位數碼管八個段選接p0口,8個位選接p2口,電路簡單吧,程序已經測試通過了.

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

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

  62.   while(1)
  63.     {
  64.       P1 = 0xF0;
  65.       if((P1 & 0xF0) != 0xF0)                       //--- 判斷是否有鍵按下 ---
  66.         {
  67.           DelaymS(5);                               //--- 去抖動 ---
  68.           if((P1 & 0xF0) != 0xF0)                   //--- 再判斷是否真得按下 ---
  69.             {
  70.               KeyTemp = P1 & 0xF0;                  //--- 反轉一次 ---
  71.               P1 = 0x0F;
  72.               KeyTemp |= (P1 & 0x0F);               //--- 讀取按鍵的內容 ---
  73.               Key = 0;
  74.               while(KeyTemp != KEYCODE[Key])Key ++; //--- 在代碼中尋找Key的數值 ---
  75.             
  76.               switch(CurrentFunction)
  77.                 {
  78.                   case 0:                           //--- 輸入第1個數據 ---
  79.                     if((Key >= 0) && (Key <= 9))
  80.                       {
  81.                         if(0 == GetKeyMaxFlag)
  82.                           {
  83.                             for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
  84.                             LEDBuffer[0] = Key;
  85.                             GetKeyCount++;
  86.                             if(5 == GetKeyCount)GetKeyMaxFlag = 1;
  87.                           }
  88.                       }
  89.                     else if((Key >= 10) && (Key <= 13))
  90.                       {
  91.                         NumberA = 0;
  92.                         i = 4;
  93.                         while(i >= 0)
  94.                           {
  95.                             if(16 != LEDBuffer[i])
  96.                               NumberA = NumberA * 10 + LEDBuffer[i];
  97.                             i --;
  98.                           }
  99.                         CurrentFunction = 1;
  100.                         Signal = Key;
  101.                         GetKeyMaxFlag = 0;
  102.                         GetKeyCount = 0;
  103.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  104.                         LEDBuffer[0] = 0;
  105.                       }
  106.                     else if(14 == Key)
  107.                       {
  108.                         CurrentFunction = 0;
  109.                         GetKeyMaxFlag = 0;
  110.                         GetKeyCount = 0;
  111.                         NagFlag = 0;
  112.                         DotPosition = 0;
  113.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  114.                         LEDBuffer[0] = 0;
  115.                       }
  116.                     else
  117.                       {
  118.                        
  119.                       }
  120.                     break;
  121.                   case 1:
  122.                     if((Key >= 0) && (Key <= 9))
  123.                       {
  124.                         if(0 == GetKeyMaxFlag)
  125.                           {
  126.                             for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
  127.                             LEDBuffer[0] = Key;
  128.                             GetKeyCount++;
  129.                             if(5 == GetKeyCount)GetKeyMaxFlag = 1;
  130.                           }
  131.                       }
  132.                     else if(15 == Key)
  133.                       {
  134.                         NumberB = 0;
  135.                         i = 4;
  136.                         while(i >= 0)
  137.                           {
  138.                             if(16 != LEDBuffer[i])
  139.                               NumberB = NumberB * 10 + LEDBuffer[i];
  140.                             i --;
  141.                           }
  142.                         switch(Signal)
  143.                           {
  144.                             case 10:
  145.                               Result = NumberA;
  146.                               Result += NumberB;
  147.                               break;
  148.                             case 11:
  149.                               Result = NumberA;
  150.                               Result -= NumberB;
  151.                               break;
  152.                             case 12:
  153.                               Result = NumberA;
  154.                               Result *= NumberB;
  155.                               break;
  156.                             case 13:
  157.                               Result = NumberA;
  158.                               Result *= 10000;
  159.                               Result /= NumberB;
  160.                               break;
  161.                           }
  162.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  163.                         LEDBuffer[0] = 0;
  164.                         DotPosition = 0;
  165.                         NagFlag = 0;
  166.                         if(Result < 0)
  167.                           {
  168.                             Result = ~Result;
  169.                             Result ++;
  170.                             NagFlag = 1;
  171.                           }
  172.                         if(13 == Signal)//除法運算中除得結果小于0的處理
  173.                           {
  174.                             if(Result >= 1000)DotPosition = 4;
  175.                             else if(Result >= 100)DotPosition = 3;
  176.                             else if(Result >= 10)DotPosition = 2;
  177.                             else if(Result >= 1)DotPosition = 1;
  178.                             for(i=DotPosition;i<5;i++)LEDBuffer[i] = 0;
  179.                             DotPosition = 4;
  180.                           }
  181.                         else DotPosition = 0;
  182.                         i = 0;//將運算結果送出顯示緩沖區
  183.                         while(Result)
  184.                           {
  185.                             LEDBuffer[i] = Result % 10;
  186.                             Result /= 10;
  187.                             i ++;
  188.                           }
  189.                         if(1 == NagFlag)LEDBuffer[i] = 17;//運算結果為負的處理
  190.                         if(13 == Signal)//除法運算中最后位"0"的處理
  191.                           {
  192.                             j = 0;
  193.                             while(0 == LEDBuffer[j])
  194.                               {
  195.                                 for(i=0;i<sizeof(LEDBuffer);i++)
  196.                                   LEDBuffer[i] = LEDBuffer[i+1];
  197.                                 LEDBuffer[sizeof(LEDBuffer)-1]=16;
  198.                                 DotPosition--;
  199.                               }
  200.                           }
  201.                         CurrentFunction = 2;
  202.                       }
  203.                     break;
  204.                   case 2:
  205.                     if(14 == Key)
  206.                       {
  207.                         CurrentFunction = 0;
  208.                         GetKeyMaxFlag = 0;
  209.                         GetKeyCount = 0;
  210.                         NagFlag = 0;
  211.                         DotPosition = 0;
  212.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  213.                         LEDBuffer[0] = 0;
  214.                       }
  215.                     break;
  216.                 }
  217.             
  218.               while((P1 & 0x0F)!=0x0F);             //--- 等待按鍵釋放 ---
  219.             }
  220.         }
  221.       
  222.     }
  223. }
  224. //=================================================================================================
  225. //--- 定時器T0溢出中斷服務程序 ---
  226. void T0_ISR(void) interrupt 1
  227. {
  228.   TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256;       //--- 重裝T0的定時初值 ---
  229.   TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
  230.   P0 = SEGLED[LEDBuffer[LEDPointer]];                   //--- 顯示數字 ---
  231.   if((0 != DotPosition) && (DotPosition == LEDPointer))
  232.     P0 |= 0x80;                                         //--- 顯示小數點 ---
  233.   P2 = DIGLED[LEDPointer];                              //--- 數碼管的位選段選擇 ---
  234.   LEDPointer++;                                         //--- 動態掃描計數變量加1 ---
  235.   if(sizeof(LEDBuffer) == LEDPointer)LEDPointer = 0;    //--- 所有數碼管掃描完,計數歸0 ---
  236. }
復制代碼




回復

使用道具 舉報

ID:43559 發表于 2015-4-16 21:57 | 顯示全部樓層
感謝分享。
回復

使用道具 舉報

ID:126027 發表于 2016-6-9 22:49 | 顯示全部樓層
本帖最后由 Blackadmin 于 2016-6-9 22:51 編輯

unsigned char LEDPointer;為何初不用始化?????
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产精品久久精品 | 精品无码久久久久久久动漫 | 91.com视频 | av大全在线 | 午夜激情视频 | 日本激情一区二区 | 91在线电影 | 国产精品成人一区二区三区 | 99福利视频导航 | 久久久精品一区二区三区 | 成人黄色电影在线播放 | 亚洲一区二区三区四区五区午夜 | 在线观看三级av | 久久精品中文字幕 | 国产乱码精品一区二区三区忘忧草 | 欧美日韩国产一区 | 一级毛片免费 | 中文成人在线 | 亚洲一区二区三区免费在线观看 | 国产精品国产成人国产三级 | 一级黄色片在线免费观看 | 亚洲精品视频在线播放 | 91精品久久久久久久久中文字幕 | 亚洲激情在线观看 | 蜜臀久久 | 日韩视频一区二区 | 亚洲精品一区在线 | 亚洲成人自拍 | 国产成人a亚洲精品 | 日韩精品一区二区三区第95 | 久久中文字幕在线 | 国产中文 | 亚洲一区二区三区久久久 | 国产高清在线精品一区二区三区 | 久久久久国产 | 欧美成人手机视频 | 国产精品欧美一区二区三区不卡 | 国产精品一区久久久久 | 亚洲一区二区三区在线视频 |