今天咱聊聊數(shù)碼管,其實(shí)數(shù)碼管這個(gè)器件,本身沒(méi)有什么好討論的。為什么這里作為單獨(dú)一節(jié)拿出來(lái)討論呢?個(gè)人認(rèn)為,這個(gè)小東西雖然簡(jiǎn)單,實(shí)際使用過(guò)程中,其實(shí)包含了很多。單片機(jī)知識(shí)以外的內(nèi)容,譬如一些簡(jiǎn)單的編程技巧、編程與實(shí)際現(xiàn)象的關(guān)聯(lián),非常值得入門者認(rèn)真思考。因?yàn)樵诮窈蟮碾娮又飞?,遇到的情況會(huì)比這個(gè)復(fù)雜得多。所以建立一種分析問(wèn)題解決問(wèn)題的方法和思考,比掌握一種單片機(jī)或者一種外設(shè)要重要得多。 先來(lái)看看啥是數(shù)碼管吧,其實(shí)數(shù)碼管就是幾個(gè)LED并聯(lián)的產(chǎn)物,看下圖的數(shù)碼管: 這是一個(gè)常用的二位8段數(shù)碼管,可以看到有7個(gè)段位和1個(gè)小數(shù)點(diǎn),其實(shí)對(duì)于每一個(gè)段位,內(nèi)部都有與之對(duì)應(yīng)的一個(gè)LED。 上圖中右上角給出了每個(gè)段位的稱號(hào),分別是abcdefg和dp,dp指的就是小數(shù)點(diǎn)。上圖中的03621A和03621B說(shuō)明的就是:這8個(gè)LED在內(nèi)部的連接方式。值得注意的是,03621A中,所有LED的陽(yáng)極都連接到了一起,稱之為共陽(yáng)極數(shù)碼管。不難判斷,abcdefg和dp需要給個(gè)低電平,才能使得LED導(dǎo)通發(fā)光。03621B中,所有LED的陰極都連接到了一起,稱之為共陰極數(shù)碼管。不難判斷,abcdefg和dp需要給個(gè)高電平,才能使得LED導(dǎo)通發(fā)光;因?yàn)檫@是個(gè)兩位的數(shù)碼管,所以還設(shè)置了DIG1和DIG2來(lái)控制那位數(shù)碼管進(jìn)行顯示。 舉個(gè)栗子:在共陽(yáng)極數(shù)碼管中,陽(yáng)極連接到電源。如果要顯示數(shù)字“1”,那么就需要a和c這兩個(gè)段位一個(gè)低電平,其它為高,使得這兩段位的LED發(fā)光即可。So,a-g的編碼就是0101111,以此類推,0-9均可以通過(guò)abcdefg的賦值來(lái)通過(guò)顯示。小數(shù)則可以通過(guò)dp段的賦值來(lái)顯示。好玩一點(diǎn)的話,整個(gè)16進(jìn)制0-f都可以顯示,特別值得一提的是。共陰極和共陽(yáng)極的輸入編碼是不一樣的在共陽(yáng)極數(shù)碼管中,如果要顯示數(shù)字“1”,a-g分別輸入0101111 。而在共陽(yáng)陰極數(shù)碼管中,如果要顯示數(shù)字“1”,a-g分別輸入1010000。 到這里,數(shù)碼管的內(nèi)部結(jié)構(gòu)應(yīng)該有了個(gè)大致的了解,來(lái)一起玩玩吧。上個(gè)洞洞板圖 背部飛線,焊接功底比較差,請(qǐng)隨性鄙視 上個(gè)原理圖吧 三極管在這里不是用于信號(hào)放大,而是作為一個(gè)開(kāi)關(guān)器件,完成對(duì)位的選通。其余每個(gè)段位都使用1k左右的電阻作為限流,這個(gè)限流電阻值的選取,需要考慮端口的灌電流能力。特別注意a-dp,完全使用P2的8個(gè)端口,加上P1.7,總共消耗9個(gè)IO口 上代碼
這段代碼里面有個(gè)數(shù)組disp_cache,第一個(gè)元素disp_cache[0]=0xC0,換做二進(jìn)制便是1100 0000。 對(duì)照數(shù)碼管的段位,dp至a的電平便是1100 0000,abcdef都亮,g和dp不亮,也就形成的數(shù)字“0”。以此類推,disp_cache[1]- disp_cache[9]則分別代表了數(shù)字“1”-“9”,所以,咱進(jìn)行數(shù)碼管顯示的時(shí)候 只需要關(guān)注disp_cache[i]里面i這個(gè)變量就行了。方便不少,這種簡(jiǎn)單有效的編程技巧,會(huì)有助于代碼更加簡(jiǎn)潔,主函數(shù)里面。將smgbit,也就是p1.7位置1。這個(gè)時(shí)候,DIG1端口的三極管導(dǎo)通。DIG1口相當(dāng)于直接連接至Vcc,而DIG2則與Vcc斷開(kāi)。然后在for循環(huán)里面,每500ms對(duì)i從0-9自加操作。同時(shí)在P2口輸出disp_cache[i],也就是數(shù)碼管從0-9進(jìn)行顯示,看實(shí)際運(yùn)行情況 這樣就完成了一個(gè)基礎(chǔ)的數(shù)碼管顯示,但是回頭想想.咱這可是2位的數(shù)碼管喲!如果按照這種顯示方式,同時(shí)顯示2位的話,需要占用8+1+8+1=18個(gè)IO口.單片機(jī)硬件資源消耗情況實(shí)在太夸張了. 如何解決? 一是采用ASIC來(lái)驅(qū)動(dòng)數(shù)碼管,這種方式一來(lái)會(huì)增加硬件成本,二來(lái)要研究ASIC復(fù)雜的協(xié)議.另外一種就是掃描的顯示方式了,所謂掃描顯示,就是利用人眼的視覺(jué)暫留原理'.這個(gè)原理在現(xiàn)實(shí)生活中用的非常廣泛,譬如電源、搖搖棒等等!每次只顯示一位數(shù)碼管,在ms的時(shí)間內(nèi)進(jìn)行切換.譬如要顯示”13”,那就先顯示1,再切換顯示3.切換時(shí)間不超過(guò)十多ms的話,人眼會(huì)認(rèn)為是同時(shí)顯示的.這種方式可以較少IO口的使用,同時(shí)降低功耗 上個(gè)代碼
在這段代碼中,Init()用于初始化定時(shí)器,1ms中斷,同時(shí)兩位數(shù)碼管只有其中一位可以顯示.SMG_Dis()用于進(jìn)行掃描顯示,如果smgbit1和smgbit2.哪個(gè)選通,哪個(gè)就進(jìn)行顯示,中斷服務(wù)函數(shù)中,處理定時(shí)器事宜,每100ms進(jìn)行一次自加.并且每次中斷都將smgbit1和smgbit2取反,保證每次只顯示其中一位.看看運(yùn)行效果 上面的動(dòng)圖中,基本計(jì)數(shù)顯示的功能是達(dá)到了,但是,似乎個(gè)位的走動(dòng)會(huì)影響到十位的顯示.其實(shí)就是數(shù)碼管在刷新下一個(gè)數(shù)據(jù)時(shí),上次的數(shù)據(jù)會(huì)留有余暉導(dǎo)致的.也就是傳說(shuō)中的數(shù)碼管鬼影.鬼影的消除,無(wú)非就是兩種,加延時(shí)和數(shù)據(jù)清零.這里使用數(shù)據(jù)清零的辦法,把中斷函數(shù)做個(gè)簡(jiǎn)單處理
增加一句P2 = 0xff;及時(shí)對(duì)數(shù)碼管的顯示數(shù)據(jù)進(jìn)行清零.用來(lái)對(duì)暫態(tài)數(shù)據(jù)進(jìn)行清除 看效果 可以看出來(lái),基本上殘影都被消除掉了.其實(shí)鬼影的出現(xiàn),并非是代碼思路有問(wèn)題.而是一些外部器件的特性使然.今后碰到的器件,很可能會(huì)有類似的情況.養(yǎng)成遇山開(kāi)路、遇水搭橋的思維習(xí)慣,才是學(xué)習(xí)單片機(jī)的捷徑. Ok,今天就討論到這里. 了解更多51系列教程,請(qǐng)關(guān)注“云漢電子社區(qū)”官方微信公眾號(hào),關(guān)注后回復(fù)'活動(dòng)'可免費(fèi)參與社區(qū)最新活動(dòng),有機(jī)會(huì)獲得電子類圖書(shū)以及京東購(gòu)物卡! |
|