0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解led數(shù)碼管的接口編程技術(shù)

UtFs_Zlgmcu7890 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-12-09 08:17 ? 次閱讀

第四章為面向接口編程,本文內(nèi)容包括:4.3 LED 數(shù)碼管。

4.3 LED 數(shù)碼

>>> 4.3.1 靜態(tài)顯示

如圖4.10 所示是由2 個共陽極的LN3161BS 組成的LED 數(shù)碼管電路,R1~R8 為限流電阻,c1 和c2在內(nèi)部并聯(lián)連接。如果將段選端a~dp 與位選端com0、com1 連接到AM824-Core 的PIO0_8~PIO0_15 與PIO0_17、PIO0_23,則通過程序即可控制筆段的亮滅。由于數(shù)碼管的8 個段選端全部都要經(jīng)過com 口才能得到供電,因此需要增加三極管提高com 口的驅(qū)動電流,以彌補(bǔ)LPC824 GPIO 驅(qū)動電流的不足。當(dāng)com 為低電平時三極管導(dǎo)通,則數(shù)碼管的c1、c2 為高電平,即選通數(shù)碼管。此時只要數(shù)碼管的任一段選端為低電平,則點(diǎn)亮數(shù)碼管相應(yīng)的筆段。

圖4.10 LED 顯示器電路

MiniPort-View 數(shù)碼管模塊通過MiniPort B(排母)與AM824-core 相連,同時將其余不使用的I/O 通過MiniPort A(排針)引出,實(shí)現(xiàn)模塊的橫向堆疊,其對應(yīng)AM824-Core 的MiniPort 接口J4的功能定義詳見圖4.11。

圖4.11 數(shù)碼管模塊實(shí)物與接口定義

“日”形數(shù)字顯示除了能夠顯示10 進(jìn)制數(shù)字0~9,有時也用于顯示16 進(jìn)制字母AbCdEF 或其它一些非常簡單的符號。按照二進(jìn)制的計(jì)算方法,8 段顯示有256 種組合,去掉“點(diǎn)(dp)”的顯示,其筆段的組合為128 種(27),而數(shù)字0~9 只有10 個符號,因此要想得到我們希望的顯示符就必須對顯示段進(jìn)行編碼。顯然,如果要想點(diǎn)亮數(shù)碼管的某一個筆段,則只需將對應(yīng)的筆段置0就可以了。即輸出低電平至com0 端,同時輸出低電平至b、c 段,點(diǎn)亮LED 得到字符“1”。由此可見,按照數(shù)字的筆畫排列,則很容易得到10 個數(shù)字0~9 共10 個顯示字符,七段共陽數(shù)碼管10 個數(shù)字段碼表詳見表4.2。

表4.2 七段共陽極數(shù)碼管段碼表

如果以8 位數(shù)值表示段碼,當(dāng)其相應(yīng)位為0 時,則表示對應(yīng)的段點(diǎn)亮。bit7~0 分別與dp~a 對應(yīng),假設(shè)bit0 為0,即點(diǎn)亮a。為了方便訪問,不妨將段碼存放到一個數(shù)組中。即:

AMetal 軟件包提供了熄滅所有數(shù)碼管的板級初始化函數(shù)、段碼傳送函數(shù)、位碼傳送函數(shù)和數(shù)字顯示掃描函數(shù),其函數(shù)接口詳見程序清單4.10。

程序清單4.10 digitron0.h 接口

其中,code 為待顯示數(shù)字0~9 所對應(yīng)的段碼,pos 為com0 或com1 對應(yīng)的數(shù)字下標(biāo)(0~1),num 為待顯示的數(shù)字0~9。當(dāng)后續(xù)調(diào)用這些函數(shù)時,則只需要“#include "digitron0.h"”就可以了。比如,在com0 數(shù)碼管上顯示數(shù)字1,詳見程序清單4.11。

程序清單4.11 靜態(tài)顯示數(shù)字1 范例程序

如果讓單個數(shù)碼管循環(huán)顯示0~9,且循環(huán)的時間為1s,顯然顯示時間也是1s,那么這就是一個簡單的秒計(jì)數(shù)器,詳見程序清單4.12。

程序清單4.12 秒計(jì)數(shù)器范例程序

當(dāng)你看到程序清單4.12(9)中的“i = (i + 1) % 10;”代碼時,是否有一種似曾相識的感覺呢?這行代碼是從LED 流水燈實(shí)驗(yàn)中提煉出來的。如果需要倒計(jì)時呢?則將其修改為“i= ((i – 1) + 10) % 10;”。如果要從9 開始倒計(jì)數(shù)呢?那就將i 的初始值修改為9。至此已經(jīng)實(shí)現(xiàn)了0~9 的循環(huán)顯示,能否循環(huán)顯示0~99 呢?這就是下面將要介紹的數(shù)碼管動態(tài)掃描顯示。

>>> 4.3.2 動態(tài)顯示

如果要顯示多位數(shù)字,則需將多個數(shù)碼管并接在一起使用。此時將會出現(xiàn)一大堆段選端的問題,比如,兩位數(shù)碼管需要2×8=16 個段選信號,而LPC824 一共才16 個I/O,無法滿足需求,同時管腳使用越多,連線也會變得越復(fù)雜。所以為避免使用過多的管腳而造成資源浪費(fèi)和連線復(fù)雜,人們發(fā)明了一種動態(tài)掃描方式來實(shí)現(xiàn)多個數(shù)碼管的顯示。

由于數(shù)碼管的段碼是連接在一起的,那么同一時刻兩個數(shù)碼管的段碼必然是相同的,如果簡單地使2 個公共端(com)均有效來實(shí)現(xiàn)2 個數(shù)碼管的顯示,那么必然都會顯示相同的內(nèi)容。怎么辦?分時顯示,即一段時間數(shù)碼管0 正常顯示(com0 有效,com1 無效,段碼為數(shù)碼管0 需要顯示的圖形),另外一段時間數(shù)碼管1 正常顯示(com1 有效,com0 無效,段碼為數(shù)碼管1 需要顯示的圖形)。如要顯示一個數(shù)值12?即在com0 顯示1,在com1 管顯示2,詳見程序清單4.13。

程序清單4.13 顯示數(shù)值12 范例程序

雖然在實(shí)際的操作過程中數(shù)字是輪流顯示的,但只要輪流操作的速度達(dá)到一定的范圍,那么在人眼看起來就能達(dá)到和整體顯示的效果一樣,就像我們經(jīng)??吹碾娪凹夹g(shù)一樣。

再細(xì)心觀察一下實(shí)驗(yàn)現(xiàn)象可以發(fā)現(xiàn),雖然顯示的數(shù)字是12,但是數(shù)碼管顯示的1 和2 都會有另外一個數(shù)字的影子。com0 顯示的是1,但也能看到2 的影子。

digitron_disp_num()就是digitron_com_sel ()和digitron_segcode_set()的一個簡單組合。其顯示過程是先傳送位碼、后傳送段碼,于是在傳送位碼和傳送段碼之間就產(chǎn)生了時間間隙。當(dāng)新的com 端有效時,仍然還在使用此前的段碼,所以出現(xiàn)了短暫的錯誤現(xiàn)象。怎么辦?可以在這段時間內(nèi)熄滅所有的數(shù)碼管,避免錯誤顯示。即:

那如何循環(huán)顯示0 ~ 59 呢?即將要顯示的數(shù)值加1,詳見程序清單4.14。

程序清單4.14 0~59 秒計(jì)數(shù)器范例程序(1)

程序還可以繼續(xù)優(yōu)化嗎?現(xiàn)在的問題是,為了顯示一個數(shù)據(jù),即便數(shù)據(jù)沒有改變,也必須動態(tài)掃描數(shù)碼管,否則無法顯示。首先將待顯示的數(shù)據(jù)存放到緩沖區(qū)(存儲單元),然后每隔一段時間從緩沖區(qū)讀取待顯示的數(shù)據(jù)。即:

讀緩沖區(qū)的數(shù)據(jù)實(shí)現(xiàn)動態(tài)掃描的函數(shù)詳見程序清單4.15。

程序清單4.15 動態(tài)掃描顯示函數(shù)

由此可見,緩沖區(qū)的段碼就是當(dāng)前要顯示的數(shù)據(jù),當(dāng)再次切換時,則繼續(xù)調(diào)用該函數(shù),則在下一個位顯示數(shù)據(jù),以此類推。由于位選變量pos 每次都是在上一次顯示的位的基礎(chǔ)上變化的,因此必須將其聲明為靜態(tài)變量。顯然,只要將顯示的內(nèi)容存放到緩沖區(qū)中,同時保證以一定的時間間隔(各個數(shù)碼管顯示后的延時)調(diào)用該函數(shù),即可實(shí)現(xiàn)動態(tài)掃描。

為了便于復(fù)用數(shù)碼管程序,則將上述代碼全部存放到digitron1.c 文件,函數(shù)聲明放到digitron1.h 文件。其接口如下:

(1) digitron_init():初始化相關(guān)引腳;

(2) digitron_disp_scan():動態(tài)掃描函數(shù)。

由于要將待顯示內(nèi)容存放到緩沖區(qū),同時還可能訪問段碼表,因此不允許調(diào)用者直接操作其中的變量、數(shù)組等,基于此增加3 個接口函數(shù),其分別為傳送段碼到顯示緩沖區(qū),傳送數(shù)字0~9 到顯示緩沖區(qū)與獲取待顯示數(shù)字的段碼,其相應(yīng)的代碼詳見程序清單4.16。

程序清單4.16 操作緩沖區(qū)和段碼表接口函數(shù)

如果要在com0 顯示“3.”,則可以直接這樣使用:

最后將這些接口全部聲明在程序清單4.17 所示的digitron1.h 文件中,相關(guān)的實(shí)現(xiàn)代碼詳見“深入淺出AMetal——動態(tài)顯示”介紹的digitron1.c 文件。

程序清單4.17 digitron1.h 文件內(nèi)容

注意,在digitron1.h 接口中,已經(jīng)使用digitron_disp_num_set ()和digitron_disp_code_set()替代digitron_disp_num()和digitron_disp_code(),程序清單4.18 就是通過迭代后的循環(huán)顯示0~59 秒計(jì)數(shù)器范例程序。

程序清單4.18 0~59 秒計(jì)數(shù)器范例程序(2)

>>> 4.3.3 閃爍處理

在顯示過程中,有時為了修改某位數(shù)碼管的值,需要對數(shù)碼管進(jìn)行閃爍處理。在溫度采集場合,當(dāng)溫度超過一定的值后,可以將顯示的溫度值做全閃處理,以引起觀察者注意。

實(shí)際上,只要讓數(shù)碼管顯示一段時間,熄滅一段時間,就產(chǎn)生了閃爍的效果,顯然只要直接操作緩沖區(qū)就可以了。假設(shè)每秒閃爍2 次,在個位不斷閃爍,詳見程序清單4.19。

程序清單4.19 實(shí)現(xiàn)秒計(jì)數(shù)器個位閃爍(1)

在程序中,1s 閃爍2 次,每次閃爍占用500ms,即顯示250ms,熄滅250ms。每秒結(jié)束后,秒計(jì)數(shù)器加1,顯然用同樣的方法也可以使秒計(jì)數(shù)器的十位閃爍,由此可見,實(shí)現(xiàn)閃爍僅需交替?zhèn)魉驼o@示的段碼和熄滅顯示的段碼即可。由于熄滅顯示的段碼非常特殊,固定為0xFF。因此,只要在合適的時間傳送相應(yīng)段碼即可,段碼傳送函數(shù)digitron_segcode_set()是在digitron_disp_scan()函數(shù)中調(diào)用的。通過修改該函數(shù),使其在一段時間內(nèi)傳送緩沖區(qū)中正常顯示的段碼,一段時間內(nèi)傳送熄滅顯示的段碼0xFF,也能實(shí)現(xiàn)閃爍,詳見程序清單4.20。

程序清單4.20 帶閃爍功能的digitron_disp_scan()函數(shù)(1)

程序?qū)r間分隔為500ms 的時間片,當(dāng)需要閃爍時,顯示250ms,熄滅250ms,每隔5ms 調(diào)用一次digitron_disp_scan(),cnt 循環(huán)計(jì)數(shù)+1。如何讓秒計(jì)數(shù)器十位閃爍呢?直接將if(pos == 1)修改為if(pos == 0)。

顯然,數(shù)碼管的閃爍狀態(tài)和顯示狀態(tài)可以用一個標(biāo)志位來表示,即0 表示顯示,1 表示閃爍,bit0 和bit1 分別表示com0 和com1 的狀態(tài)。定義一個全局變量如下:

如果bit1 閃爍,則將bit1 的初始值設(shè)置為1。即:

這樣一來,即可需要根據(jù)該變量的值來獲取需要閃爍的位,詳見程序清單4.21。顯然,只要將g_blink_flag 對應(yīng)的位置1 就能實(shí)現(xiàn)閃爍,否則將其對應(yīng)位清0。

程序清單4.21 帶閃爍功能的digitron_disp_scan()函數(shù)(2)

為了提高程序的可閱讀性,則進(jìn)一步優(yōu)化兩個if-else 語句,詳見程序清單4.22。

程序清單4.22 帶閃爍功能的digitron_disp_scan()函數(shù)(3)

由于g_blink_flag 變量定義在實(shí)現(xiàn)代碼中,不能直接將該變量提供給用戶修改,因此必須提供一個接口函數(shù)用于設(shè)定閃爍位,其相應(yīng)的代碼詳見程序清單4.23。

程序清單4.23 digitron_disp_blink_set()函數(shù)

digitron_disp_blink_set()的pos 用于指定設(shè)置閃爍屬性的數(shù)碼管位置,isblink 設(shè)置閃爍屬性,值為AM_TRUE 表示閃爍,AM_FALSE 表示不需要閃爍。am_bool_t 是AMetal 在am_types.h 文件中自定義的類型,該類型數(shù)據(jù)的值只可能為AM_TRUE(真)或AM_FALSE(假),設(shè)定com0 閃爍的方法如下:

設(shè)定com0 停止閃爍的方法如下:

添加digitron_disp_blink_set()的接口函數(shù),詳見程序清單4.24 所示的digitron1.h。

程序清單4.24 digitron1.h 文件內(nèi)容

有了該接口函數(shù)后,實(shí)現(xiàn)閃爍就很容易了,程序清單4.25 實(shí)現(xiàn)了秒計(jì)數(shù)器個位閃爍。

程序清單4.25 實(shí)現(xiàn)秒計(jì)數(shù)器個位閃爍(2)

由此可見,與程序清單4.18 相比,僅增加了一行代碼就實(shí)現(xiàn)了閃爍功能,顯然接口的設(shè)計(jì)非常重要。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    23071

    瀏覽量

    657076

原文標(biāo)題:周立功:面向接口的編程——LED 數(shù)碼管

文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    LED數(shù)碼管顯示控制實(shí)驗(yàn)

    實(shí)驗(yàn) LED數(shù)碼管顯示控制實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?.學(xué)會用PLC控制LED數(shù)碼管。2.采用循環(huán)掃描
    發(fā)表于 09-30 13:18 ?1.4w次閱讀
    <b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>顯示控制實(shí)驗(yàn)

    單個七段LED數(shù)碼管接口連接方法

    單個七段LED數(shù)碼管接口連接方法  單個七段LED數(shù)碼管與單片機(jī)的連接方法有2種: 1、軟譯碼連接法 2、
    發(fā)表于 12-20 03:05 ?1.3w次閱讀
    單個七段<b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>的<b class='flag-5'>接口</b>連接方法

    單片機(jī)教程二十二:LED數(shù)碼管靜態(tài)顯示接口編程

    單片機(jī)教程二十二:LED數(shù)碼管靜態(tài)顯示接口編程 在單片機(jī)系統(tǒng)中,常常用LED數(shù)碼數(shù)碼管顯示器
    發(fā)表于 05-15 23:17 ?3738次閱讀
    單片機(jī)教程二十二:<b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>靜態(tài)顯示<b class='flag-5'>接口</b>與<b class='flag-5'>編程</b>

    LED數(shù)碼管的識別

    LED數(shù)碼管的識別 數(shù)碼管一般分共陰和供陽兩種,見下圖。
    發(fā)表于 12-18 16:59 ?2150次閱讀
    <b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>的識別

    Halcon9.0編程技術(shù)詳解

    Halcon9.0編程技術(shù)詳解Halcon9.0編程技術(shù)詳解
    發(fā)表于 12-22 15:20 ?0次下載

    單片機(jī)的鍵盤及LED數(shù)碼管顯示接口

    本文主要介紹了單片機(jī)的應(yīng)用--矩陣鍵盤和LED數(shù)碼管顯示接口。
    發(fā)表于 03-25 11:38 ?7次下載

    23課:LED數(shù)碼管靜態(tài)顯示接口編程

    起來,能拼成各種各樣的圖形,LED數(shù)碼管顯示器實(shí)際上也是這么一個東西。 八段LED數(shù)碼管顯示器 單片機(jī)靜態(tài)顯示接口 八段
    發(fā)表于 11-22 12:06 ?1078次閱讀
    23課:<b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>靜態(tài)顯示<b class='flag-5'>接口</b>與<b class='flag-5'>編程</b>

    LED數(shù)碼管靜態(tài)顯示接口編程分析

    八段LED數(shù)碼管顯示器由8個發(fā)光二極組成。基中7個長條形的發(fā)光排列成“日”字形,另一個賀點(diǎn)形的發(fā)光
    的頭像 發(fā)表于 03-16 16:13 ?1.6w次閱讀
    <b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>靜態(tài)顯示<b class='flag-5'>接口</b>與<b class='flag-5'>編程</b>分析

    簡單共陽極數(shù)碼管電路圖大全(五款led數(shù)碼管電路圖詳解

    本文主要介紹了簡單共陽極數(shù)碼管電路圖大全(五款led數(shù)碼管電路圖詳解)。LED數(shù)碼管的特點(diǎn)是發(fā)光
    發(fā)表于 03-29 10:20 ?14.9w次閱讀
    簡單共陽極<b class='flag-5'>數(shù)碼管</b>電路圖大全(五款<b class='flag-5'>led</b><b class='flag-5'>數(shù)碼管</b>電路圖<b class='flag-5'>詳解</b>)

    led數(shù)碼管怎么接線_LED數(shù)碼管的測試

    本文主要介紹了LED數(shù)碼管的安裝接線方式及LED數(shù)碼管的測試方法。
    發(fā)表于 10-09 10:44 ?2.7w次閱讀

    LED數(shù)碼管的結(jié)構(gòu)_led數(shù)碼管安裝教程

    本文主要介紹了LED數(shù)碼管的結(jié)構(gòu)及安裝教程。
    發(fā)表于 10-09 14:35 ?7527次閱讀
    <b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>的結(jié)構(gòu)_<b class='flag-5'>led</b><b class='flag-5'>數(shù)碼管</b>安裝教程

    【單片機(jī)】實(shí)驗(yàn)二 LED數(shù)碼管

    【單片機(jī)】實(shí)驗(yàn)二 LED數(shù)碼管實(shí)驗(yàn)名稱 LED數(shù)碼管一、實(shí)驗(yàn)?zāi)康?.熟悉MCS-51指令系統(tǒng)。2. 理解LED七段
    發(fā)表于 12-05 09:36 ?19次下載
    【單片機(jī)】實(shí)驗(yàn)二 <b class='flag-5'>LED</b><b class='flag-5'>數(shù)碼管</b>

    靜態(tài)數(shù)碼管和動態(tài)數(shù)碼管

    目錄一,什么是數(shù)碼管二,靜態(tài)數(shù)碼管的驅(qū)動三,動態(tài)數(shù)碼管四,動態(tài)數(shù)碼管顯示編程實(shí)戰(zhàn)五,使用38譯碼器驅(qū)動動態(tài)
    發(fā)表于 01-12 18:31 ?40次下載
    靜態(tài)<b class='flag-5'>數(shù)碼管</b>和動態(tài)<b class='flag-5'>數(shù)碼管</b>

    led數(shù)碼管顯示器靜態(tài)顯示接口是什么樣的

    類型主要有以下幾種: 1.1 并行接口 并行接口是指將LED數(shù)碼管的各個段(如a、b、c、d、e、f、g、dp)分別通過數(shù)據(jù)線連接到微控制器的相應(yīng)I/O端口。并行
    的頭像 發(fā)表于 08-28 17:37 ?517次閱讀

    簡述led數(shù)碼管的類型和顯示原理

    LED數(shù)碼管是一種常見的顯示設(shè)備,廣泛應(yīng)用于各種電子設(shè)備和系統(tǒng)中。本文將介紹LED數(shù)碼管的類型和顯示原理,以幫助讀者更好地了解這種設(shè)備。 LED
    的頭像 發(fā)表于 08-29 09:11 ?540次閱讀