上篇文章作者給大家介紹了單片機如何控制單個數碼管教程,感興趣的朋友可以點擊我的頭像進行觀看,接下來作者給大家介紹如何利用單片機控制多位數碼管顯示不同的數字,並且分享使用單片機實現一個簡單的計數器項目源碼。
文章涉及到的電路圖和程序源碼大家可以關注作者,回覆:「下載-單片機自學教程2」即可獲取,注意數字2前面不要加空格。仿真軟體的安裝以及破解教程,關注作者後會自動推送給你,歡迎大家前往下載。
有些人會問單片機控制一位數碼管和控制多位數碼管有什麼不同呢?首先我們看一下電路上的不同,電路見下圖,圖中為4位共陰級數碼管,4位數碼管的A-B-C-D-E-F-G-Dp共用了單片機P2口。看到這裡,我請大家思考一下,我們要如何實現數碼管顯示不同的數字呢?或許會有朋友問了,為什麼要共用單片機P2呢?這是因為單片機的資源有限,不可能使用這麼多的IO口來做數碼管顯示。如果不共用P2.0,單片機的IO口開銷太大。實際應用中,不可能用如此多的IO來控制數碼管。
作者在第一次看到這個圖的時候,感覺一臉「懵逼」,心想這這麼可能實現嗎?明顯同一時刻只能顯示一個數碼管,實際也確實是這樣子的,同一時刻只能讓一個數碼管顯示數字。那麼我們到底如何實現多位數碼管顯示呢?這裡要引入「刷新頻率」這個概念了,比如現在的手機屏幕刷新頻率可以做到120Hz,也就是說一秒鐘手機屏幕刷新120次。一般來說當事物刷新頻率超過50Hz的時候,我們人眼就感知不到事物的變化了。也就是說,在很短的時間內,只要我們讓圖中四位數碼管顯示不同的數字,便可以騙過人的眼睛,讓人感覺數碼管再顯示不同的數字,這樣我們就可以用這個電路來實現計數器了。
核心代碼如下:
備註:按鍵每按下一次,計數變量SysDataVar.u16SegNumber增加1,增加後的數字實時顯示在數碼管上面。刷新頻率計算:每5ms掃描一次,一共有4個數碼管,所以F=1000ms/5ms/4=50Hz。
if(pTIM_Delay(2,4))//定時2 每5ms執行一次
{
switch(SEGnumber)
{
case 0x00:
{
CloseALLSEG();
LED =SEG_ComAnodeTable[SysDataVar.u16SegNumber/1000];
OpenOneSEG(0);
}break;
case 0x01:
{
CloseALLSEG();
LED =SEG_ComAnodeTable[SysDataVar.u16SegNumber%1000/100];
OpenOneSEG(1);
}break;
case 0x02:
{
CloseALLSEG();
LED = SEG_ComAnodeTable[SysDataVar.u16SegNumber%100/10];
OpenOneSEG(2);
}break;
case 0x03:
{
CloseALLSEG();
LED = SEG_ComAnodeTable[SysDataVar.u16SegNumber%10];
OpenOneSEG(3);
}break;
}
SEGnumber++;
if(SEGnumber > 3)
{
SEGnumber = 0x00;
}
}
看一下效果圖:
大家如果不明白數碼管顯示的原理,可以查看作者上一篇文章:《單片機控制數碼管顯示不同數字》,同時歡迎關注作者,及時獲取更新信息,如有不明白的地方,可以把問題私信給我或者發到評論區,謝謝。