找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4146|回復(fù): 0
收起左側(cè)

單片機(jī)按鍵控制數(shù)碼管秒表視頻+源程序

[復(fù)制鏈接]
ID:259017 發(fā)表于 2019-1-20 23:22 | 顯示全部樓層 |閱讀模式
按鍵控制數(shù)碼管秒表
從上到下四個(gè)按鍵分別為 啟動(dòng)/繼續(xù)運(yùn)行按鍵 暫停按鍵  復(fù)位清零按鍵 熄屏睡眠按鍵

實(shí)際效果見視頻:
其余內(nèi)容見附件:
單片機(jī)源碼:
  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]={//按鍵當(dāng)前狀態(tài)
  9.         1,1,1,1
  10. };
  11. /*變量聲明 ----------------------------------------------------------------*/
  12. unsigned char sec=0;//秒時(shí)間初值
  13. unsigned char flag1s=0;//秒表運(yùn)行刷新標(biāo)志
  14. bit RunningFlag=0;//秒表運(yùn)行標(biāo)志
  15. bit ResetFlag=1;//秒表復(fù)位標(biāo)志(注:鎖死定時(shí)器,避免多走,為啟動(dòng)做準(zhǔn)備)
  16. bit PauseFlag=0;//秒表暫停標(biāo)志
  17. /*函數(shù)聲明 --------------------------------------------------------------  */
  18. void ConfigTimer0(unsigned int ms);                //定時(shí)器0配置函數(shù)聲明
  19. void KeyScan(void);                                //按鍵掃描函數(shù)聲明
  20. void KeyDriver(void);                        //按鍵驅(qū)動(dòng)函數(shù)
  21. void StopwatchAction(void);//Stopwatch啟動(dòng)函數(shù)聲明
  22. void StopwatchReset(void);//Stopwatch復(fù)位函數(shù)聲明
  23. void StopwatchPause(void);//Stopwatch暫停函數(shù)聲明

  24. void main(void)
  25. {
  26.         
  27.         EA=1;//開總中斷
  28.         
  29.         ConfigTimer0(2);//配置T0定時(shí)2ms
  30.         while(1)
  31.         {
  32.           KeyDriver();
  33.                                 if(flag1s&&RunningFlag)//運(yùn)行狀態(tài)
  34.                 {
  35.                         flag1s=0;
  36.                         if(!PauseFlag)//如果暫停鍵沒有按下(暫停狀態(tài))
  37.                         {
  38.                         sec++;
  39.                         }
  40.                         SMGBuff[0]=SMGChar[sec%10];
  41.                         SMGBuff[1]=SMGChar[sec/10%10];
  42.                         if(sec==100)//因?yàn)槲铱偣簿椭挥袃晌粩?shù)碼管,所以滿100清0
  43.                         {
  44.                                 sec=0;
  45.                         }
  46.                         }        
  47.                 else if(ResetFlag)//復(fù)位狀態(tài)
  48.                 {
  49.                         SMGBuff[0]=SMGChar[sec%10];
  50.                         SMGBuff[1]=SMGChar[sec/10%10];
  51.                 }
  52.         }
  53. }
  54. /*
  55. 函數(shù)名稱:Stopwatch啟動(dòng)函數(shù)
  56. 功    能:/
  57. */
  58. void StopwatchAction(void)
  59. {
  60.         
  61.         RunningFlag=1;//運(yùn)行標(biāo)志置1
  62.         ResetFlag=0;//復(fù)位標(biāo)志置0
  63.         PauseFlag=0;//暫停標(biāo)志置0
  64. }
  65. /*
  66. 函數(shù)名稱:Stopwatch復(fù)位函數(shù)
  67. 功    能:/
  68. */
  69. void StopwatchReset(void)
  70. {
  71.         ResetFlag=1;//復(fù)位標(biāo)志置1
  72.         RunningFlag=0;//運(yùn)行標(biāo)志置0
  73.         PauseFlag=0;//暫停標(biāo)志置0
  74.         sec=0;//清零計(jì)數(shù)值
  75. }
  76. /*
  77. 函數(shù)名稱:Stopwatch暫停函數(shù)
  78. 功    能:/
  79. */
  80. void StopwatchPause(void)
  81. {
  82.         PauseFlag=1;//暫停標(biāo)志置0
  83.         ResetFlag=0;//復(fù)位標(biāo)志置1
  84.         RunningFlag=0;//運(yùn)行標(biāo)志置0
  85. }
  86. /*
  87. 函數(shù)名稱:按鍵驅(qū)動(dòng)程序
  88. 功    能:檢測(cè)按鍵動(dòng)作,調(diào)度相應(yīng)動(dòng)作函數(shù)
  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++)//循環(huán)檢測(cè)四個(gè)按鍵
  97.         {
  98.                 if(backup[i]!=KeySta[i])//檢測(cè)按鍵動(dòng)作
  99.                 {
  100.                         if(backup[i]!=0)//按鍵按下時(shí)執(zhí)行動(dòng)作
  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. 函數(shù)名稱:按鍵掃描程序
  118. 功    能:按鍵掃描函數(shù),須在定時(shí)器中斷中調(diào)用
  119. */
  120. void KeyScan(void)
  121. {
  122.         unsigned char i;
  123.         static unsigned char keybuf[4]={
  124.                 0xFF,0xFF,0xFF,0xFF
  125.         };
  126.         //按鍵值移入緩沖區(qū)
  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.                 {//連續(xù)8次掃描值為0,即16ms內(nèi)都是按下狀態(tài)時(shí),可認(rèn)為按鍵已穩(wěn)定的按下
  136.                         KeySta[i]=0;
  137.                 }
  138.                 else if(keybuf[i]==0xFF)
  139.                 {//連續(xù)8次掃描值為1,即16ms內(nèi)都是彈起狀態(tài),可認(rèn)為按鍵已穩(wěn)定的彈起
  140.                         KeySta[i]=1;
  141.                 }
  142.         }
  143.         
  144. }
  145. /*
  146. 函數(shù)名稱:定時(shí)器0初始化程序
  147. 功    能:定時(shí)器0方式1 16位自動(dòng)重載 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;//定時(shí)器計(jì)數(shù)頻率
  156.         tmp=(tmp*ms)/1000;//計(jì)算所需的計(jì)數(shù)值
  157.         tmp=65536-tmp;//計(jì)算定時(shí)器重載值
  158.         T0RH=(unsigned char)(tmp>>8);//定時(shí)器重載值拆分為高低字節(jié)
  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;//啟動(dòng)T0
  167. }
  168. /*
  169. 函數(shù)名稱:定時(shí)器0中斷服務(wù)程序
  170. 功    能:2ms進(jìn)入中斷一次
  171. */
  172. void TM0_Rountine(void) interrupt 1
  173. {
  174.         static unsigned char i=0;//動(dòng)態(tài)掃描的索引
  175.         static unsigned int cnt=0;//記錄T0中斷次數(shù)
  176.         KeyScan();
  177.         if(ResetFlag)//如果暫停鍵按下,計(jì)數(shù)清零
  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. }
復(fù)制代碼

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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表