【1】題目要求
新建工程,以I/O模式編寫代碼,在CT107D單片機綜合訓練平臺上,實現(xiàn)以下功能:
1、系統(tǒng)上電后,關閉蜂鳴器和繼電器,關閉全部指示燈,數(shù)碼管最右邊兩位顯示計數(shù)初始值28,其余數(shù)碼管關閉。
2、利用定時器0實現(xiàn)10ms的間隔定時,將其作為長定時的基本單位,用于記錄按鍵按下的持續(xù)時間。
3、將J5的23腳短接,把S4設置為獨立按鍵。
4、循環(huán)掃描S4按鍵,按下時間小于1秒為短按,數(shù)碼管上的數(shù)字加1,超過最大值99后恢復00,繼續(xù)計數(shù);S4按鍵按下的時間大于1秒為長按,數(shù)碼管上的計數(shù)清除為00。?
5、在按鍵掃描和處理的過程中,不能干擾數(shù)碼管正常顯示,避免出現(xiàn)按鍵誤觸發(fā)和一次按鍵多次處理的情況。
【小提示】:按鍵的長按與短按實現(xiàn)原理,可見本博客:《【CC2530強化實訓01】普通延時函數(shù)實現(xiàn)按鍵的長按與短按》。文章來源:http://www.zghlxwxcb.cn/news/detail-406726.html
【2】核心源碼
/*==================藍橋杯單片機特訓==================
【進階02】:長按與短按控制數(shù)碼管顯示
**平 臺:CT107D單片機綜合實訓平臺
**模 式:IO模式
**設 計:歐浩源(小蜜蜂老師,ohy3686@qq.com)
**時 間:2022-03-31
**更多詳見:www.xmf393.com
====================================================*/
#include "reg52.h"
sbit S4 = P3^3;
//定義動態(tài)顯示中單個數(shù)碼管點亮時長
#define TSMG 500
//-------共陽數(shù)碼管的段碼編碼表(無小數(shù)點)--------
//0 1 2 3 4 5 6 7 8 9 A b C D E F - .
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char num = 28; //定義計數(shù)變量
bit F_key = 0; //按鍵按下標志
unsigned int count_t = 0; //10ms單位累計
void Display_Num(); //聲明數(shù)碼管顯示函數(shù)
/*====鎖存器設置和數(shù)碼管顯示的代碼參考前面的案例====*/
//===================定時器T0初始化===================
void Init_Timer0()
{
//定時器計數(shù)初值設置
TH0 = (0 - 10000) / 256;
TL0 = (0 - 10000) % 256;
TMOD = 0x01; //模式1:16位非重裝模式
ET0 = 1; //使能定時器0中斷
EA = 1; //打開總中斷
TR0 = 1; //啟動定時器0
}
//===============定時器T0的中斷服務函數(shù)================
void Service_Timer0() interrupt 1
{
TH0 = (0 - 10000) / 256;
TL0 = (0 - 10000) % 256;
if(F_key == 1) //在按鍵按下期間進行計數(shù)
{
count_t++; //按鍵按下的持續(xù)時間
}
}
//==================按鍵掃描處理函數(shù)===================
void Scan_Keys()
{
if(S4 == 0)
{
DelaySMG(1000); //去抖動處理
if(S4 == 0) //確認為按下信號
{
count_t = 0; //時間計數(shù)變量清0
F_key = 1; //標志按鍵按下狀態(tài)
while(S4 == 0) //等待按鍵松開
{
Display_Num(); //在按下期間保持數(shù)碼管正常顯示
}
F_key = 0; //標志按鍵松開狀態(tài)
if(count_t > 50) //按下時間大于1秒,長按
{
num = 0; //數(shù)碼管計數(shù)清除為00
}
else //按下時間小于1秒,短按
{
num++; //數(shù)碼管計數(shù)加1
if(num == 100)
{
num = 0; //計數(shù)超出最大值99后恢復00
}
}
}
}
}
【注】:更多關于藍橋杯單片機備賽內容,詳見《藍橋杯單片機設計與開發(fā)》小蜜蜂特訓手冊,本站可下載,相關更多藍橋杯的案例完整源碼及學習備賽筆記,歡迎進入“小蜜蜂筆記”公眾號。文章來源地址http://www.zghlxwxcb.cn/news/detail-406726.html
到了這里,關于藍橋杯單片機 | 特訓案例【進階02】長按與短按控制數(shù)碼管顯示的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!