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

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

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

深入淺出AMetal之LED 數(shù)碼管接口

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-10-30 15:28 ? 次閱讀

周立功教授新書《面向AMetal框架與接口編程(上)》,對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實(shí)現(xiàn)企業(yè)和個(gè)人的共同進(jìn)步。經(jīng)周立功教授授權(quán),即日起,致遠(yuǎn)電子公眾號(hào)將對(duì)該書內(nèi)容進(jìn)行連載,愿共勉之。

第五章為深入淺出AMetal,本文內(nèi)容為5.2 LED 數(shù)碼管接口。

5.2 LED 數(shù)碼管接口

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

在這里以圖4.10 所示的由2 個(gè)共陽極的LN3161BS 組成的LED 數(shù)碼管電路為例,當(dāng)輸出低電平至com0 端,且同時(shí)輸出低電平至b、c 段,則點(diǎn)亮LED 得到字符“1”,其相應(yīng)的代碼詳見程序清單5.22。

程序清單5.22 數(shù)碼管靜態(tài)顯示1 范例程序(1)

為了方便訪問,不妨將段碼存放到一個(gè)數(shù)組中,段碼傳送函數(shù)詳見程序清單5.23。

程序清單5.23 段碼傳送函數(shù)

如果要求輸出數(shù)字3,可以使用以下代碼實(shí)現(xiàn):

如果還需要加上一個(gè)小數(shù)點(diǎn)呢?“與”上0x7F 就是將最高位清零。即:

如果要求輸出段碼表中沒有的數(shù)字呢?則直接傳入對(duì)應(yīng)的段碼。即:

那到底讓那個(gè)數(shù)碼管顯示呢?這就是位碼傳送問題,其相應(yīng)函數(shù)詳見程序清單5.24。

程序清單5.24 位碼傳送函數(shù)

有了段碼和位碼傳送函數(shù),則在com0 顯示數(shù)字1 就非常簡(jiǎn)單了,詳見程序清單5.25。

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

顯然合并上述兩個(gè)函數(shù),即可同時(shí)傳送段碼和位碼信息,詳見程序清單5.26。

程序清單5.26 digitron_disp_code()顯示函數(shù)

在這里主要就是顯示數(shù)字,為了避免每次重復(fù)從段碼表中獲取相應(yīng)數(shù)字的段碼,可以寫一個(gè)用于在指定位置顯示指定數(shù)字的函數(shù),詳見程序清單5.27。

程序清單5.27 digitron_disp_num()顯示函數(shù)

由于只支持0~9 的顯示,因此需要做判斷處理,即當(dāng)num 值小于等于9 時(shí),才做顯示操作。為何不判斷大于等于0 的判斷呢?由于num 的類型是無符號(hào)類型,因此一定大于等于0,顯然還需要一個(gè)初始化函數(shù),因此將這些管腳的初始化全部放到程序清單5.28。

程序清單5.28 數(shù)碼管板級(jí)初始化函數(shù)

此時(shí)編程完畢,將相關(guān)函數(shù)接口聲明到digitron0.h 中,詳見程序清單5.29。當(dāng)后續(xù)需要調(diào)用時(shí),只需要#include "digitron0.h"就可以了。

程序清單5.29 digitron0.h 文件內(nèi)容

>>> 5.2.2 動(dòng)態(tài)顯示

如程序清單5.30 所示的就是此前大家已經(jīng)熟練掌握的digitron1.h 接口,其相應(yīng)的實(shí)現(xiàn)代碼詳見程序清單5.31。

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

程序清單5.31 digitron1.c 文件內(nèi)容

>>> 5.2.3 代碼重構(gòu)

重構(gòu)是提高代碼質(zhì)量的方法,即在不改變外部接口下優(yōu)化內(nèi)部結(jié)構(gòu)的方法。在進(jìn)行重構(gòu)時(shí),必須優(yōu)先編寫單元測(cè)試代碼,只有這樣才能確保重構(gòu)不會(huì)破壞原有的功能。C 語言中的對(duì)外接口通常是指頭文件的內(nèi)容,即外部調(diào)用我們編寫的代碼時(shí)所必須的數(shù)據(jù)結(jié)構(gòu)、函數(shù)、宏的簽名(名字、參數(shù)和返回值的類型和順序)、常量的定義和行為等。而靜態(tài)函數(shù)和.c 文件中的宏和結(jié)構(gòu)體的定義,則不屬于對(duì)外接口。只要對(duì)外接口沒有改變,則調(diào)用者無需修改任何代碼。如果調(diào)用者與創(chuàng)建者屬于同一部門,則沒有必要拘泥于形式禁止修改對(duì)外接口。

由于人們習(xí)慣用1 代表點(diǎn)亮LED,0 代表熄滅LED,所以無論數(shù)碼管是共陰極還是共陽極,段碼表的設(shè)計(jì)都應(yīng)該符合人們的日常習(xí)慣,即將與之相應(yīng)的“段碼表”中的數(shù)據(jù)設(shè)定為1 來表示點(diǎn)亮相應(yīng)的段。如果用1 來表示點(diǎn)亮LED,這恰好是共陰極數(shù)碼管的段碼。如果是共陽極的數(shù)碼管,則直接使用“~”將段碼取反,于是段碼表也就統(tǒng)一起來了。

接下來開始設(shè)計(jì)段碼表了,當(dāng)前想到的有:0123456789.-ABCDEFabcdefORPNorpn,除O 和o 之外,大小寫顯示都相同。由于字符和段碼均為一個(gè)字節(jié)表示,為了保存字符信息和其對(duì)應(yīng)的段碼信息,可以將顯示的字符與段碼數(shù)值組合在一起成為一個(gè)二維數(shù)組,建立與此相應(yīng)的段碼表,詳見程序清單5.32。

程序清單5.32 字符段碼表

訪問段碼表的接口函數(shù)詳見程序清單5.33。

程序清單5.33 段碼訪問接口函數(shù)

在解碼函數(shù)digitron_char_decode()中,使用了for 循環(huán)遍歷段碼數(shù)組,當(dāng)找到對(duì)應(yīng)的字符時(shí),返回該字符對(duì)應(yīng)的段碼。顯然這種解碼方式簡(jiǎn)單易懂,但效率較低。

由于字符本質(zhì)上是一個(gè)整數(shù),可以比較大小。如果段碼表按照字符大小進(jìn)行有序排列,則可以使用二分法進(jìn)行快速查找,即每次將待查找的字符與搜索范圍的中間字符進(jìn)行比較:若小于中間字符,則將搜索范圍縮小一半為下半部分,然后繼續(xù)搜索;若大于中間字符,則將搜索范圍縮小一半為上半部分,然后繼續(xù)搜索;若恰好相等,則查找到相應(yīng)字符。

為了使用二分法進(jìn)行查找,需要將斷碼表按照字符的大小進(jìn)行有序排列,這就需要知道段碼表中各個(gè)字符對(duì)應(yīng)的整數(shù)值,這些值可以通過查詢ASCII 碼表得到,ASCII 碼表詳見表5.7,表中僅列出了可顯示字符(32 ~ 126),共計(jì)95 個(gè),其它不可顯示字符(0 ~ 31 及127)由于不能顯示,與數(shù)碼管無關(guān),因此沒有在表中定義。

表5.7 ASCII 表(95 個(gè)可顯示字符)

基于ASCII 碼表中各個(gè)字符的對(duì)應(yīng)的整數(shù)值,可以重新定義段碼表,詳見程序清單5.34。

程序清單5.34 字符段碼表(升序排列)

字符段碼有序排列后,即可使用二分法查找,更新解碼函數(shù)的實(shí)現(xiàn)詳見程序清單5.35。

程序清單5.35 基于二分法查找的解碼函數(shù)

由此可見,相對(duì)于順序遍歷查找法,二分法實(shí)現(xiàn)的代碼略顯復(fù)雜。當(dāng)查找的范圍較小時(shí),如段碼表僅僅33 個(gè)查找項(xiàng),二分法的效率優(yōu)勢(shì)并不明顯。有沒有更好的辦法呢?

在前面定義段碼表時(shí),使用了二維數(shù)組的方式,將字符和對(duì)應(yīng)的段碼存儲(chǔ)到數(shù)組中,一個(gè)字符就占用了2 個(gè)字節(jié)的存儲(chǔ)空間,共計(jì)占用了66 字節(jié)空間。

ASCII 碼表有95 個(gè)顯示字符,對(duì)應(yīng)十進(jìn)制數(shù)的范圍為32 ~ 126。如果在建立段碼表時(shí),從第一個(gè)可顯示字符開始,按照字符順序依次將所有可顯示字符的段碼編排到一個(gè)數(shù)組中,則數(shù)組的索引就包含了字符信息,比如,0 號(hào)元素代表了32 對(duì)應(yīng)的字符,即空格,1 號(hào)元素代表了33 對(duì)應(yīng)的字符,即‘!’……如此一來,由于索引與字符存在一一對(duì)應(yīng)關(guān)系,通過索引就可以得到相應(yīng)的字符信息,因此在段碼表只需要使用一維數(shù)組存儲(chǔ)每個(gè)字符對(duì)應(yīng)的段碼就可以了。此時(shí),在對(duì)一個(gè)字符解碼時(shí),直接將字符轉(zhuǎn)換為數(shù)組索引,然后取出對(duì)應(yīng)的段碼即可,無需任何查找過程,范例程序詳見程序清單5.36。

程序清單5.36 使用一維數(shù)組存儲(chǔ)段碼(1)

由此可見,這種方式使段碼查找的時(shí)間效率達(dá)到了最優(yōu)。在段碼表中,由于很多ASCII碼數(shù)碼管并不能顯示,為了保證索引與字符的對(duì)應(yīng)關(guān)系,也必須使用0x00 表示其對(duì)應(yīng)的段碼。這在一定程度上造成了空間的浪費(fèi),95 個(gè)字符對(duì)應(yīng)的編碼數(shù)組占用的存儲(chǔ)空間大小為95 字節(jié),相比于使用二維數(shù)組的方式,多占用了29 字節(jié)。

觀察段碼數(shù)組的定義可以發(fā)現(xiàn),起始和結(jié)尾都存在一大段0x00(起始存在連續(xù)的13 個(gè)0x00,結(jié)尾存在連續(xù)的12 個(gè)0x00),為此在定義段碼數(shù)組時(shí),可以不以空格作為起始字符,將第一個(gè)段碼不為0x00 的字符('-',十進(jìn)制為45,段碼為0x40)作為段碼的起始字符,同時(shí),將段碼表末尾連續(xù)的0x00 移出,以節(jié)省內(nèi)存空間,詳見程序清單5.37。

程序清單5.37 使用一維數(shù)組存儲(chǔ)段碼(2)

此時(shí),整個(gè)一維數(shù)組占用的空間為70 個(gè)字節(jié),相對(duì)于使用二維數(shù)組的方式,僅僅多占用了4 個(gè)字節(jié)。雖然多占用了4 個(gè)字節(jié)的存儲(chǔ)空間,但是效率的提升卻是非常明顯的。

由于現(xiàn)在是直接使用段碼或字符,因此要顯示數(shù)字3 時(shí),不能再像以前那樣直接寫數(shù)字3,而應(yīng)寫字符3。比如:

比如,顯示自定義段碼,則使用以下方式編程:

比如,顯示'3.',則使用以下方式編程:

由于段碼統(tǒng)一使用1 表示點(diǎn)亮LED 段,而實(shí)際中,MiniPort-View 使用的是共陽極數(shù)碼管,因此需要將段碼取反后使用,則進(jìn)一步修改igitron_disp_scan()函數(shù),詳見程序清單5.38。

程序清單5.38 動(dòng)態(tài)掃描顯示函數(shù)

最后,將這些接口全部聲明到程序清單5.39 所示的digitron2.h 文件,實(shí)現(xiàn)相關(guān)代碼全部放到程序清單5.40 所示的digitron2.c 文件。

程序清單5.39 digitron2.h 文件內(nèi)容

程序清單5.40 digitron2.c 文件內(nèi)容

使用digitron2.h 中的接口函數(shù),同樣可以實(shí)現(xiàn)0~59 秒的計(jì)數(shù)器,代碼詳見程序清單5.41。

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

程序清單5.41(17~18)加上'0'的目的是將數(shù)字變?yōu)樽址?/p>

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

原文標(biāo)題:周立功:深入淺出AMetal——LED 數(shù)碼管接口

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    學(xué)好ametal_通用數(shù)碼管接口技術(shù),做項(xiàng)目事半功倍

    第八章為深入理解AMetal,本文內(nèi)容為8.6 通用數(shù)碼管接口
    的頭像 發(fā)表于 11-30 08:31 ?3066次閱讀
    學(xué)好<b class='flag-5'>ametal</b>_通用<b class='flag-5'>數(shù)碼管</b><b class='flag-5'>接口</b>技術(shù),做項(xiàng)目事半功倍

    詳解ametal_鍵盤掃描接口和pwm接口技術(shù)

    第五章為深入淺出AMetal,本文內(nèi)容為5.3 鍵盤掃描接口和5.4 PWM 接口。
    的頭像 發(fā)表于 12-07 08:16 ?7288次閱讀
    詳解<b class='flag-5'>ametal</b>_鍵盤掃描<b class='flag-5'>接口</b>和pwm<b class='flag-5'>接口</b>技術(shù)

    深入淺出AVR

    深入淺出AVR,一本書。
    發(fā)表于 07-15 12:02

    深入淺出玩轉(zhuǎn)FPGA

    深入淺出玩轉(zhuǎn)FPGA
    發(fā)表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發(fā)表于 08-18 10:12

    HDMI技術(shù)深入淺出

    HDMI技術(shù)深入淺出
    發(fā)表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發(fā)表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發(fā)表于 04-26 10:48

    深入淺出安防視頻監(jiān)控系統(tǒng)

    深入淺出安防視頻監(jiān)控系統(tǒng)深入淺出安防視頻監(jiān)控系統(tǒng)
    發(fā)表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發(fā)表于 08-23 10:10

    深入淺出數(shù)據(jù)分析

    深入淺出數(shù)據(jù)分析,有需要的朋友下來看看。
    發(fā)表于 01-15 14:22 ?0次下載

    STM32深入淺出新手篇

    STM32深入淺出新手篇,很好的單片機(jī)學(xué)習(xí)資料。
    發(fā)表于 03-21 17:43 ?128次下載

    深入淺出談多層面板布線技巧

    深入淺出談多層面板布線技巧
    發(fā)表于 12-13 22:20 ?0次下載

    深入淺出AMetal接口與實(shí)現(xiàn)

    《面向AMetal框架與接口的編程(上)》一書對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己
    的頭像 發(fā)表于 10-27 15:21 ?6528次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>AMetal</b><b class='flag-5'>之</b><b class='flag-5'>接口</b>與實(shí)現(xiàn)

    深入淺出數(shù)字信號(hào)處理

    深入淺出數(shù)字信號(hào)處理
    發(fā)表于 12-07 20:14 ?542次閱讀