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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵控制數碼管秒表視頻+源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:259017 發表于 2019-1-20 23:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
按鍵控制數碼管秒表
從上到下四個按鍵分別為 啟動/繼續運行按鍵 暫停按鍵  復位清零按鍵 熄屏睡眠按鍵

實際效果見視頻:
其余內容見附件:
單片機源碼:
  1. /* 包含頭文件 -------------------------------------------------------------*/
  2. #include "STC8.h"
  3. #include "intrins.h"
  4. #include "bsp_key.h"
  5. #include "bsp_led.h"
  6. #include "bsp_smg.h"
  7. /*常量聲明-----------------------------------------------------------------*/
  8. unsigned char KeySta[4]={//按鍵當前狀態
  9.         1,1,1,1
  10. };
  11. /*變量聲明 ----------------------------------------------------------------*/
  12. unsigned char sec=0;//秒時間初值
  13. unsigned char flag1s=0;//秒表運行刷新標志
  14. bit RunningFlag=0;//秒表運行標志
  15. bit ResetFlag=1;//秒表復位標志(注:鎖死定時器,避免多走,為啟動做準備)
  16. bit PauseFlag=0;//秒表暫停標志
  17. /*函數聲明 --------------------------------------------------------------  */
  18. void ConfigTimer0(unsigned int ms);                //定時器0配置函數聲明
  19. void KeyScan(void);                                //按鍵掃描函數聲明
  20. void KeyDriver(void);                        //按鍵驅動函數
  21. void StopwatchAction(void);//Stopwatch啟動函數聲明
  22. void StopwatchReset(void);//Stopwatch復位函數聲明
  23. void StopwatchPause(void);//Stopwatch暫停函數聲明

  24. void main(void)
  25. {
  26.         
  27.         EA=1;//開總中斷
  28.         
  29.         ConfigTimer0(2);//配置T0定時2ms
  30.         while(1)
  31.         {
  32.           KeyDriver();
  33.                                 if(flag1s&&RunningFlag)//運行狀態
  34.                 {
  35.                         flag1s=0;
  36.                         if(!PauseFlag)//如果暫停鍵沒有按下(暫停狀態)
  37.                         {
  38.                         sec++;
  39.                         }
  40.                         SMGBuff[0]=SMGChar[sec%10];
  41.                         SMGBuff[1]=SMGChar[sec/10%10];
  42.                         if(sec==100)//因為我總共就只有兩位數碼管,所以滿100清0
  43.                         {
  44.                                 sec=0;
  45.                         }
  46.                         }        
  47.                 else if(ResetFlag)//復位狀態
  48.                 {
  49.                         SMGBuff[0]=SMGChar[sec%10];
  50.                         SMGBuff[1]=SMGChar[sec/10%10];
  51.                 }
  52.         }
  53. }
  54. /*
  55. 函數名稱:Stopwatch啟動函數
  56. 功    能:/
  57. */
  58. void StopwatchAction(void)
  59. {
  60.         
  61.         RunningFlag=1;//運行標志置1
  62.         ResetFlag=0;//復位標志置0
  63.         PauseFlag=0;//暫停標志置0
  64. }
  65. /*
  66. 函數名稱:Stopwatch復位函數
  67. 功    能:/
  68. */
  69. void StopwatchReset(void)
  70. {
  71.         ResetFlag=1;//復位標志置1
  72.         RunningFlag=0;//運行標志置0
  73.         PauseFlag=0;//暫停標志置0
  74.         sec=0;//清零計數值
  75. }
  76. /*
  77. 函數名稱:Stopwatch暫停函數
  78. 功    能:/
  79. */
  80. void StopwatchPause(void)
  81. {
  82.         PauseFlag=1;//暫停標志置0
  83.         ResetFlag=0;//復位標志置1
  84.         RunningFlag=0;//運行標志置0
  85. }
  86. /*
  87. 函數名稱:按鍵驅動程序
  88. 功    能:檢測按鍵動作,調度相應動作函數
  89. */
  90. void KeyDriver(void)
  91. {
  92.         unsigned char i;
  93.         static unsigned char backup[4]={
  94.                 1,1,1,1
  95.         };
  96.         for(i=0;i<4;i++)//循環檢測四個按鍵
  97.         {
  98.                 if(backup[i]!=KeySta[i])//檢測按鍵動作
  99.                 {
  100.                         if(backup[i]!=0)//按鍵按下時執行動作
  101.                         {
  102.                                 if(i==0)
  103.                                         StopwatchAction();
  104.                                 else if(i==1)
  105.                                         StopwatchPause();
  106.                                 else if(i==2)
  107.                                         StopwatchReset();
  108.                                 else if(i==3)
  109.                                         _nop_();
  110.                                        
  111.                         }
  112.                         backup[i]=KeySta[i];//刷新前一次備份的值
  113.                 }
  114.         }
  115. }
  116. /*
  117. 函數名稱:按鍵掃描程序
  118. 功    能:按鍵掃描函數,須在定時器中斷中調用
  119. */
  120. void KeyScan(void)
  121. {
  122.         unsigned char i;
  123.         static unsigned char keybuf[4]={
  124.                 0xFF,0xFF,0xFF,0xFF
  125.         };
  126.         //按鍵值移入緩沖區
  127.         keybuf[0]=(keybuf[0]<<1)|KEY2;
  128.         keybuf[1]=(keybuf[1]<<1)|KEY3;
  129.         keybuf[2]=(keybuf[2]<<1)|KEY4;
  130.         keybuf[3]=(keybuf[3]<<1)|KEY5;
  131.         
  132.         for(i=0;i<4;i++)
  133.         {
  134.                 if(keybuf[i]==0x00)
  135.                 {//連續8次掃描值為0,即16ms內都是按下狀態時,可認為按鍵已穩定的按下
  136.                         KeySta[i]=0;
  137.                 }
  138.                 else if(keybuf[i]==0xFF)
  139.                 {//連續8次掃描值為1,即16ms內都是彈起狀態,可認為按鍵已穩定的彈起
  140.                         KeySta[i]=1;
  141.                 }
  142.         }
  143.         
  144. }
  145. /*
  146. 函數名稱:定時器0初始化程序
  147. 功    能:定時器0方式1 16位自動重載 12分頻
  148. */
  149. void ConfigTimer0(unsigned int ms)                //@24.000MHz
  150. {
  151.         unsigned char T0RH=0;
  152.         unsigned char T0RL=0;
  153.         unsigned long tmp;
  154.         
  155.         tmp=24000000/12;//定時器計數頻率
  156.         tmp=(tmp*ms)/1000;//計算所需的計數值
  157.         tmp=65536-tmp;//計算定時器重載值
  158.         T0RH=(unsigned char)(tmp>>8);//定時器重載值拆分為高低字節
  159.         T0RL=(unsigned char)tmp;
  160.         
  161.         TMOD &=0xF0;//清零T0的控制位
  162.         TMOD |=0x00;//配置T0為模式0
  163.         TH0=T0RH;//加載T0重載值
  164.         TL0=T0RL;
  165.         ET0=1;//使能T0中斷
  166.         TR0=1;//啟動T0
  167. }
  168. /*
  169. 函數名稱:定時器0中斷服務程序
  170. 功    能:2ms進入中斷一次
  171. */
  172. void TM0_Rountine(void) interrupt 1
  173. {
  174.         static unsigned char i=0;//動態掃描的索引
  175.         static unsigned int cnt=0;//記錄T0中斷次數
  176.         KeyScan();
  177.         if(ResetFlag)//如果暫停鍵按下,計數清零
  178.                 cnt=0;
  179.         else if(!PauseFlag)//如果暫停鍵沒有按下
  180.                 cnt++;
  181.         if(cnt>=500)
  182.         {
  183.                 cnt=0;
  184.                 flag1s=1;
  185.         }
  186.         switch(i)
  187.         {
  188.                 case 0:SMG1_EN=1;SMG2_EN=0;i++;SMG=SMGBuff[0];break;
  189.                 case 1:SMG1_EN=0;SMG2_EN=1;i=0;SMG=SMGBuff[1];break;
  190.                 default:break;
  191.         }
  192. }
復制代碼

全部資料51hei下載地址:
Template.zip (66.23 KB, 下載次數: 24)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 国产精品久久久久久久久久久免费看 | 久干网 | 天天色天天射天天干 | 在线激情视频 | 亚洲国产精品久久 | 欧美a在线| 亚洲网站在线观看 | 日韩成人在线免费观看 | 亚洲国产一区二区三区在线观看 | 91久久国产综合久久 | 一二三区视频 | 成人午夜影院 | 成人影院在线观看 | 欧美一级毛片久久99精品蜜桃 | 久久国产精品免费视频 | 国产免费一区二区三区免费视频 | 精品久久ai电影 | 成年人的视频免费观看 | 玖玖免费| 国产精品精品久久久 | 中文字幕 在线观看 | 精品一区二区av | 一级aaaaaa毛片免费同男同女 | 国产精品久久久久久久久久久久久 | 亚洲国产中文字幕 | 日韩高清国产一区在线 | 欧美一区久久 | 中文字幕精品视频 | 亚洲视频国产视频 | 一区二区三区在线播放视频 | 天天拍天天操 | 成人免费视屏 | 色在线看| 91视频在线| 国产精品网页 | 在线一级片| 精品久久久久久亚洲精品 | 国产精品明星裸体写真集 | 日韩一级免费电影 | 国产一区二区自拍 |