色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

深入淺出AMetal之LED 數碼管接口

AGk5_ZLG_zhiyua ? 來源:互聯網 ? 作者:佚名 ? 2017-10-30 15:28 ? 次閱讀

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

第五章為深入淺出AMetal,本文內容為5.2 LED 數碼管接口。

5.2 LED 數碼管接口

>>> 5.2.1 靜態顯示

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

程序清單5.22 數碼管靜態顯示1 范例程序(1)

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

程序清單5.23 段碼傳送函數

如果要求輸出數字3,可以使用以下代碼實現:

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

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

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

程序清單5.24 位碼傳送函數

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

程序清單5.25 數碼管靜態顯示數字1 范例程序(2)

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

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

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

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

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

程序清單5.28 數碼管板級初始化函數

此時編程完畢,將相關函數接口聲明到digitron0.h 中,詳見程序清單5.29。當后續需要調用時,只需要#include "digitron0.h"就可以了。

程序清單5.29 digitron0.h 文件內容

>>> 5.2.2 動態顯示

如程序清單5.30 所示的就是此前大家已經熟練掌握的digitron1.h 接口,其相應的實現代碼詳見程序清單5.31。

程序清單5.30 digitron1.h 文件內容

程序清單5.31 digitron1.c 文件內容

>>> 5.2.3 代碼重構

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

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

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

程序清單5.32 字符段碼表

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

程序清單5.33 段碼訪問接口函數

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

程序清單5.38 動態掃描顯示函數

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

程序清單5.39 digitron2.h 文件內容

程序清單5.40 digitron2.c 文件內容

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

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

程序清單5.41(17~18)加上'0'的目的是將數字變為字符。

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

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    詳解ametal_鍵盤掃描接口和pwm接口技術

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

    深入淺出AVR

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

    深入淺出玩轉FPGA

    深入淺出玩轉FPGA
    發表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發表于 08-18 10:12

    HDMI技術深入淺出

    HDMI技術深入淺出
    發表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發表于 04-26 10:48

    深入淺出安防視頻監控系統

    深入淺出安防視頻監控系統深入淺出安防視頻監控系統
    發表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發表于 08-23 10:10

    深入淺出數據分析

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

    STM32深入淺出新手篇

    STM32深入淺出新手篇,很好的單片機學習資料。
    發表于 03-21 17:43 ?128次下載

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

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

    深入淺出AMetal接口與實現

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

    深入淺出數字信號處理

    深入淺出數字信號處理
    發表于 12-07 20:14 ?540次閱讀
    主站蜘蛛池模板: 国产亚洲精品高清视频免费| freehd另类xxxx喷水| 国产精品高清视频在线| 97视频免费在线观看| 亚洲日本欧美日韩高观看| 少妇高潮惨叫久久久久久欧美 | 国产精品美女久久久久浪潮AV| georgielyall装修工| 2021精品高清卡1卡2卡3麻豆| 一本道中文无码亚洲| 亚洲免费视频在线| 亚洲国产AV精品卡一卡二| 先锋影音av无码第1页| 午夜噜噜噜私人影院在线播放| 色欲午夜无码久久久久久| 日本阿v片在线播放免费| 欧洲video60| 欧美精品一区二区三区视频| 免费。色婬网站| 蜜臀AV精品一区二区三区| 麻豆国产99在线中文| 龙泽罗拉av| 美女爱爱网站| 男女高潮又爽又黄又无遮挡| 免费无码一区二区三区蜜桃大| 麻豆AV蜜桃AV久久| 嗯啊快停下我是你老师啊H| 全身无赤裸裸美女网站| 四房播播开心色播| 亚洲国产精麻豆| 伊人久久99热这里只有精品| 真实处破女全过程完免费观看| 91交换论坛| 成人免费视频无遮挡在线看| 国产成人在线视频| 好吊日视频在线| 看80后操| 久热人人综合人人九九精品视频| 老熟女毛茸茸浓毛| 青娱国产区在线| 午夜福利免费院|