周立功教授新書《面向AMetal框架與接口的編程(上)》,對AMetal框架進(jìn)行了詳細(xì)介紹,通過閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實現(xiàn)企業(yè)和個人的共同進(jìn)步。
第七章為面向通用接口的編程,本文內(nèi)容為7.7 數(shù)碼管與矩陣鍵盤聯(lián)合使用、7.8 ZLG72128——數(shù)碼管與鍵盤管理、7.9 溫控器。
7.7 數(shù)碼管與矩陣鍵盤聯(lián)合使用
數(shù)碼管的位選引腳為PIO0_17 和PIO0_23,而矩陣鍵盤的列線引腳同樣為PIO0_17 和PIO0_23,當(dāng)數(shù)碼管和矩陣鍵盤同時使用時,數(shù)碼管的位選引腳和矩陣鍵盤的列線引腳是復(fù)用的,這是常見的硬件電路設(shè)計,可以達(dá)到節(jié)省引腳的目的。
AMetal 提供了數(shù)碼管和矩陣鍵盤聯(lián)合使用的驅(qū)動,其本質(zhì)上就是數(shù)碼管驅(qū)動和矩陣鍵盤驅(qū)動的簡單整合,避免了在多個實例信息中提供一些相同的信息,如數(shù)碼管實例信息中的位選引腳在和矩陣鍵盤實例信息中的列線引腳是完全一樣的。
由于存在兩種數(shù)碼管驅(qū)動:GPIO 輸出段碼,對應(yīng)MiniPort-View 單獨使用;HC595 輸出段碼,對應(yīng)MiniPort-View + MiniPort-595。當(dāng)與矩陣鍵盤聯(lián)合使用時,也存在對應(yīng)的兩種情況:GPIO 輸出段碼的數(shù)碼管和矩陣鍵盤聯(lián)合使用,對應(yīng)MiniPort-View + MiniPort-Key;HC595 輸出段碼的數(shù)碼管和矩陣鍵盤聯(lián)合使用,對應(yīng)MiniPort-View + MiniPort-595 +
MiniPort-Key。
>>> 7.7.1 數(shù)碼管、鍵盤與I/O 驅(qū)動
當(dāng)MiniPort-View 和MiniPort-Key 兩塊配板聯(lián)合使用時,對應(yīng)的驅(qū)動初始化函數(shù)原型(am_miniport_view_key.h)為:
-
p_dev 為指向am_miniport_view_key_dev_t 類型實例的指針;
-
p_info 為指向am_miniport_view_key_info_t 類型實例信息的指針。
1. 實例
am_miniport_view_key_dev_t 類型(am_miniport_view_key.h)實例的定義如下:
其中,miniport_view_key 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
2. 實例信息
描述與數(shù)碼管、矩陣鍵盤相關(guān)的實例信息的類型am_miniport_view_key_info_t 的定義(am_miniport_view_key.h)如下:
其中,scan_info 是am_digitron_scan_gpio_info_t 類型的數(shù)碼管實例信息(GPIO 輸出段碼),其對應(yīng)的定義僅與數(shù)碼管相關(guān)信息有關(guān),詳見程序清單7.49,可以不作任何改動。
key_info 是am_key_matrix_base_info_t 類型的矩陣鍵盤的基礎(chǔ)信息,在矩陣鍵盤的實例信息中有定義,詳見程序清單7.35。
在前面矩陣鍵盤實例信息的定義中,除am_key_matrix_base_info_t 類型的基礎(chǔ)信息外,還包含p_pins_row 指定的行線引腳信息和p_pins_col 指定的列線引腳信息,但當(dāng)數(shù)碼管和矩陣鍵盤同時使用時,由于矩陣鍵盤的列線引腳與數(shù)碼管的位選引腳是相同的,因此,無需再額外指定矩陣鍵盤的列線引腳,僅需使用p_pins_row 指定行線引腳即可,結(jié)合前面定義的數(shù)碼管實例信息和矩陣鍵盤信息,可以定義MiniPort-View+MiniPort-Key 設(shè)備對應(yīng)的實例信息如下:
基于實例、實例信息,即可完成數(shù)碼管實例的初始化:
它將同時完成數(shù)碼管和按鍵的初始化,當(dāng)完成初始化后,可使用通用數(shù)碼管接口和通用按鍵接口操作數(shù)碼管和按鍵。基于模塊化編程思想,將初始化相關(guān)的實例和實例信息等的定義存放到數(shù)碼管的配置文件中,詳見程序清單7.55 和程序清單7.56。
程序清單7.55 數(shù)碼管、按鍵聯(lián)合使用實例初始化函數(shù)實現(xiàn)(am_hwconf_miniport_view_key.c)
程序清單7.56 數(shù)碼管、按鍵聯(lián)合使用實例初始化函數(shù)聲明(am_hwconf_miniport_view_key.h)
后續(xù)只需使用無參數(shù)的實例初始化函數(shù),即可執(zhí)行以下語句完成MiniPort-View +MiniPort-Key 實例的初始化:
當(dāng)完成初始化后,可使用通用數(shù)碼管接口和通用按鍵接口操作數(shù)碼管和按鍵。
>>> 7.7.2 數(shù)碼管、鍵盤與HC595 驅(qū)動
當(dāng)MiniPort-View、MiniPort-Key 和MiniPort-595 三塊配板聯(lián)合使用時,對應(yīng)的驅(qū)動初始化函數(shù)原型(am_miniport_view_key_595.h)為:
-
p_dev 為指向am_miniport_view_key_595_dev_t 類型實例的指針;
-
p_info 為指向am_miniport_view_key_595_info_t 類型實例信息的指針。
1. 實例
am_miniport_view_key_595_dev_t 類型(am_miniport_view_key_595.h)實例定義如下:
其中,miniport_view_key_595 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
2. 實例信息
描述與數(shù)碼管和矩陣鍵盤相關(guān)的實例信息的類型am_miniport_view_key_595_info_t 的定義(am_miniport_view_key_595.h)如下:
唯一的不同,僅僅是數(shù)碼管信息scan_info 成員的類型由am_digitron_scan_gpio_info_t變?yōu)榱薬m_digitron_scan_hc595_gpio_info_t,其余的信息保存不變。因為它們硬件上的區(qū)別僅僅是一個使用GPIO 輸出段碼,一個使用595 輸出段碼,因此實例信息也僅僅是數(shù)碼管信息存在一點差異。
結(jié)合前面定義的數(shù)碼管和矩陣鍵盤實例信息,定義MiniPort-View + MiniPort-Key +MiniPort-595 設(shè)備對應(yīng)的實例信息如下:
3. HC595 句柄handle
若使用Miniport-595 輸出碼段,則應(yīng)通過MiniPort-595 的實例初始化函數(shù)獲得HC595的句柄。即:
HC595 句柄即可直接作為handle 的實參傳遞。
基于實例、實例信息和HC595 句柄,即可完成MiniPort-View + MiniPort-Key +MiniPort-595 設(shè)備實例的初始化。比如:
當(dāng)完成初始化后,即可使用通用數(shù)碼管和按鍵接口操作數(shù)碼管和按鍵。基于模塊化編程思想,將初始化相關(guān)的實例和實例信息等的定義存放到數(shù)碼管的配置文件中,將相關(guān)內(nèi)容新增到am_hwconf_miniport_view_key.c 文件中。與此同時,將實例初始化函數(shù)的聲明新增到am_hwconf_miniport_view_key.h 文件中,詳見程序清單7.57 和程序清單7.58。
程序清單7.57 實例初始化函數(shù)實現(xiàn)(am_hwconf_miniport_view_key.c)
程序清單7.58 am_hwconf_miniport_view_key.h 文件更新
后續(xù)只需使用無參數(shù)的實例初始化函數(shù),即可執(zhí)行以下語句完成MiniPort-View +MiniPort-Key + MiniPort-595 設(shè)備實例的初始化:
當(dāng)完成初始化后,即可使用通用數(shù)碼管和按鍵接口操作數(shù)碼管和按鍵。
通過Miniport 系列配板在各種組合方式下的驅(qū)動介紹可知,MiniPort 系列配板可以非常靈活地搭配使用。對于用戶來說,對于不同的搭配方式,只需要使用對應(yīng)的實例初始化函數(shù)即可,無需關(guān)心底層細(xì)節(jié),使用數(shù)碼管和按鍵通用接口編程的應(yīng)用程序可以始終保持不變。為了便于查詢,表7.9 列出了MiniPort-View、MiniPort-Key 和MiniPort-595 配板在各種組合方式下應(yīng)該使用的實例初始化函數(shù)。
表7.9 各種組合方式下應(yīng)該使用的實例初始化函數(shù)
表7.9 中展示了共計5 種使用方式,每種方式對應(yīng)一行,若配板相應(yīng)的單元格內(nèi)容為“●”,則表示在該種方式下會使用該配板,若僅選擇了一個配板,則表示該方式僅單獨使用該配板。
7.8 ZLG72128——數(shù)碼管與鍵盤管理
>>> 7.8.1 ZLG72128 簡介
當(dāng)矩陣鍵盤和數(shù)碼管擴大到一定數(shù)目時,將非常占用系統(tǒng)的I/O 資源,同時還需要配套軟件執(zhí)行按鍵的和數(shù)碼管掃描,對CPU 資源的耗費也不可忽視。在實際應(yīng)用中,可能不會用到全部的32 個按鍵或12 個數(shù)碼管,可以根據(jù)實際情況裁剪。ZLG 設(shè)計了相應(yīng)的MiniPort-ZLG72128 配板,可以直接與AM824-Core 連接使用,作為示例MiniPort-ZLG72128配板僅使用了2 個數(shù)碼管和4 個按鍵(2 行2 列),當(dāng)將MiniProt-ZLG72128 與AM824-Core連接時,其等效電路詳見圖7.2。
圖7.2 MiniPort-ZLG72128 電路圖
數(shù)碼管僅使用了兩個,按鍵使用了第0 行和第3 行(功能按鍵),每行兩列共計4 個按鍵,ZLG72128 與LPC824 的引腳連接詳見表7.10。
表7.10 ZLG72128 與LPC824 的引腳連接
>>> 7.8.2 ZLG72128 驅(qū)動
使用ZLG72128 時,雖然底層的驅(qū)動方式(I2C總線接口)與之前使用GPIO 驅(qū)動按鍵和數(shù)碼管的方式是完全不同的,但由于AMetal 已經(jīng)提供了ZLG72128 的驅(qū)動,對于用戶來講,可以忽略底層的差異性,直接使用通用鍵盤接口和通用數(shù)碼管接口編寫應(yīng)用程序。
ZLG 設(shè)計了相應(yīng)的MiniPort-ZLG72128 配板,可以直接與AM824-Core 連接使用,在使用通用接口使用數(shù)碼管和按鍵前,需要使用初始化函數(shù)完成設(shè)備實例的初始化操作。其函數(shù)(am_zlg72128_std.h)的原型為:
該函數(shù)用于將ZLG72128 初始化為標(biāo)準(zhǔn)的數(shù)碼管和按鍵功能,初始化完成后,即可使用通用的按鍵和數(shù)碼管接口操作數(shù)碼管和按鍵。p_dev 為指向am_zlg72128_std_dev_t 類型實例的指針,p_info 為指向am_zlg72128_std_devinfo_t 類型實例信息的指針,i2c_handle 為與ZLG72128 通信的I2C實例句柄。
(1)實例
定義am_zlg72128_std_dev_t 類型(am_zlg72128_std.h)實例如下:
其中,g_miniport_zlg72128 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
(2)實例信息
實例信息主要描述了與ZLG72128、鍵盤和數(shù)碼管等相關(guān)的信息,如按鍵對應(yīng)的按鍵編碼、數(shù)碼管顯示器的ID 等信息。其類型am_zlg72128_std_devinfo_t(am_zlg72128_std.h)的定義如下:
base_info 是ZLG72128 的基礎(chǔ)信息,其類型(am_zlg72128.h)的定義如下:
其主要指定了與ZLG72128 相關(guān)聯(lián)的引腳信息,其中,rst_pin 為復(fù)位引腳,若復(fù)位引腳未使用(固定為RC 上電復(fù)位電路,無需主控參與控制),則該值可設(shè)置為-1。use_int_pin表示是否使用ZLG72128 的中斷輸出引腳(KEY_INT),若該值為AM_TRUE,表明使用了中斷引腳,此時int_pin 指定與主控制器(如LPC824)連接的引腳號,按鍵的鍵值將在引腳中斷中獲取;若該值為AM_FALSE,表明不使用中斷引腳,此時interval_ms 指定查詢鍵值的時間間隔,使用查詢方式時,可以節(jié)省一個管腳資源,但也會額外耗費一定的CPU 資源。當(dāng)使用AM824-Core 與MiniPort-ZLG72128 連接時,其相應(yīng)的引腳連接詳見表7.10,基于此,各成員可以分別賦值為:PIO0_6,AM_TRUE、PIO0_1、0。id_info 是僅包含顯示器ID 號的標(biāo)準(zhǔn)數(shù)碼管設(shè)備的信息,其類型定義(am_digitron_dev.h)如下:
在前面的驅(qū)動配置中,將MiniPort-View 對應(yīng)的ID 號設(shè)置為0,在這里,如果MiniPort-ZLG72128 不會與MiniPort-View 同時使用,可以將ID 也設(shè)置為0,如此一來,使用MiniPort-ZLG72128 可以直接替換MiniPort-View 配板作為新的顯示器,但應(yīng)用程序無需作任何改變,同樣可以繼續(xù)使用ID 為0 的顯示器。blink_on_time 和blink_off_time 分別指定了數(shù)碼管閃爍時,數(shù)碼管點亮的時間和熄滅的時間,以此可以達(dá)到調(diào)節(jié)閃爍效果的作用。通常情況下,數(shù)碼管以1Hz 頻率閃爍,點亮和熄滅的時間分別設(shè)置為500ms。
key_use_row_flags 標(biāo)志指定使用了哪些行,ZLG72128 最多可以支持4 行按鍵,分別對應(yīng)COM8~COM11。該值由表7.11 所示的宏值組成,使用多行時應(yīng)將多個宏值相“或”。對于MiniPort-ZLG72128,其使用了第0 行和第3 行,因此key_use_row_flags 的值為:
AM_ZLG72128_STD_KEY_ROW_0| AM_ZLG72128_STD_KEY_ROW_3
表7.11 行使用宏標(biāo)志
key_use_col_flags 標(biāo)志指定使用了哪些列,ZLG72128 最多可以支持8 列按鍵,分別對應(yīng)COM0 ~ COM7。該值由表7.12 所示的宏值組成,使用多列時應(yīng)將多個宏值相“或”。對于MiniPort-ZLG72128,其使用了第0 列和第1 列,因此key_use_col_flags 的值為:
AM_ZLG72128_STD_KEY_COL_0 | AM_ZLG72128_STD_KEY_COL_1
表7.12 列使用宏標(biāo)志
p_key_codes 指向存放矩陣鍵盤各按鍵對應(yīng)編碼的數(shù)組,其編碼數(shù)目與實際使用的按鍵數(shù)目一致,MiniPort-ZLG72128 共計2×2 個按鍵。
在配置MiniPort-key 時,將MiniPort-key 對應(yīng)的按鍵編碼設(shè)置為KEY0 ~ KEY3。如果MiniPort-ZLG72128 與MiniPort-Key不同時使用,則將MiniPort-ZLG72128 對應(yīng)的按鍵編碼也設(shè)置為KEY0~KEY3,使用MiniPort-ZLG72128 替換MiniPort-Key 配板,但應(yīng)用程序無需作任何改變。num_digitron 指定了數(shù)碼管的個數(shù),MiniPort-ZLG72128 僅使用了2 個數(shù)碼管,因此num_digitron 的值為2。基于以上信息,實例信息可以定義如下:
(3)I2C句柄i2c_handle
若使用LPC824 的I2C1 與ZLG72128 通信,則I2C句柄可以通過LPC82x 的I2C1 實例初始化函數(shù)am_lpc82x_i2c1_inst_init()獲得。即:
獲得的I2C句柄即可直接作為i2c_handle 的實參傳遞。
基于實例、實例信息和I2C句柄,可以完成MiniPort-ZLG72128 的初始化。比如:
當(dāng)完成初始化后,即可使用通用的數(shù)碼管接口和通用的按鍵處理接口。由于標(biāo)準(zhǔn)按鍵處理接口中,并沒有將按鍵按照普通按鍵和功能按鍵進(jìn)行區(qū)分,因此ZLG72128 對應(yīng)的第3 行功能按鍵也會當(dāng)作一般按鍵處理,其按鍵按下和釋放均會觸發(fā)執(zhí)行相應(yīng)的按鍵處理函數(shù)。此外,由于ZLG72128 不會上報普通按鍵的釋放事件,因此當(dāng)普通按鍵釋放時,不會觸發(fā)相應(yīng)的按鍵處理函數(shù)。為了便于配置矩陣鍵盤(修改實例信息)。基于模塊化編程思想,將初始化相關(guān)的實例、實例信息等的定義存放到相應(yīng)的配置文件中,通過頭文件引出實例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單7.59 和程序清單7.60。
程序清單7.59 獨立鍵盤實例初始化函數(shù)實現(xiàn)(am_hwconf_miniport_zlg72128.c)
程序清單7.60 獨立鍵盤實例初始化函數(shù)聲明(am_hwconf_miniport_zlg72128.h)
后續(xù)只需要使用無參數(shù)的實例初始化函數(shù)即可完成MiniPort-ZLG72128 實例的初始化,即執(zhí)行如下語句:
由于在配置信息中,將按鍵編碼和數(shù)碼管ID 號設(shè)置與MiniPort-Key 和Miport-View 一樣,因此可以直接使用MiniPort-ZLG72128 替換MiniPort-Key 和MiniPort-View,應(yīng)用程序無需作任何修改。比如,可以使用之前編寫的按鍵應(yīng)用程序和數(shù)碼管應(yīng)用程序測試按鍵和數(shù)碼管,詳見程序清單7.61。
程序清單7.61 運行按鍵和數(shù)碼管應(yīng)用程序的主程序
由此可見,應(yīng)用程序無需作任何修改。
7.9 溫控器
此前,使用自定義的數(shù)碼管、LED、溫度等接口實現(xiàn)了一個簡易的溫控器,現(xiàn)在將對其進(jìn)行升級,全部使用通用接口實現(xiàn)。修改較為容易,基本邏輯保持不變,僅僅將其中的非通用接口修改為使用通用接口實現(xiàn),詳見程序清單7.62。
程序清單7.62 使用通用接口實現(xiàn)溫控器代碼
由于使用通用接口時,數(shù)碼管、按鍵均會自動掃描,無需每隔一定的時間定時掃描一次,因此主程序中沒有再執(zhí)行數(shù)碼管和按鍵掃描的語句。
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1882瀏覽量
91125 -
矩陣鍵盤
+關(guān)注
關(guān)注
7文章
206瀏覽量
31473 -
周立功
+關(guān)注
關(guān)注
38文章
130瀏覽量
37632
原文標(biāo)題:周立功:面向通用接口的編程——數(shù)碼管與矩陣鍵盤聯(lián)合使用、(ZLG72128)數(shù)碼管與鍵盤管理、溫控器
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論