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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于C語言的簡單計算器的加法程序

[復制鏈接]
跳轉到指定樓層
樓主
做了個簡單的計算器練手
單片機計算器仿真原理圖:


單片機源程序預覽:
  1. #include<reg52.h>

  2. sbit in1 = P2^0;                   //按鍵P2.0輸出
  3. sbit in2 = P2^1;
  4. sbit in3 = P2^2;
  5. sbit in4 = P2^3;

  6. sbit out1 = P2^4;                   //動態行變換
  7. sbit out2 = P2^5;                   //動態行變換
  8. sbit out3 = P2^6;                   //動態行變換
  9. sbit out4 = P2^7;                   //動態行變換

  10. unsigned char code LedChar[]={
  11.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  12.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  13.         };
  14. unsigned char KeySta[4][4] = {
  15.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  16.         };
  17. unsigned char LedBuff[6] = {
  18.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  19.         };
  20. unsigned char code KeyCodeMap[4][4] = { //矩陣按鍵編號到標準鍵盤鍵碼的映射表
  21.     { 0x31, 0x32, 0x33, 0x26 }, //數字鍵1、數字鍵2、數字鍵3、向上鍵
  22.     { 0x34, 0x35, 0x36, 0x25 }, //數字鍵4、數字鍵5、數字鍵6、向左鍵
  23.     { 0x37, 0x38, 0x39, 0x28 }, //數字鍵7、數字鍵8、數字鍵9、向下鍵
  24.     { 0x30, 0x1B, 0x0D, 0x27 }  //數字鍵0、ESC鍵、  回車鍵、 向右鍵
  25.         };
  26. void  KeyDriver();
  27. void main()
  28. {
  29.     EA = 1;       //使能總中斷
  30.     ET0  = 1;     //使能T0中斷

  31.     TMOD = 0x01;  //設置T0為模式1
  32.     TH0 = 0xDC;
  33.         TL0 = 0x00;
  34.     TR0  = 1;     //啟動T0

  35.         P1=0xFF;

  36.     LedBuff[0] = LedChar[0];  //上電顯示0
  37.        
  38.     while (1)
  39.     {
  40.         KeyDriver();   //調用按鍵驅動函數
  41.     }
  42. }

  43. void ShowNumber(unsigned long num)
  44. {
  45.         signed char i;
  46.         unsigned char buf[6];

  47.         for(i=0; i<6; i++)
  48.         {
  49.                 buf[i] = num % 10;
  50.                 num = num / 10;
  51.         }

  52.         for(i=5; i>=1; i--)
  53.         {
  54.                 if(buf[i] == 0)
  55.                 {
  56.                         LedBuff[i] = 0xFF;
  57.                 }
  58.                 else
  59.                         break;
  60.         }
  61.        
  62.         for(; i>=0; i--)
  63.         {
  64.                 LedBuff[i] = LedChar[buf[i]];       
  65.         }

  66. }
  67. void KeyAction(unsigned char keycode)
  68. {
  69.         static unsigned long result = 0;
  70.         static unsigned long addend = 0;
  71.        
  72.         if((keycode >= 0x30) &&(keycode <= 0x39))
  73.         {
  74.                 addend = (addend *10) + (keycode - 0x30);   
  75.                 ShowNumber(addend);
  76.         }
  77.        
  78.         else if(keycode == 0x26)
  79.         {
  80.                 result += addend;
  81.                 addend = 0;
  82.                 ShowNumber(result);
  83.         }
  84.         else if(keycode == 0x0D)
  85.         {
  86.                 result += addend;
  87.                 addend = 0;
  88.                 ShowNumber(result);
  89.         }
  90.         else if(keycode == 0x1B)
  91.         {
  92.                 addend = 0;
  93.                 result = 0;
  94.                 ShowNumber(addend);        
  95.         }       
  96.          
  97. }
  98. void  KeyDriver()
  99. {
  100.         unsigned char i, j;
  101.         static        unsigned char backup [4][4] = {
  102.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  103.         };

  104.         for(i=0; i<4; i++)
  105.                 {
  106.                         for(j=0; j<4; j++)
  107.                         {
  108.                                 if(backup[i][j] != KeySta[i][j])
  109.                                 {
  110.                                         if(backup[i][j] == 0)
  111.                                         {
  112.                                                 KeyAction(KeyCodeMap[i][j]);
  113.                                         }
  114.                                         backup[i][j] = KeySta[i][j];
  115.                                 }
  116.                         }       
  117.                 }

  118.        
  119. }

  120. /* 按鍵掃描函數,需在定時中斷中調用,推薦調用間隔1ms */
  121. void KeyScan()
  122. {
  123.     unsigned char i;
  124.     static unsigned char keyout = 0;   //矩陣按鍵掃描輸出索引
  125.     static unsigned char keybuf[4][4] = {  //矩陣按鍵掃描緩沖區
  126.         {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
  127.         {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}
  128.     };

  129.     //將一行的4個按鍵值移入緩沖區
  130.     keybuf[keyout][0] = (keybuf[keyout][0] << 1) | in1;
  131.     keybuf[keyout][1] = (keybuf[keyout][1] << 1) | in2;
  132.     keybuf[keyout][2] = (keybuf[keyout][2] << 1) | in3;
  133.     keybuf[keyout][3] = (keybuf[keyout][3] << 1) | in4;
  134.     //消抖后更新按鍵狀態
  135.     for (i=0; i<4; i++)  //每行4個按鍵,所以循環4次
  136.     {
  137.         if ((keybuf[keyout][i] & 0x0F) == 0x00)
  138.         {   //連續4次掃描值為0,即4*4ms內都是按下狀態時,可認為按鍵已穩定的按下
  139.             KeySta[keyout][i] = 0;
  140.         }
  141.         else if ((keybuf[keyout][i] & 0x0F) == 0x0F)
  142.         {   //連續4次掃描值為1,即4*4ms內都是彈起狀態時,可認為按鍵已穩定的彈起
  143.             KeySta[keyout][i] = 1;
  144.         }
  145.     }
  146.     //執行下一次的掃描輸出
  147.     keyout++;                //輸出索引遞增
  148.     keyout = keyout & 0x03;  //索引值加到4即歸零
  149.     switch (keyout)          //根據索引,釋放當前輸出引腳,拉低下次的輸出引腳
  150.     {
  151.         case 0: out1 = 0; out2 = 1; out3 = 1;out4 = 1; ; break;         //當我按下第一行的按鍵,只有keyout==0時符合條件
  152.                 case 1: out1 = 1; out2 = 0; out3 = 1;out4 = 1; ; break;
  153.                 case 2: out1 = 1; out2 = 1; out3 = 0;out4 = 1; ; break;
  154.                 case 3: out1 = 1; out2 = 1; out3 = 1;out4 = 0; ; break;
  155.                 default: break;
  156.     }
  157. }
  158. /* 數碼管動態掃描刷新函數,需在定時中斷中調用 */
  159. void LedScan()
  160. {
  161.     static unsigned char i = 0;  //動態掃描的索引
  162.    
  163.     P0 = 0xFF;   //顯示消隱
  164.     switch (i)
  165.     {
  166.         case 0:P1=0xFE; i++; P0=LedBuff[0];break;
  167.                 case 1:P1=0xFD; i++; P0=LedBuff[1];break;
  168.                 case 2:P1=0xFB; i++; P0=LedBuff[2];break;
  169.                 case 3:P1=0xF7; i++; P0=LedBuff[3];break;
  170.                 case 4:P1=0xEF; i++; P0=LedBuff[4];break;
  171.                 case 5:P1=0xDF; i=0; P0=LedBuff[5];break;
  172.                 default:break;
  173.     }
  174. }

  175. /* T0中斷服務函數,用于數碼管顯示掃描與按鍵掃描 */
  176. void InterruptTimer0() interrupt 1
  177. {
  178.         TH0 = 0xDC;
  179.         TL0 = 0x00;
  180.         LedScan();
  181.         KeyScan();
  182. }
復制代碼


所有資料打包下載:
簡單的計算器加法程序.zip (79.82 KB, 下載次數: 21)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2016-12-3 23:45 | 只看該作者
51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线免费观看 | 热99视频| www.久久久久久久久 | 波多野吉衣久久 | 午夜视频免费在线观看 | 中文字幕一区在线观看视频 | 欧美黄色免费网站 | 成年人精品视频 | 亚洲最大的黄色网址 | 成人精品在线观看 | 在线观看中文字幕 | 日韩一区二区三区在线视频 | av黄色在线观看 | 亚洲精品一区二区 | 中文字幕成人免费视频 | 精品欧美一区二区中文字幕视频 | 国产精品中文字幕在线 | 成人亚洲网 | 国产成人精品网站 | 91人人视频在线观看 | 日日碰狠狠躁久久躁96avv | 青青草这里只有精品 | 女同av亚洲女人天堂 | 精品免费国产视频 | 911影院 | 成人精品视频99在线观看免费 | 一级毛片成人免费看a | 亚洲成人一区二区在线 | 精品国产一区二区三区久久影院 | 在线视频国产一区 | 艹逼网| av中文在线 | 男女下面一进一出网站 | 国产成人99久久亚洲综合精品 | 久久国产一区二区三区 | 国产精品久久视频 | 亚洲永久免费观看 | 欧美日本免费 | 国产一级在线观看 | 国产精品久久一区二区三区 | 欧美亚洲网站 |