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