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

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

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

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

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

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

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

5.2 LED 數(shù)碼管接口

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如程序清單5.30 所示的就是此前大家已經(jīng)熟練掌握的digitron1.h 接口,其相應的實現(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)的方法。在進行重構(gòu)時,必須優(yōu)先編寫單元測試代碼,只有這樣才能確保重構(gòu)不會破壞原有的功能。C 語言中的對外接口通常是指頭文件的內(nèi)容,即外部調(diào)用我們編寫的代碼時所必須的數(shù)據(jù)結(jié)構(gòu)、函數(shù)、宏的簽名(名字、參數(shù)和返回值的類型和順序)、常量的定義和行為等。而靜態(tài)函數(shù)和.c 文件中的宏和結(jié)構(gòu)體的定義,則不屬于對外接口。只要對外接口沒有改變,則調(diào)用者無需修改任何代碼。如果調(diào)用者與創(chuàng)建者屬于同一部門,則沒有必要拘泥于形式禁止修改對外接口。

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

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

程序清單5.32 字符段碼表

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

    第五章為深入淺出AMetal,本文內(nèi)容為5.3 鍵盤掃描接口和5.4 PWM 接口。
    的頭像 發(fā)表于 12-07 08:16 ?7164次閱讀
    詳解<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深入淺出新手篇,很好的單片機學習資料。
    發(fā)表于 03-21 17:43 ?128次下載

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

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

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

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

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

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