周立功教授新書《面向AMetal框架與接口的編程(上)》,對AMetal框架進行了詳細介紹,通過閱讀這本書,你可以學到高度復用的軟件設計原則和面向接口編程的開發思想,聚焦自己的“核心域”,改變自己的編程思維,實現企業和個人的共同進步。
第六章為重用外設驅動代碼,本文內容為6.5 鍵盤與數碼管接口。
6.5 鍵盤與數碼管接口
>>> 6.5.1 ZLG72128 接口
當矩陣擴大到一定數目時,逐行掃描的方法會顯得費時,如果需要對2 個以上的按鍵“同時”操作時,則處理起來更是麻煩。ZLG72128 是ZLG 自行設計的數碼管顯示驅動與鍵盤掃描管理芯片,能夠直接驅動12 位共陰式數碼管(或96 只獨立的LED),同時還可以掃描管理多達32 個按鍵,其中的8 個按鍵如同電腦鍵盤上的Ctrl、Shift 和Alt 鍵一樣可以作為功能鍵使用。
另外,ZLG72128 內部還設置有連擊計數器,能夠使某鍵按下后不松手而連續有效。該芯片為工業級芯片,抗干擾能力強,在工業測控中已有大量應用。
1. 特點
-
直接驅動12 位1 英寸以下的共陰式數碼管或96 只獨立的LED;
-
能夠管理多達32 個按鍵,其中的8 個按鍵可以用作功能鍵,自動消除抖動;
-
利用功率電路可以方便地驅動1 英寸以上的大型數碼管;
-
具有位閃爍、位消隱、段點亮、段熄滅、功能鍵、連擊鍵計數等強大功能;
-
具有10 種數字和21 種字母的譯碼顯示功能,亦可直接向顯示緩存寫入顯示數據;
-
軟件配置支持0~12 個數碼管顯示模式;
-
工作電壓范圍:3.0~5.5V;
-
工作溫度范圍:-40~+85℃;
-
封裝:TSSOP28。
2. 典型應用電路
如圖6.12 所示為ZLG72128 的管腳排列圖,其相應的管腳功能說明詳見表6.34。
表6.34 引腳功能表
圖6.12 ZLG72128 管腳排列圖
如圖6.13 所示為按鍵電路,ZLG72128 能夠管理多達32 個按鍵(4 行8 列),行線分別連接COM8 ~ COM11 引腳,列線分別連接COM0 ~ COM7。特別地,前3 行按鍵(共計24個按鍵)是普通按鍵,按鍵按下時會通過INT 引腳通知用戶,按鍵釋放時不做任何通知。最后一行按鍵(共計8 個按鍵)是功能鍵,其以一個8 位數據表示8 個鍵值的狀態,F0 ~ F7分別對應bit0 ~ bit 7。按下時相應位為0,釋放時相應位為1,只要表示這8 個按鍵的8 位數據值發生變化,則會通過INT 引腳通知用戶,因此對于功能按鍵,按鍵按下或釋放用戶均能夠得到通知。
注意,需要在鍵盤電路與ZLG72128 芯片引腳之間連接一個電阻,其典型值為1KΩ。在多數應用中可能不需要這么多的鍵,這時既可以按行也可以按列裁減鍵盤。需要注意的是,該按鍵電路對于3 個或3 個以上鍵按下的情況是不適用的。
圖6.13 按鍵電路
如圖6.14 所示是針對2 個或2 個以上功能鍵與普通鍵搭配使用的情況下的按鍵電路,在功能鍵與普通鍵之間加了一個二極管,注意:二極管應該盡量選擇導通壓降較小的。
圖6.14 多個功能鍵復用按鍵電路
如圖6.15 所示為ZLG72128 的典型應用電路原理圖,用戶在使用芯片驅動數碼管與管理按鍵時,可參考該電路進行電路設計。ZLG72128 只能直接驅動12 位共陰式數碼管驅動,在數碼管的段與ZLG72128 芯片引腳之間需要接一個限流電阻,其典型值為270Ω。如果需要增大數碼管的亮度,則可以適當減小電阻值。ZLG72128 的驅動能力畢竟有限,當使用大型數碼管時,則可能顯示亮度不夠,這時可以適當減小數碼管的限流電阻值以增加亮度,阻值最小為200Ω,如果亮度依舊不夠,就必須加入功率驅動電路,詳見ZLG72128 用戶手冊(http://www.zlgmcu.com)。
為了使ZLG72128 芯片電源穩定,一般在VCC 和GND 之間接入一個47~470μF 的電解電容。按照I2C總線協議的要求,信號線SCL 和SDA 上必須分別接上拉電阻,其典型值是4.7KΩ。當通信速率大于100kbps 時,建議減小上拉電阻的值。芯片復位引腳RST 是低電平有效,可以將其接入到MCU 的I/O 來控制其復位。KEY_INT 引腳可輸出按鍵中斷請求信號(低電平有效),可以連接到MCU 的I/O 來獲取按鍵按下或釋放事件。
圖6.15 ZLG72128 典型應用電路
3. 寄存器詳解
ZLG72128 內部有12 個顯示緩沖寄存器DispBuf0~DispBuf11,它們直接決定數碼管顯示的內容。ZLG72128 提供有2 種顯示控制方式,一種是直接向顯存寫入字型數據,另一種是通過向命令緩沖寄存器寫入控制指令實現自動譯碼顯示。訪問這些寄存器需要通過I2C總線接口來實現,ZLG72128 的I2C總線器件地址是60H(寫操作)和61H(讀操作),訪問
內部寄存器要通過“子地址”實現。
(1)系統寄存器SystemReg(地址:00H)
系統寄存器的第0 位(LSB)稱作KeyAvi,標志著按鍵是否有效,0-沒有按鍵被按下,1-有某個按鍵被按下。SystemReg 寄存器的其它位暫時沒有定義。當按下某個鍵時,ZLG72128 的KEY_INT 引腳會產生一個低電平的中斷請求信號。當讀取鍵值后,中斷信號就會自動撤銷(變為高電平),而KeyAvi 也同時予以反映。正常情況下MCU 只需要判斷KEY_INT 引腳即可。通過不斷查詢KeyAvi 位也能判斷是否有鍵按下,這樣就可以節省微控制器的一根I/O 口線,但是I2C總線處于頻繁的活動狀態,多消耗電流且不利于抗干擾。
(2)鍵值寄存器Key(地址:01H)
如果K1~K24 的某個普通鍵被按下,則微控制器可以從鍵值寄存器Key 中讀取相應的鍵值1~24。如果微控制器發現ZLG72128 的KEY_INT 引腳產生了中斷請求,而從Key 中讀到的鍵值是0,則表示按下的可能是功能鍵。鍵值寄存器Key 的值在被讀走后自動變成0。
(3)連擊計數器RepeatCnt(地址:02H)
ZLG72128 為K1~K24 提供了連擊計數功能。所謂連擊是指按住某個普通鍵不松手,經過兩秒鐘的延遲后,開始連續有效,連續有效間隔時間約兩百毫秒。這一特性跟電腦上的鍵盤很類似。在微控制器能夠及時響應按鍵中斷并及時讀取鍵值的前提下,當按住某個普通鍵一直不松手時:首先會產生一次中斷信號,這時連擊計數器RepeatCnt 的值仍然是0;經過兩秒延遲后,會連續產生中斷信號,每中斷一次RepeatCnt 就自動加1;當RepeatCnt 計數到255 時就不再增加,而中斷信號繼續有效。在此期間,鍵值寄存器的值每次都會產生。
(4)功能鍵寄存器FunctionKey(地址:03H)
ZLG72128 提供的8 個功能鍵F0~F7。功能鍵常常是配合普通鍵一起使用的,就像電腦鍵盤上的Shift、Ctrl 和Alt 鍵。當然功能鍵也可以單獨去使用,就像電腦鍵盤上的F1~F12。當按下某個功能鍵時,在KEY_INT 引腳也會像按普通鍵那樣產生中斷信號。功能鍵的鍵值是被保存在FunctionKey 寄存器中的。功能鍵寄存器FunctionKey 的初始值是FFH,每一個位對應一個功能鍵,第0 位(LSB)對應F0,第1 位對應F1,依此類推,第7 位(MSB)對應F7。某一功能鍵被按下時,相應的FunctionKey 位就清零。功能鍵還有一個特性就是“二次中斷”,按下時產生一次中斷信號,抬起時又會產生一次中斷信號;而普通鍵只會在被按下時產生一次中斷。
(5)命令緩沖區CmdBuf0 和CmdBuf1(地址:07H 和08H)
通過向命令緩沖區寫入相關的控制命令可以實現段尋址、下載顯示數據功能。
(6)閃爍控制寄存器FlashOnOff(地址:0BH)
FlashOnOff 寄存器決定閃爍頻率和占空比。復位值為0111 0111B。高4 位表示閃爍時亮的持續時間,低4 位表示閃爍時滅的持續時間。改變FlashOnOff 的值,可以同時改變閃爍頻率和占空比。FlashOnOff 取值00H 時可獲得最快的閃爍速度,亮滅時間計算公式如下:
T = N × 50 + 150mS
T 為閃爍時亮或滅的持續時間,N 為寄存器的高4 位或低4 位的值,取值0~15.最快閃爍頻率為3.33Hz(周期為300mS),最慢閃爍頻率為0.55Hz(周期為1.8S)。特別說明:單獨設置FlashOnOff 寄存器的值,不會看到顯示閃爍,而應該配合閃爍控制命令一起使用。
(7)消隱寄存器DispCtrl0(地址:0CH)和DispCtrl1(地址:0DH)
如表6.35 所示為消隱寄存器,DispCtrl0、DispCtrl1 寄存器決定哪些位是否顯示,對應數碼管的1~12 位。寄存器位為1 時,對應數碼管位不顯示。復位值都是0x00,即數碼管的12 個位都掃描顯示。
表6.35 消隱寄存器
在實際應用中可能需要顯示的位數不足12 位,例如只顯示8 位,這時可以把DispCtrl0的值設置為0x0F,把DispCtrl1 的值設置為0x00,則數碼管的第0~7 位被掃描顯示,而第8~12 位不會顯示。
(8)閃爍寄存器Flash0(地址:0EH)和Flash1(地址:0FH)
如表6.36 所示為閃爍寄存器,Flash0、Flash 1 寄存器決定哪些位是否閃爍,對應數碼管的1~12 位。寄存器位為1 時,對應數碼管位閃爍。復位值都是0x00,即數碼管的12 個位都不閃爍。
表6.36 閃爍寄存器
在實際應用中可能需要某些位閃爍,例如最后2 位閃爍,這時可以把Flash0 的值設置為0x00,把Flash1 的值設置為0x03,則數碼管的第1、2 位閃爍,而第3~12 位不會閃爍。
(9)顯示緩沖區DispBuf0~DispBuf11(地址:10H~1BH)
DispBuf0~DispBuf11 這12 個寄存器的取值直接決定了數碼管的顯示內容。每個寄存器的8 個位分別對應數碼管的a、b、c、d、e、f、g、dp 段,MSB 對應a,LSB 對應dp。例如大寫字母H 的字型數據為6EH(不帶小數點)或6FH(帶小數點)。
4. 控制命令詳解
寄存器CmdBuf0(地址:07H)和CmdBuf1(地址:08H)共同組成命令緩沖區。通過向命令緩沖區寫入相關的控制命令可以實現段尋址、下載顯示數據、控制閃爍等功能。
(1)段尋址(SegOnOff)
如表6.37 所示為段尋址寄存器,在段尋址命令中12 位數碼管被看成是96 個段,每一個段實際上就是一個獨立的LED。
雙字節命令在指令格式中,CmdBuff0 的高4 位“0001”是命令碼,CmdBuff0 的最低位on 位表示該段是否點亮,0—熄滅,1—點亮。CmdBuff0 的B3B2B1B0 是位地址,取值0~11。S3S2S1S0 是4 位段地址,取值0~7,對應數碼管的a、b、c、d、e、f、g、dp。
表6.37 段尋址寄存器
(2)下載數據并譯碼(Download)
如表6.38 所示為下載數據及譯碼寄存器,雙字節命令在指令格式中,CmdBuff0 的高4位“0010”是命令碼A3A2A1A0 是數碼管顯示數據的位地址,位地址編號按從左到右的順序依次為11、10、9、8、……、0,dp 控制小數點是否點亮,0-熄滅,1-點亮。Flash 表示是否要閃爍,0-正常顯示,1-閃爍。d4d3d2d1d0 是要顯示的數據,包括10 種數字和21種字母,顯示數據按照表6.39 中的規則進行譯碼。
表6.38 下載數據、譯碼寄存器
表6.39 下載數據并譯碼命令的數據表
(3)復位命令(Reset)
單字節命令,在指令格式中,CmdBuf0 的高4 位的“0011”是命令碼,其功能是將所有LED 熄滅,詳見表6.40。
表6.40 復位命令寄存器
(4)測試命令(Test)
單字節命令,在指令格式中,CmdBuf0 的高4 位的“0100”是命令碼,其功能是將所有LED 按照0.5S 的速率閃爍,詳見表6.41。
表6.41 測試命令寄存器
(5)左移命令(ShiftLeft)
單字節命令,在指令格式中,CmdBuf0 的高4 位的“0101”是命令碼,詳見表6.42。功能是以數碼管的位為單位的,左移n 位。左移后右邊空出的位不顯示任何內容,即全部LED熄滅狀態。n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:
n = (b3×8)+( b2×4)+ (b1×2)+ b0
表6.42 左移命令寄存器
(6)循環左移命令(CyclicShiftLeft)
單字節命令,在指令格式中,CmdBuf0 的高4 位的“0110”是命令碼,詳見表6.43。功能是以數碼管的位為單位的,循環左移n 位。
左移后右邊顯示從最左邊移出的內容。n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:
n = (b3×8)+( b2×4)+ (b1×2)+ b0
表6.43 循環左移命令寄存器
(7)右移命令(ShiftRight)
單字節命令,在指令格式中,CmdBuf0 的高4 位的“0111”是命令碼,詳見表6.44。功能是以數碼管的位為單位的,右移n 位。
右移后左邊空出的位不顯示任何內容,即全部LED 熄滅狀態。n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:
n = (b3×8)+( b2×4)+ (b1×2)+ b0
表6.44 右移命令寄存器
(8)循環右移命令(CyclicShiftRight)
單字節命令,在指令格式中,CmdBuf0 的高4 位的“1000”是命令碼,詳見表6.45。功能是以數碼管的位為單位的,循環右移n 位。右移后左邊顯示從最右邊移出的內容,n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:
n = (b3×8)+( b2×4)+ (b1×2)+ b0
表6.45 循環右移命令寄存器
(9)數碼管掃描位數設置指令 (Scanning)
單字節命令,在指令格式中CmdBuf0 的高4 位的“1001”是命令碼,設置數碼管掃描位數n,詳見表6.46。n 的取值為0~12,大于12 按12 位進行掃描。掃描位數n 以位選端第1位開始到位選端第n 位掃描有效。n 的值由CmdBuf0 的低四位決定,按下列公式計算。
n = (b3×8)+( b2×4)+ (b1×2)+ b0
表6.46 掃描位數設置寄存器
在使用過程中,如果不需要12 位數碼管顯示,從最高位開始裁剪,同時將數碼掃描位數設置成相應的數碼管位數。數碼管的掃描位數減少后,有用的顯示位由于分配的掃描時間更多,因而顯示亮度得以提高。
>>> 6.5.2 ZLG72128 初始化
AMetal 已經提供了ZLG72128 的驅動函數,使用其它各功能函數管理數碼管和按鍵前,必須先完成ZLG72128 的初始化。其初始化函數(am_zlg72128.h)的原型為:
該函數意在獲取ZLG72128 的實例句柄。其中,p_dev 是指向am_zlg72128_dev_t 類型實例的指針,p_devinfo 是指向am_zlg72128_devinfo_t 類型實例信息的指針。
-
實例
定義am_zlg72128_dev_t 類型(am_zlg72128.h)實例如下:
其中,g_zlg72128_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
-
實例信息
實例信息描述了中斷引腳相關的信息, 其類型am_zlg72128_devinfo_t 的定義(am_zlg72128.h)如下:
其中,use_int_pin 表示是否使用ZLG72128 的中斷輸出引腳(KEY_INT)。若該值為TRUE,表明需要使用中斷引腳,此時int_pin 指定與主控制器(如LPC824)連接的引腳號,按鍵鍵值將在引腳中斷中獲取;若該值為FALSE,表明不使用中斷引腳,此時interval_ms 指定查詢鍵值的時間間隔。
一般地,只要主控器的I/O 資源不是非常緊缺,均會使用中斷引腳。若為節省一個I/O中斷資源,可將use_int_pin 設置為FALSE,此時將不占用IO 中斷資源,而系統將會以查詢的方式從ZLG72128 中獲取鍵值,這就會耗費一定的CPU 資源,因為每隔一段時間就要主動查詢一次鍵值。假設使用ZLG72128 的中斷引腳,主控制器使用LPC824,ZLG72128 的KEY_INT 引腳與LPC824 的PIO0_17 連接。其實例信息定義如下:
-
I2C句柄i2c_handle
若使用LPC824 的I2C1 與ZLG72128 通信,則I2C句柄可以通過LPC82x 的I2C1 實例初始化函數am_lpc82x_i2c1_inst_init()獲得。即:
獲得的I2C句柄即可直接作為i2c_handle 的實參傳遞。
-
實例句柄
am_zlg72128_init()函數的返回值為ZLG72128 實例的句柄,該句柄將作為其它功能接口(數碼管顯示、按鍵管理等)的第一個參數(handle)的實參。
其類型am_zlg72128_handle_t(am_zlg72128.h)定義如下:
若返回值為NULL,說明初始化失敗;若返回值不為NULL,說明返回一個有效的handle。
基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單6.111 和程序清單6.112。
程序清單6.111 ZLG72128 實例初始化函數實現(am_hwconf_zlg72128.c)
程序清單6.112 ZLG72128 實例初始化函數聲明(am_hwconf_zlg72128.h)
后續只需要使用無參數的實例初始化函數即可獲取到ZLG72128 的實例句柄。即:
>>> 6.5.3 按鍵管理接口函數
ZLG72128 支持32 個鍵(4 行8 列矩陣鍵盤),其中,前3 行為普通鍵,同一時刻只能有一個普通鍵按下。最后一行為功能鍵,多個功能鍵可以同時按下。按鍵管理僅一個注冊按鍵回調接口函數。
為了在檢測到按鍵事件(有鍵按下)時,及時將按鍵事件通知用戶,需要用戶注冊一個回調函數,當有按鍵事件發生時,將自動調用用戶注冊的回調函數。其函數原型為:
其中,pfn_key_cb 為注冊的按鍵回調函數,p_arg 為回調函數的第一個參數的值,即當檢測到按鍵事件自動調用回調函數時,將p_arg 的值作為回調函數的第一個參數的值。
回調函數的類型am_zlg72128_key_cb_t(am_zlg72128.h)定義如下:
由此可見,回調函數有4 個參數,用戶可以通過這些參數獲取按鍵相關的信息。特別地,第一個參數p_arg 為用戶自定義的參數,其值即為注冊回調函數時p_arg 參數設置的值。
key_val、repeat_cnt、funkey_val 表示按鍵事件的相關信息,ZLG72128 可能的按鍵事件有以下3 種:
-
有普通鍵按下(普通鍵釋放不作為按鍵事件)
當有普通鍵按下時,key_val 表示按下鍵的鍵值,鍵值的有效范圍為1 ~ 24,普通鍵的鍵值已在am_zlg72128.h 中定義為宏,宏名為AM_ZLG72128_KEY_X_Y,其中X 表示行號(1 ~ 3),Y 表示列號(1 ~ 8),如第2 行第5 個鍵的鍵值為:AM_ZLG72128_KEY_2_5。
-
普通鍵一直按下(處于連擊狀態)
普通鍵按下保持時間超過2s 后進入連擊狀態,處于連擊狀態時,每隔200ms 左右會產生一個按鍵事件,并使用一個連擊計數器對產生的按鍵事件計數,每產生一個按鍵事件連擊計數器的值加1,由于連擊計數器的位寬為8 位,因此,當值達到255 后不再加1,但同樣還會繼續產生按鍵事件,直到鍵釋放,連擊計數器清0。處于連擊狀態時,key_val 表示按下鍵的鍵值,repeat_cnt 表示連擊計數器的值。
-
功能鍵狀態發生變化(功能鍵按下或釋放都會造成狀態改變)
funkey_val 的值表示所有功能鍵的狀態。最后一行最多8 個鍵,從左至右分別為F0 ~ F7,與funkey_val 的bit0 ~ bit7 一一對應,位值為0 表示對應功能鍵按下,位值為1 表示對應功能鍵未按下。當無任何功能鍵按下時,funkey_val 的值為0xFF。只要funkey_val 的值發生改變,就會產生一個按鍵事件,功能鍵不提供連擊功能。可以使用am_zlg72128.h 中的宏
AM_ZLG72128_FUNKEY_CHECK(funkey_val, funkey_num)來簡單判斷某一功能鍵是否按下。funkey_num 用于表示需要檢測的功能鍵, 值已經定義為宏, F0 ~ F7 分別為AM_ZLG72128_FUNKEY_0 ~ AM_ZLG72128_FUNKEY_7。若對應鍵按下,則宏值為TURE;反之,則宏值FALSE。例如,通過funkey_val 判斷F0 是否按下可以使用如下語句:
功能鍵類似PC 機上的Ctrl、Alt、Shift 等按鍵,使用普通鍵和功能鍵很容易實現組合鍵應用,注冊按鍵回調函數的范例程序詳見程序清單6.113。
程序清單6.113 ZLG72128 注冊按鍵回調函數使用范例
若只按下第一行第一個鍵,則LED0 狀態翻轉,若按下第一行第一個鍵的同時,也按下了功能鍵F0,則LED1 狀態翻轉,該示例簡單的展示了組合鍵的使用方法。
>>> 6.5.4 數碼管顯示接口函數
ZLG72128 支持12 位共陰式數碼管,以及閃爍、位移等功能,雖然接口函數種類繁多,但各個接口函數的功能較為簡單,下面將一一介紹各個接口函數的使用方法。
1. 閃爍持續時間
當數碼管閃爍時,設置其點亮和熄滅持續時間的函數原型為:
上電時,數碼管點亮和熄滅的持續時間默認值為500ms。on_ms 和off_ms 有效的時間值為150、200、250、……、800、850、900,即150ms ~ 900ms,且時間間隔為50ms。若時間間隔不是這些值,應該選擇一個最接近的值。比如,設置數碼管以最快的頻率閃爍,即亮、滅時間最短為150ms,其使用方法如下:
注:僅設置閃爍時間還不能立即看到閃爍現象,必須打開某位的閃爍開關后才能看到閃爍現象,詳見am_zlg72128_digitron_flash_ctrl()函數介紹。
2. 閃爍控制
控制數碼管是否閃爍的函數原型為:
其中,ctrl_val 為控制值,bit0 ~ bit11 為有效位,分別對應數碼管0 ~ 11,位值為0 時不閃爍,位值為1 時閃爍。上電默認值為0x0000,即所有數碼管均不閃爍。比如,控制所有數碼管閃爍,其使用方法如下:
注:由于初始時可能數碼管未顯示任何內容,這段代碼可能看不到閃爍現象,因此可以在設置前,使用后續相關API 使數碼管顯示一些實際有效的內容。
3. 顯示屬性(開或關)
顯示屬性是指控制哪些數碼管顯示,哪些數碼管不顯示。在默認情況下,所有數碼管均處于打開顯示狀態,掃描12 位數碼管。而實際上,可能需要顯示的位數并不足12 位,此時可以使用該函數關閉某些位的顯示。其函數原型為:
其中,ctrl_val 為控制值,bit0 ~ bit11 為有效位,分別對應數碼管0 ~ 11,位值為0 時打開顯示,位值為1 時關閉顯示。上電的默認值為0x0000,即所有位均正常顯示。比如,只使用了數碼管0 ~ 7,基于此,可以關閉數碼管8 ~ 11,其使用方法如下:
注:使用該函數控制顯示屬性時,對應數碼管的段碼內容并不會改變。
4. 顯示字符
在指定位置顯示字符,ZLG72128 已經提供了0 ~ 9 這10 個數字和常見的21 種字母的自動譯碼顯示,無需應用再自行譯碼。其函數原型為:
顯示的字符必須是ZLG72128 已經支持的可以自動完成譯碼的字符,包括字符'0'~'9'與AbCdEFGHiJLopqrtUychT(區分大小寫)。注意,若要顯示數字1,則ch 參數應為字符'1',而不是數字1。
若指定的字符不支持,則返回-AM_ENOTSUP。只要成功顯示,則返回AM_OK。若需要顯示一些自定義的圖形,使用 am_zlg72128_digitron_dispbuf_set() 直接設置顯示的段碼。
比如,在數碼管0 顯示字符F,不顯示小數點,不閃爍,其使用方法如下:
5. 顯示字符串
指定字符串顯示的起始位置,開始顯示一個字符串。其函數原型為:
字符串顯示遇到字符結束標志'\0'將自動結束,或當超過有效的字符顯示區域時,也會自動結束。顯示的字符應確保是ZLG72128 能夠自動完成譯碼的,包括字符'0'~'9'與AbCdEFGHiJLopqrtUychT(區分大小寫)。如遇到有不支持的字符,對應位置將不顯示任何內容。比如,從數碼管0 開始,顯示字符串“0123456789”,其使用方法如下:
6. 顯示0~9 的數字
在指定位置顯示0~9 的數字,其函數原型為:
該函數僅用于顯示一個0~9 的數字,若數字大于9,應自行根據需要分別顯示各個位。
注意,num 參數為數字0~9,不是字符'0'~'9'。比如,在數碼管0 顯示數字8,不顯示小數點,不閃爍。其使用方法如下:
7. 直接設置數碼管顯示段碼
該函數用于設置各個數碼管顯示的段碼,當需要顯示一些不能自動譯碼顯示的圖形或字符時,可以使用該函數靈活的顯示各種各樣的圖形。其函數原型為:
該函數一次可以設置多個連續數碼管顯示的緩沖區內容,起始顯示位置由start_pos 指定,有效值為0 ~ 11,連續顯示數碼管的個數由參數num 指定。該函數將依次設置start_pos~ (start_pos + num -1)的各個數碼管的顯示內容。
段碼為8 位,bit0~bit7 分別對應段a ~ dp。位值為1 時,對應段點亮,位值為0 時,對應段熄滅。如顯示數字1,則需要點亮段b 和段c,這就需要bit1 和bit2 為1,因此段碼為00000110,即0x06。其它顯示圖形可以以此類推。比如,在數碼管0 ~ 9 顯示數字0~9,可以使用該函數直接設置各個數碼管顯示的段碼,使用方法如下:
8. 直接控制段的點亮或熄滅
雖然已經提供了直接設置顯示段碼的函數,但為了更加靈活的顯示一個圖形,或控制圖形的變換。ZLG72128 支持直接控制某個段的亮滅。其函數原型為:
pos 用于指定數碼管的位置,有效值為0~11。seg 表明要控制的段,有效值為0~7,分別對應a ~ dp。各個段已經在am_zlg72128.h 文件中使用宏的形式定義好了。建議不要直接使用立即數0~7,而應使用與a ~ dp 相對應的宏AM_ZLG72128_DIGITRON_SEG_A ~AM_ZLG72128_DIGITRON_SEG_DP。比如,在當前顯示的基礎上,需要在數碼管0 顯示出小數點,其它內容不變,此時就可以直接使用該函數控制點亮數碼管0 的dp 段,其使用方法如下:
注:一次只能控制一個段。
9. 顯示移位控制
ZLG72128 支持移位控制,可以使所有數碼管根據命令進行移位。共支持4 種移位方式,左移、循環左移、右移和循環右移。其函數原型為:
dir 指定移位方向,表示方向的宏值已經在am_zlg72128.h 文件中使用宏的形式定義好了,應直接使用宏值作為dir 參數的值,左移為AM_ZLG72128_DIGITRON_SHIFT_LEFT,右移為AM_ZLG72128_DIGITRON_SHIFT_RIGHT。
is_cyclic 為TRUE 時表明是循環移位,否則不是循環移位。如果不是循環移位,則移位后,右邊空出的位(左移)或左邊空出的位(右移)將不顯示任何內容。若是循環移動,則空出的位將會顯示被移除位的內容。num 指定移動的位數,一次可以移動 0 ~ 11 位。大于11 的值將視為無效值。比如,要將當前數碼管顯示循環左移一位,其使用方法如下:
實際中,可能會發現移位方向與傳入的命令恰恰相反,這是由于硬件設計的不同造成的。常見的,可能有以下兩種硬件設計方式:
-
最右邊為數碼管0,從左至右為:11、10、9、8、7、6、5、4、3、2、1、0
-
最左邊為數碼管0,從左至右為:0、1、2、3、4、5、6、7、8、9、10、11
這主要取決于硬件設計時 COM0 ~ COM11 引腳所對應數碼管所處的物理位置。此處左移和右移的概念是以ZLG72128 典型應用電路為參考的,其COM0 對應的是最右邊的數碼管,即最右邊為數碼管0。那么左移和右移的概念分別為:
左移:數碼管0(最右側數碼管)顯示切換到1,數碼管1 顯示切換到2,……,數碼管10 顯示切換到11。
右移:數碼管11(最左側數碼管)顯示切換到10,數碼管1 顯示切換到2,……,數碼管10 顯示切換到11。
若硬件電路設計數碼管位置是相反的(如COM0 對應的是最左邊的數碼管),則移位效果恰恰是相反的,此處只需要稍微注意即可。
10. 復位顯示
復位顯示將數碼管顯示的內容清空,即所有數碼管不顯示任何內容。其函數原型為:
11. 測試命令
測試命令主要用于測試數碼管的硬件電路是否連接正常。其函數原型為:
執行測試命令后,數碼管段顯示“8.8.8.8.8.8.8.8.8.8.8.8.”,并以0.5s 的速率閃爍。
12. 數碼管顯示測試
為了判斷數碼管是否工作正常,實現一個簡單的數碼管顯示測試:系統啟動時,數碼管進入測試狀態,數碼管所有段全部點亮,即顯示“8.8.8.8.8.8.8.8.8.8.8.8.”,并以0.5s 的速率閃爍。歷時3 秒后,清空顯示內容。
由于ZLG72128 自帶數碼管測試命令,所以該項功能很容易實現,直接調用測試命令接口,延時3s 后,復位數碼管顯示即可。范例程序詳見程序清單6.114。
程序清單6.114 數碼管顯示測試范例程序
13. 單個普通鍵測試
為了測試各個普通鍵是否工作正常,實現一個簡單的按鍵測試:按下任何一個普通鍵,數碼管顯示當前鍵的鍵值(1~24)。
對于普通鍵,當鍵按下時,可以通過按鍵回調函數直接獲取到鍵值(1~24),獲取到鍵值后,使用數碼管顯示接口將該值顯示出來即可。范例程序詳見程序清單6.115。
程序清單6.115 普通按鍵測試范例程序
14. 組合鍵使用
ZLG72128 有8 個功能鍵,功能鍵如同電腦鍵盤的Ctrl、Shift 和Alt 鍵,與其它普通按鍵組合可以實現豐富的功能,如Ctrl+S(保存),Ctrl+A(全選),Ctrl+Z(撤銷)等。
這里,以功能鍵F0 為例,展示其如何與普通按鍵組合使用。為方便觀察,定義下列操作及對應的現象:
-
F0 + K1:數碼管顯示循環左移;
-
F0 + K2:數碼管顯示循環右移;
-
F0 + K3:所有閃爍顯示打開/關閉。
各種組合鍵對應的功能都有相應的API,相應的范例程序詳見程序清單6.116。
程序清單6.116 組合鍵使用范例程序
至此,各個功能的處理函數都編寫好了。但對于按鍵事件的處理,還有關鍵的一步就是獲取到鍵值。通過上述對ZLG72128 接口函數的介紹可知,如需獲取鍵值,只需要注冊按鍵回調函數,然后在回調函數中即可通過傳遞給回調函數的參數獲得鍵值。
按照常規思維,獲取鍵值后,可能直接在回調函數中調用相關處理函數對按鍵作相應處理,但這是非常不妥的。這是因為,回調函數一般都是在中斷環境中執行的,如果回調函數的處理占用了很長的時間,將嚴重影響整個系統的實時性。應該保證回調函數的處理盡可能快的結束。基于此,在按鍵回調函數中僅完成鍵值的保存,實際的處理在am_main()函數主循環中完成。因此回調函數的處理就非常簡單了,只需要保存下鍵值,并設置一個標志供am_main()主循環查詢即可。范例程序詳見程序清單6.117。
程序清單6.117 回調函數處理范例程序
這里定義了一個按鍵事件信息結構體變量,將按鍵回調函數中的相關信息全部存放在該結構體中。當key_event 的值為TRUE 時,說明有按鍵事件,范例程序詳見程序清單6.118。
程序清單6.118 綜合示例程序
-
寄存器
+關注
關注
31文章
5317瀏覽量
120008 -
數碼管
+關注
關注
32文章
1874瀏覽量
90945 -
周立功
+關注
關注
38文章
130瀏覽量
37584 -
zlg72128
+關注
關注
1文章
3瀏覽量
3439
原文標題:周立功:重用外設驅動代碼——鍵盤與數碼管接口
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論