周立功教授新書《面向AMetal框架與接口的編程(上)》,對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實(shí)現(xiàn)企業(yè)和個(gè)人的共同進(jìn)步。
第七章為面向通用接口的編程,本文內(nèi)容為7.6 數(shù)碼管。
7.6 數(shù)碼管
>>> 7.6.1 通用數(shù)碼管接口
AMetal 提供了一套通用數(shù)碼管接口,詳見表7.7。
表7.7 數(shù)碼管通用接口(am_digitron_disp.h)
1. 設(shè)置段碼解碼函數(shù)
數(shù)碼管的各個(gè)段可以組合顯示出多種圖形,使用該函數(shù)可以自定義字符的解碼函數(shù),其函數(shù)原型為:
其中,id 表示設(shè)置數(shù)碼管顯示器的編號(hào),這里的id 指的是顯示器的編號(hào),而不是數(shù)碼管的位索引。一般情況下,僅只有一個(gè)數(shù)碼管顯示器,比如,MiniPort-View 顯示器,其包含兩位數(shù)碼管,僅只有一個(gè)數(shù)碼管顯示器時(shí),id 為0。
pfn_decode 為函數(shù)指針,其指向的函數(shù)即為設(shè)置的解碼函數(shù),解碼函數(shù)的參數(shù)為uint16_t類型的字符,返回值為uint16_t 類型的編碼。
絕大部分情況下,對(duì)于8 段數(shù)碼管,如字符'0' ~ '9'等都是有默認(rèn)編碼的,為此,AMetal提供了默認(rèn)的8 段數(shù)碼管解碼函數(shù),可以支持常見的字符'0' ~ '9'以及 'A' 、'B'、 'C' 、'D'、'E'、 'F'等的字符的解碼。其在am_digitron_disp.h 文件中聲明:
如無特殊需求,直接將該函數(shù)作為pfn_decode 的實(shí)參傳遞,范例程序詳見程序清單7.40。
程序清單7.40 am_digitron_disp_decode_set()范例程序
若由于應(yīng)用特殊需求,要求字符使用自定義的特殊編碼,如要使字符'O'的編碼為 0xFC,則可以自定義如下解碼函數(shù):
然后將該函數(shù)作為pfn_decode 的實(shí)參傳遞即可:
2. 設(shè)置數(shù)碼管閃爍
該函數(shù)可以指定數(shù)碼管顯示器的某一位數(shù)碼管閃爍,其函數(shù)原型為:
其中,id 為數(shù)碼管顯示器編號(hào);index 為數(shù)碼管索引,如MiniPort-View 有兩位數(shù)碼管,則兩個(gè)數(shù)碼管的索引分別為 0 和1;blink 表示該位是否閃爍,若其值為AM_TRUE,則閃爍,反之,則不閃爍,默認(rèn)情況下,所有數(shù)碼管均處于未閃爍狀態(tài)。如設(shè)置1 號(hào)數(shù)碼管閃爍的范例程序詳見程序清單7.41。
程序清單7.41 am_digitron_disp_blink_set()范例程序
3. 顯示指定的段碼圖形
該函數(shù)用于不經(jīng)過解碼函數(shù)解碼,直接顯示段碼指定的圖形,可以靈活的顯示任意特殊圖形,其函數(shù)原型為:
其中,id 為數(shù)碼管顯示器編號(hào);index 為數(shù)碼管索引;seg 為顯示的段碼。如在8 段數(shù)碼管上顯示字符'-',即需要g 段點(diǎn)亮,對(duì)應(yīng)的段碼為0x02(即:0000 0010),范例程序詳見程序清單7.42。
程序清單7.42 am_digitron_disp_at()范例程序
4. 顯示單個(gè)字符
該函數(shù)用于在指定位置顯示一個(gè)字符,字符經(jīng)過解碼函數(shù)解碼后顯示,若解碼函數(shù)不支持該字符,則不顯示任何內(nèi)容,其函數(shù)原型為:
其中,id 為數(shù)碼管顯示器編號(hào),index 為數(shù)碼管索引,ch 為顯示的字符。比如,顯示字符'H'的范例程序詳見程序清單7.43。
程序清單7.43 am_digitron_disp_char_at()范例程序
5. 顯示字符串
該函數(shù)用于從指定位置開始顯示一個(gè)字符串,其函數(shù)原型為:
其中,id 為數(shù)碼管顯示器編號(hào),index 為顯示字符串的數(shù)碼管起始索引,即從該索引指定的數(shù)碼管開始顯示字符串,len 指定顯示的長度,p_str 指向需要顯示的字符串。
實(shí)際顯示的長度是len 和字符串長度的較小值,若數(shù)碼管位數(shù)不夠,則多余字符不顯示。如顯示字符"HELLO"的范例程序詳見程序清單7.44。
程序清單7.44 am_digitron_disp_str()范例程序
若使用的是MiniPort-View,由于只存在兩個(gè)數(shù)碼管,因此最終只會(huì)顯示"HE"。
通常情況下,需要顯示一些數(shù)字,如顯示變量的值,此時(shí),可以先將變量通過格式化字符串函數(shù)輸出到字符串緩沖區(qū)中,然后再使用am_digitron_disp_str()函數(shù)顯示該字符串。比如,顯示一個(gè)變量i 的值,范例程序詳見程序清單7.45。
程序清單7.45 使用am_digitron_disp_str()顯示整數(shù)變量值的范例程序
其中,am_snprintf()與標(biāo)準(zhǔn)C 函數(shù)snprintf()函數(shù)功能相同,均用于格式化字符串到指定的緩沖區(qū)中,其函數(shù)原型為(am_vdebug.h):
其與am_kprintf()函數(shù)的區(qū)別是,am_kprintf()將信息直接通過調(diào)試串口打印輸出,而am_snprintf()函數(shù)將信息輸出到大小為sz 的buf 緩沖區(qū)中。
6. 顯示清屏
該函數(shù)用于顯示清屏,清除數(shù)碼管顯示器中的所有內(nèi)容,其函數(shù)原型為:
其中,id 為數(shù)碼管顯示器編號(hào),范例程序詳見程序清單7.46。
程序清單7.46 am_digitron_disp_clr()范例程序
基于數(shù)碼管通用接口,可以編寫一個(gè)簡(jiǎn)易的60s 倒計(jì)時(shí)程序,當(dāng)?shù)褂?jì)時(shí)還剩5s 時(shí),數(shù)碼管閃爍。基于模塊化編程思想,將應(yīng)用程序存放到app_digitron_count_down.c 文件中,并將其接口聲明到app_digitron_count_down.h 文件中,詳見程序清單7.47 和程序清單7.48。
程序清單7.47 倒計(jì)時(shí)應(yīng)用程序?qū)崿F(xiàn)(app_digitron_count_down.c)
程序清單7.48 倒計(jì)時(shí)應(yīng)用程序接口聲明(app_digitron_count_down.h)
由此可見,要使用此應(yīng)用程序,只需在調(diào)用其入口函數(shù)app_digitron_count_down()時(shí),指定應(yīng)用程序所使用的數(shù)碼管顯示器編號(hào)即可。應(yīng)用程序與具體MCU、數(shù)碼管驅(qū)動(dòng)方式無關(guān),可以在任何AMetal 平臺(tái)上運(yùn)行。
顯然,要使應(yīng)用程序可以使用通用操作數(shù)接口操作數(shù)碼管,就需要為具體的數(shù)碼管提供相應(yīng)的驅(qū)動(dòng)。AMetal 提供了MiniPort-View 的驅(qū)動(dòng),用戶可以直接使用。
>>> 7.6.2 數(shù)碼管驅(qū)動(dòng)
AMetal 數(shù)碼管驅(qū)動(dòng)提供了一個(gè)初始化函數(shù),使用該函數(shù)初始化一個(gè)數(shù)碼管實(shí)例后,即可使用通用數(shù)碼管接口操作數(shù)碼管。其函數(shù)原型為:
其中,p_dev 為指向am_digitron_scan_gpio_dev_t 類型實(shí)例的指針,p_info 為指向am_digitron_scan_gpio_info_t 類型實(shí)例信息的指針。
1. 實(shí)例
定義am_digitron_scan_gpio_dev_t 類型(am_digitron_scan_gpio.h)實(shí)例如下:
其中,miniport_view 為用戶自定義的實(shí)例,其地址作為p_dev 的實(shí)參傳遞。
2. 實(shí)例信息
實(shí)例信息主要描述與數(shù)碼管相關(guān)的信息,比如,使用的GPIO 引腳號(hào)、數(shù)碼管個(gè)數(shù)等以及本實(shí)例對(duì)應(yīng)的顯示器編號(hào)(通用接口即可使用該顯示器編號(hào)操作該數(shù)碼管實(shí)例)等。其類型am_digitron_scan_gpio_info_t 的定義(am_digitron_scan_gpio.h)如下:
其中,scan_info 是數(shù)碼管動(dòng)態(tài)掃描相關(guān)的信息,包含了掃描頻率、掃描方式和緩存的定義等;base_info 是數(shù)碼管基礎(chǔ)信息,如數(shù)碼管個(gè)數(shù)、段碼位數(shù)等;p_seg_pins 指向存放各個(gè)段對(duì)應(yīng)引腳號(hào)的數(shù)組,p_com_pins 指向存放各個(gè)位選對(duì)應(yīng)引腳號(hào)的數(shù)組。若使用AM824-Core 開發(fā)板與MiniPort-View 直接連接,其段碼引腳為PIO0_8 ~ PIO0_15,位選引腳分別為PIO0_17 和PIO0_23。分別定義存放段碼引腳號(hào)和位選引腳號(hào)的數(shù)組:
g_digitron_seg_pins 數(shù)組的地址即可作為p_seg_pins 的值;g_digitron_com_pins 數(shù)組的地址即可作為p_com_pins 的值。
scan_info 成員的類型am_digitron_scan_devinfo_t 定義(am_digitron_scan.h)如下:
其中,devinfo 是標(biāo)準(zhǔn)數(shù)碼管設(shè)備的信息,其僅包含顯示器ID 號(hào),其類型定義(am_digitron_dev.h)如下:
當(dāng)前只連接了單個(gè)數(shù)碼管實(shí)例,因此,將id 設(shè)置為0,在使用數(shù)碼管通用接口時(shí),將顯示器id 參數(shù)賦值為0 即可操作此處初始化的數(shù)碼管實(shí)例。
scan_freq 指定掃描的頻率,通常情況下,為避免看到閃爍現(xiàn)象,將頻率設(shè)置為50Hz。blink_on_time 和blink_off_time 分別指定了數(shù)碼管閃爍時(shí),數(shù)碼管點(diǎn)亮的時(shí)間和熄滅的時(shí)間,以此可以達(dá)到調(diào)節(jié)閃爍效果的作用。通常情況下,數(shù)碼管以1Hz 頻率閃爍,點(diǎn)亮和熄滅的時(shí)間分別設(shè)置為500ms。
p_disp_buf 指向數(shù)碼管的顯存,顯存的類型為uint8_t,顯存的大小與數(shù)碼管個(gè)數(shù)相同。對(duì)于MiniPort-View,共計(jì)有兩個(gè)數(shù)碼管,因此大小為2 的顯存定義如下:
g_disp_buf 數(shù)組的地址即可作為p_disp_buf 的值。
p_scan_buf 指向數(shù)碼管的掃描緩存,用于存儲(chǔ)單次掃描到的數(shù)碼管的段碼,對(duì)于8 段數(shù)碼管,其緩存的類型為uint8_t ,緩存的大小與單次掃描的數(shù)碼管個(gè)數(shù)相同, 對(duì)于MiniPort-View,一次只能掃描一個(gè)數(shù)碼管,因此掃描緩存的大小為1,掃描緩存可定義如下:
g_scan_buf 數(shù)組的地址即可作為p_scan_buf 的值。
base_info 成員的類型am_digitron_base_info_t 定義(am_digitron_base.h)如下:
其中,num_segment 表示數(shù)碼管的段數(shù),對(duì)于MiniPort-View,其數(shù)碼管為8 段數(shù)碼管,因此num_segment 的值為8。num_rows 和num_cols 分別表示數(shù)碼管的行數(shù)和列數(shù),對(duì)于MiniPort-View,其數(shù)碼管的排布方式為 1×2,即單行兩個(gè)數(shù)碼管,因此num_rows 和num_cols的值分別為1 和2。
如表7.8 所示為數(shù)碼管掃描方式,scan_mode 表示數(shù)碼管的掃描方式,可選的掃描方式有行掃描或列掃描方式,掃描方式是由硬件決定的,對(duì)于MiniPort-View,其僅單行兩個(gè)數(shù)碼管,橫向的兩個(gè)數(shù)碼管共用段碼引腳,因此,只能使用列掃描方式,即一次掃描一列(一個(gè)數(shù)碼管),scan_mode 的值為AM_DIGITRON_SCAN_MODE_COL。
表7.8 數(shù)碼管掃描方式
seg_active_low 表示驅(qū)動(dòng)段點(diǎn)亮的有效電平是否為低電平,由于MiniPort-View 使用的是共陽數(shù)碼管,因此,段的驅(qū)動(dòng)電平為低電平,seg_active_low 的值為AM_TRUE。
com_active_low 表示驅(qū)動(dòng)位選有效的電平是否為低電平,雖然共陽數(shù)碼管的公共端是高
電平有效,但由于添加了三極管驅(qū)動(dòng)電路,三極管是GPIO 輸出低電平時(shí)導(dǎo)通,進(jìn)而使數(shù)碼管公共端為高電平。因此驅(qū)動(dòng)位選有效的同樣是低電平,com_active_low 的值為AM_TRUE。基于以上信息,實(shí)例信息定義如下:
基于實(shí)例和實(shí)例信息,即可完成MiniPort-View 數(shù)碼管的初始化:
當(dāng)完成初始化后,可使用通用數(shù)碼管接口操作顯示器編號(hào)為0 的數(shù)碼管設(shè)備。為了便于配置數(shù)碼管(修改實(shí)例信息)?;谀K化編程思想,將初始化相關(guān)的實(shí)例、實(shí)例信息等的定義存放到數(shù)碼管的配置文件中,通過頭文件引出實(shí)例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單7.49 和程序清單7.50。
程序清單7.49 數(shù)碼管實(shí)例初始化函數(shù)實(shí)現(xiàn)(am_hwconf_miniport_view.c)
程序清單7.50 數(shù)碼管實(shí)例初始化函數(shù)聲明(am_hwconf_miniport_view.h)
后續(xù)只需使用無參數(shù)的實(shí)例初始化函數(shù),即可執(zhí)行以下語句完成數(shù)碼管實(shí)例的初始化:
當(dāng)完成初始化后,可使用通用數(shù)碼管接口操作顯示器編號(hào)為0 的數(shù)碼管設(shè)備,運(yùn)行如程序清單7.47 所示的倒計(jì)時(shí)程序,檢驗(yàn)?zāi)芊襁_(dá)到預(yù)期的效果,主程序詳見程序清單7.51。
程序清單7.51 運(yùn)行倒計(jì)時(shí)應(yīng)用程序的主程序
>>> 7.6.3 數(shù)碼管驅(qū)動(dòng)(HC595 輸出段碼)
當(dāng)GPIO 資源不足時(shí),則可以在AM824-Core 與MiniPort-View 之間增加MiniPort-595,使用HC595 驅(qū)動(dòng)數(shù)碼管的段碼,達(dá)到節(jié)省引腳的目的。
顯然,在前面的數(shù)碼管驅(qū)動(dòng)中,8 位段碼是直接由GPIO 輸出的,若改由HC595 輸出段碼,則使用的驅(qū)動(dòng)也需要發(fā)生相應(yīng)的改變。AMetal 提供了使用HC595 輸出段碼的數(shù)碼管驅(qū)動(dòng),僅包含一個(gè)初始化函數(shù),使用該函數(shù)初始化一個(gè)數(shù)碼管實(shí)例后,即可使用通用數(shù)碼管接口操作數(shù)碼管。其函數(shù)原型為:
-
p_dev 為指向am_digitron_scan_hc595_gpio_dev_t 類型實(shí)例的指針;
-
p_info 為指向am_digitron_scan_hc595_gpio_info_t 類型實(shí)例信息的指針。
1. 實(shí)例
am_digitron_scan_hc595_gpio_dev_t 類型(am_digitron_scan_hc595_gpio.h)實(shí)例的定義
如下:
其中,miniport_view_595 為用戶自定義的實(shí)例,其地址作為p_dev 的實(shí)參傳遞。
2. 實(shí)例信息
實(shí)例信息主要描述與數(shù)碼管相關(guān)的信息,比如,使用的位選GPIO 引腳號(hào)、數(shù)碼管個(gè)數(shù)等以及本實(shí)例對(duì)應(yīng)的顯示器編號(hào)(通用接口即可使用該顯示器編號(hào)操作該數(shù)碼管實(shí)例)等。
其類型am_digitron_scan_hc595_gpio_info_t 的定義(am_digitron_scan_hc595_gpio.h)如下:
將其與GPIO 輸出段碼的數(shù)碼管實(shí)例信息相比(am_digitron_scan_gpio_info_t)可以發(fā)現(xiàn),其僅僅少了一個(gè)數(shù)據(jù)成員p_seg_pins,其它信息都是完全一樣的。這是由于當(dāng)使用595輸出段碼時(shí),不再需要使用GPIO 輸出段碼,因此,也就不用指定段碼引腳?;诖?,只需要從GPIO 輸出段碼的數(shù)碼管實(shí)例信息中去掉段碼引腳,即可得到HC595 輸出段碼的數(shù)碼管實(shí)例信息:
3. HC595 句柄handle
若使用Miniport-595 輸出碼段,則應(yīng)通過MiniPort-595 的實(shí)例初始化函數(shù)獲得HC595的句柄。即:
HC595 句柄即可直接作為handle 的實(shí)參傳遞。
基于實(shí)例、實(shí)例信息和HC595 句柄,可以完成數(shù)碼管實(shí)例的初始化。比如:
當(dāng)完成初始化后,可使用通用數(shù)碼管接口操作顯示器編號(hào)為0 的數(shù)碼管設(shè)備?;谀K化編程思想,將初始化相關(guān)的實(shí)例、實(shí)例信息等的定義存放到數(shù)碼管的配置文件中,將相關(guān)內(nèi)容新增到am_hwconf_miniport_view.c 文件中,同時(shí),將實(shí)例初始化函數(shù)的聲明新增到am_hwconf_miniport_view.h 文件中,詳見程序清單7.52 和程序清單7.53。
程序清單7.52 數(shù)碼管實(shí)例初始化函數(shù)實(shí)現(xiàn)(am_hwconf_miniport_view.c)
程序清單7.53 am_hwconf_miniport_view.h 文件更新
后續(xù)只需使用無參數(shù)的實(shí)例初始化函數(shù),即可執(zhí)行以下語句完成數(shù)碼管實(shí)例的初始化:
當(dāng)完成初始化后,可調(diào)用通用數(shù)碼管接口操作顯示器編號(hào)為0 的數(shù)碼管,運(yùn)行如程序清單7.47 所示的倒計(jì)時(shí)程序,檢驗(yàn)?zāi)芊襁_(dá)到預(yù)期的效果,主程序詳見程序清單7.54。
程序清單7.54 運(yùn)行倒計(jì)時(shí)應(yīng)用程序的主程序
-
接口
+關(guān)注
關(guān)注
33文章
8612瀏覽量
151273 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1882瀏覽量
91166 -
周立功
+關(guān)注
關(guān)注
38文章
130瀏覽量
37656
原文標(biāo)題:周立功:面向通用接口的編程——數(shù)碼管
文章出處:【微信號(hào):Zlgmcu7890,微信公眾號(hào):周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論