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

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

3天內(nèi)不再提示

鍵盤與數(shù)碼管接口典型應用電路及寄存器

UtFs_Zlgmcu7890 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-01-22 09:27 ? 次閱讀

周立功教授新書《面向AMetal框架與接口編程(上)》,對AMetal框架進行了詳細介紹,通過閱讀這本書,你可以學到高度復用的軟件設計原則和面向接口編程的開發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實現(xiàn)企業(yè)和個人的共同進步。

第六章為重用外設驅動代碼,本文內(nèi)容為6.5 鍵盤與數(shù)碼管接口。

6.5 鍵盤與數(shù)碼管接口

>>> 6.5.1 ZLG72128 接口

當矩陣擴大到一定數(shù)目時,逐行掃描的方法會顯得費時,如果需要對2 個以上的按鍵“同時”操作時,則處理起來更是麻煩。ZLG72128 是ZLG 自行設計的數(shù)碼管顯示驅動與鍵盤掃描管理芯片,能夠直接驅動12 位共陰式數(shù)碼管(或96 只獨立的LED),同時還可以掃描管理多達32 個按鍵,其中的8 個按鍵如同電腦鍵盤上的Ctrl、Shift 和Alt 鍵一樣可以作為功能鍵使用。

另外,ZLG72128 內(nèi)部還設置有連擊計數(shù)器,能夠使某鍵按下后不松手而連續(xù)有效。該芯片為工業(yè)級芯片,抗干擾能力強,在工業(yè)測控中已有大量應用。

1. 特點

  • 直接驅動12 位1 英寸以下的共陰式數(shù)碼管或96 只獨立的LED;

  • 能夠管理多達32 個按鍵,其中的8 個按鍵可以用作功能鍵,自動消除抖動;

  • 利用功率電路可以方便地驅動1 英寸以上的大型數(shù)碼管;

  • 具有位閃爍、位消隱、段點亮、段熄滅、功能鍵、連擊鍵計數(shù)等強大功能;

  • 具有10 種數(shù)字和21 種字母的譯碼顯示功能,亦可直接向顯示緩存寫入顯示數(shù)據(jù);

  • 軟件配置支持0~12 個數(shù)碼管顯示模式;

  • MCU 之間采用I2C串行總線接口;

  • 工作電壓范圍: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 位數(shù)據(jù)表示8 個鍵值的狀態(tài),F(xiàn)0 ~ F7分別對應bit0 ~ bit 7。按下時相應位為0,釋放時相應位為1,只要表示這8 個按鍵的8 位數(shù)據(jù)值發(fā)生變化,則會通過INT 引腳通知用戶,因此對于功能按鍵,按鍵按下或釋放用戶均能夠得到通知。

注意,需要在鍵盤電路與ZLG72128 芯片引腳之間連接一個電阻,其典型值為1KΩ。在多數(shù)應用中可能不需要這么多的鍵,這時既可以按行也可以按列裁減鍵盤。需要注意的是,該按鍵電路對于3 個或3 個以上鍵按下的情況是不適用的。

圖6.13 按鍵電路

如圖6.14 所示是針對2 個或2 個以上功能鍵與普通鍵搭配使用的情況下的按鍵電路,在功能鍵與普通鍵之間加了一個二極管,注意:二極管應該盡量選擇導通壓降較小的。

圖6.14 多個功能鍵復用按鍵電路

如圖6.15 所示為ZLG72128 的典型應用電路原理圖,用戶在使用芯片驅動數(shù)碼管與管理按鍵時,可參考該電路進行電路設計。ZLG72128 只能直接驅動12 位共陰式數(shù)碼管驅動,在數(shù)碼管的段與ZLG72128 芯片引腳之間需要接一個限流電阻,其典型值為270Ω。如果需要增大數(shù)碼管的亮度,則可以適當減小電阻值。ZLG72128 的驅動能力畢竟有限,當使用大型數(shù)碼管時,則可能顯示亮度不夠,這時可以適當減小數(shù)碼管的限流電阻值以增加亮度,阻值最小為200Ω,如果亮度依舊不夠,就必須加入功率驅動電路,詳見ZLG72128 用戶手冊(http://www.zlgmcu.com)。

為了使ZLG72128 芯片電源穩(wěn)定,一般在VCC 和GND 之間接入一個47~470μF 的電解電容。按照I2C總線協(xié)議的要求,信號線SCL 和SDA 上必須分別接上拉電阻,其典型值是4.7KΩ。當通信速率大于100kbps 時,建議減小上拉電阻的值。芯片復位引腳RST 是低電平有效,可以將其接入到MCU 的I/O 來控制其復位。KEY_INT 引腳可輸出按鍵中斷請求信號(低電平有效),可以連接到MCU 的I/O 來獲取按鍵按下或釋放事件。

圖6.15 ZLG72128 典型應用電路

3. 寄存器詳解

ZLG72128 內(nèi)部有12 個顯示緩沖寄存器DispBuf0~DispBuf11,它們直接決定數(shù)碼管顯示的內(nèi)容。ZLG72128 提供有2 種顯示控制方式,一種是直接向顯存寫入字型數(shù)據(jù),另一種是通過向命令緩沖寄存器寫入控制指令實現(xiàn)自動譯碼顯示。訪問這些寄存器需要通過I2C總線接口來實現(xiàn),ZLG72128 的I2C總線器件地址是60H(寫操作)和61H(讀操作),訪問

內(nèi)部寄存器要通過“子地址”實現(xiàn)。

(1)系統(tǒng)寄存器SystemReg(地址:00H)

系統(tǒng)寄存器的第0 位(LSB)稱作KeyAvi,標志著按鍵是否有效,0-沒有按鍵被按下,1-有某個按鍵被按下。SystemReg 寄存器的其它位暫時沒有定義。當按下某個鍵時,ZLG72128 的KEY_INT 引腳會產(chǎn)生一個低電平的中斷請求信號。當讀取鍵值后,中斷信號就會自動撤銷(變?yōu)楦唠娖剑鳮eyAvi 也同時予以反映。正常情況下MCU 只需要判斷KEY_INT 引腳即可。通過不斷查詢KeyAvi 位也能判斷是否有鍵按下,這樣就可以節(jié)省微控制器的一根I/O 口線,但是I2C總線處于頻繁的活動狀態(tài),多消耗電流且不利于抗干擾。

(2)鍵值寄存器Key(地址:01H)

如果K1~K24 的某個普通鍵被按下,則微控制器可以從鍵值寄存器Key 中讀取相應的鍵值1~24。如果微控制器發(fā)現(xiàn)ZLG72128 的KEY_INT 引腳產(chǎn)生了中斷請求,而從Key 中讀到的鍵值是0,則表示按下的可能是功能鍵。鍵值寄存器Key 的值在被讀走后自動變成0。

(3)連擊計數(shù)器RepeatCnt(地址:02H)

ZLG72128 為K1~K24 提供了連擊計數(shù)功能。所謂連擊是指按住某個普通鍵不松手,經(jīng)過兩秒鐘的延遲后,開始連續(xù)有效,連續(xù)有效間隔時間約兩百毫秒。這一特性跟電腦上的鍵盤很類似。在微控制器能夠及時響應按鍵中斷并及時讀取鍵值的前提下,當按住某個普通鍵一直不松手時:首先會產(chǎn)生一次中斷信號,這時連擊計數(shù)器RepeatCnt 的值仍然是0;經(jīng)過兩秒延遲后,會連續(xù)產(chǎn)生中斷信號,每中斷一次RepeatCnt 就自動加1;當RepeatCnt 計數(shù)到255 時就不再增加,而中斷信號繼續(xù)有效。在此期間,鍵值寄存器的值每次都會產(chǎn)生。

(4)功能鍵寄存器FunctionKey(地址:03H)

ZLG72128 提供的8 個功能鍵F0~F7。功能鍵常常是配合普通鍵一起使用的,就像電腦鍵盤上的Shift、Ctrl 和Alt 鍵。當然功能鍵也可以單獨去使用,就像電腦鍵盤上的F1~F12。當按下某個功能鍵時,在KEY_INT 引腳也會像按普通鍵那樣產(chǎn)生中斷信號。功能鍵的鍵值是被保存在FunctionKey 寄存器中的。功能鍵寄存器FunctionKey 的初始值是FFH,每一個位對應一個功能鍵,第0 位(LSB)對應F0,第1 位對應F1,依此類推,第7 位(MSB)對應F7。某一功能鍵被按下時,相應的FunctionKey 位就清零。功能鍵還有一個特性就是“二次中斷”,按下時產(chǎn)生一次中斷信號,抬起時又會產(chǎn)生一次中斷信號;而普通鍵只會在被按下時產(chǎn)生一次中斷。

(5)命令緩沖區(qū)CmdBuf0 和CmdBuf1(地址:07H 和08H)

通過向命令緩沖區(qū)寫入相關的控制命令可以實現(xiàn)段尋址、下載顯示數(shù)據(jù)功能。

(6)閃爍控制寄存器FlashOnOff(地址:0BH)

FlashOnOff 寄存器決定閃爍頻率和占空比。復位值為0111 0111B。高4 位表示閃爍時亮的持續(xù)時間,低4 位表示閃爍時滅的持續(xù)時間。改變FlashOnOff 的值,可以同時改變閃爍頻率和占空比。FlashOnOff 取值00H 時可獲得最快的閃爍速度,亮滅時間計算公式如下:

T = N × 50 + 150mS

T 為閃爍時亮或滅的持續(xù)時間,N 為寄存器的高4 位或低4 位的值,取值0~15.最快閃爍頻率為3.33Hz(周期為300mS),最慢閃爍頻率為0.55Hz(周期為1.8S)。特別說明:單獨設置FlashOnOff 寄存器的值,不會看到顯示閃爍,而應該配合閃爍控制命令一起使用。

(7)消隱寄存器DispCtrl0(地址:0CH)和DispCtrl1(地址:0DH)

如表6.35 所示為消隱寄存器,DispCtrl0、DispCtrl1 寄存器決定哪些位是否顯示,對應數(shù)碼管的1~12 位。寄存器位為1 時,對應數(shù)碼管位不顯示。復位值都是0x00,即數(shù)碼管的12 個位都掃描顯示。

表6.35 消隱寄存器

在實際應用中可能需要顯示的位數(shù)不足12 位,例如只顯示8 位,這時可以把DispCtrl0的值設置為0x0F,把DispCtrl1 的值設置為0x00,則數(shù)碼管的第0~7 位被掃描顯示,而第8~12 位不會顯示。

(8)閃爍寄存器Flash0(地址:0EH)和Flash1(地址:0FH)

如表6.36 所示為閃爍寄存器,F(xiàn)lash0、Flash 1 寄存器決定哪些位是否閃爍,對應數(shù)碼管的1~12 位。寄存器位為1 時,對應數(shù)碼管位閃爍。復位值都是0x00,即數(shù)碼管的12 個位都不閃爍。

表6.36 閃爍寄存器

在實際應用中可能需要某些位閃爍,例如最后2 位閃爍,這時可以把Flash0 的值設置為0x00,把Flash1 的值設置為0x03,則數(shù)碼管的第1、2 位閃爍,而第3~12 位不會閃爍。

(9)顯示緩沖區(qū)DispBuf0~DispBuf11(地址:10H~1BH)

DispBuf0~DispBuf11 這12 個寄存器的取值直接決定了數(shù)碼管的顯示內(nèi)容。每個寄存器的8 個位分別對應數(shù)碼管的a、b、c、d、e、f、g、dp 段,MSB 對應a,LSB 對應dp。例如大寫字母H 的字型數(shù)據(jù)為6EH(不帶小數(shù)點)或6FH(帶小數(shù)點)。

4. 控制命令詳解

寄存器CmdBuf0(地址:07H)和CmdBuf1(地址:08H)共同組成命令緩沖區(qū)。通過向命令緩沖區(qū)寫入相關的控制命令可以實現(xiàn)段尋址、下載顯示數(shù)據(jù)、控制閃爍等功能。

(1)段尋址(SegOnOff)

如表6.37 所示為段尋址寄存器,在段尋址命令中12 位數(shù)碼管被看成是96 個段,每一個段實際上就是一個獨立的LED。

雙字節(jié)命令在指令格式中,CmdBuff0 的高4 位“0001”是命令碼,CmdBuff0 的最低位on 位表示該段是否點亮,0—熄滅,1—點亮。CmdBuff0 的B3B2B1B0 是位地址,取值0~11。S3S2S1S0 是4 位段地址,取值0~7,對應數(shù)碼管的a、b、c、d、e、f、g、dp。

表6.37 段尋址寄存器

(2)下載數(shù)據(jù)并譯碼(Download

如表6.38 所示為下載數(shù)據(jù)及譯碼寄存器,雙字節(jié)命令在指令格式中,CmdBuff0 的高4位“0010”是命令碼A3A2A1A0 是數(shù)碼管顯示數(shù)據(jù)的位地址,位地址編號按從左到右的順序依次為11、10、9、8、……、0,dp 控制小數(shù)點是否點亮,0-熄滅,1-點亮。Flash 表示是否要閃爍,0-正常顯示,1-閃爍。d4d3d2d1d0 是要顯示的數(shù)據(jù),包括10 種數(shù)字和21種字母,顯示數(shù)據(jù)按照表6.39 中的規(guī)則進行譯碼。

表6.38 下載數(shù)據(jù)、譯碼寄存器

表6.39 下載數(shù)據(jù)并譯碼命令的數(shù)據(jù)表

(3)復位命令(Reset)

單字節(jié)命令,在指令格式中,CmdBuf0 的高4 位的“0011”是命令碼,其功能是將所有LED 熄滅,詳見表6.40。

表6.40 復位命令寄存器

(4)測試命令(Test)

單字節(jié)命令,在指令格式中,CmdBuf0 的高4 位的“0100”是命令碼,其功能是將所有LED 按照0.5S 的速率閃爍,詳見表6.41。

表6.41 測試命令寄存器

(5)左移命令(ShiftLeft)

單字節(jié)命令,在指令格式中,CmdBuf0 的高4 位的“0101”是命令碼,詳見表6.42。功能是以數(shù)碼管的位為單位的,左移n 位。左移后右邊空出的位不顯示任何內(nèi)容,即全部LED熄滅狀態(tài)。n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:

n = (b3×8)+( b2×4)+ (b1×2)+ b0

表6.42 左移命令寄存器

(6)循環(huán)左移命令(CyclicShiftLeft)

單字節(jié)命令,在指令格式中,CmdBuf0 的高4 位的“0110”是命令碼,詳見表6.43。功能是以數(shù)碼管的位為單位的,循環(huán)左移n 位。

左移后右邊顯示從最左邊移出的內(nèi)容。n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:

n = (b3×8)+( b2×4)+ (b1×2)+ b0

表6.43 循環(huán)左移命令寄存器

(7)右移命令(ShiftRight)

單字節(jié)命令,在指令格式中,CmdBuf0 的高4 位的“0111”是命令碼,詳見表6.44。功能是以數(shù)碼管的位為單位的,右移n 位。

右移后左邊空出的位不顯示任何內(nèi)容,即全部LED 熄滅狀態(tài)。n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:

n = (b3×8)+( b2×4)+ (b1×2)+ b0

表6.44 右移命令寄存器

(8)循環(huán)右移命令(CyclicShiftRight)

單字節(jié)命令,在指令格式中,CmdBuf0 的高4 位的“1000”是命令碼,詳見表6.45。功能是以數(shù)碼管的位為單位的,循環(huán)右移n 位。右移后左邊顯示從最右邊移出的內(nèi)容,n 的取值范圍1~11,大于11 的值無效,n 的值由CmdBuf0 的低4 位決定,按下列公式計算:

n = (b3×8)+( b2×4)+ (b1×2)+ b0

表6.45 循環(huán)右移命令寄存器

(9)數(shù)碼管掃描位數(shù)設置指令 (Scanning)

單字節(jié)命令,在指令格式中CmdBuf0 的高4 位的“1001”是命令碼,設置數(shù)碼管掃描位數(shù)n,詳見表6.46。n 的取值為0~12,大于12 按12 位進行掃描。掃描位數(shù)n 以位選端第1位開始到位選端第n 位掃描有效。n 的值由CmdBuf0 的低四位決定,按下列公式計算。

n = (b3×8)+( b2×4)+ (b1×2)+ b0

表6.46 掃描位數(shù)設置寄存器

在使用過程中,如果不需要12 位數(shù)碼管顯示,從最高位開始裁剪,同時將數(shù)碼掃描位數(shù)設置成相應的數(shù)碼管位數(shù)。數(shù)碼管的掃描位數(shù)減少后,有用的顯示位由于分配的掃描時間更多,因而顯示亮度得以提高。

>>> 6.5.2 ZLG72128 初始化

AMetal 已經(jīng)提供了ZLG72128 的驅動函數(shù),使用其它各功能函數(shù)管理數(shù)碼管和按鍵前,必須先完成ZLG72128 的初始化。其初始化函數(shù)(am_zlg72128.h)的原型為:

該函數(shù)意在獲取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)連接的引腳號,按鍵鍵值將在引腳中斷中獲?。蝗粼撝禐镕ALSE,表明不使用中斷引腳,此時interval_ms 指定查詢鍵值的時間間隔。

一般地,只要主控器的I/O 資源不是非常緊缺,均會使用中斷引腳。若為節(jié)省一個I/O中斷資源,可將use_int_pin 設置為FALSE,此時將不占用IO 中斷資源,而系統(tǒng)將會以查詢的方式從ZLG72128 中獲取鍵值,這就會耗費一定的CPU 資源,因為每隔一段時間就要主動查詢一次鍵值。假設使用ZLG72128 的中斷引腳,主控制器使用LPC824,ZLG72128 的KEY_INT 引腳與LPC824 的PIO0_17 連接。其實例信息定義如下:

  • I2C句柄i2c_handle

若使用LPC824 的I2C1 與ZLG72128 通信,則I2C句柄可以通過LPC82x 的I2C1 實例初始化函數(shù)am_lpc82x_i2c1_inst_init()獲得。即:

獲得的I2C句柄即可直接作為i2c_handle 的實參傳遞。

  • 實例句柄

am_zlg72128_init()函數(shù)的返回值為ZLG72128 實例的句柄,該句柄將作為其它功能接口(數(shù)碼管顯示、按鍵管理等)的第一個參數(shù)(handle)的實參。

其類型am_zlg72128_handle_t(am_zlg72128.h)定義如下:

若返回值為NULL,說明初始化失??;若返回值不為NULL,說明返回一個有效的handle。

基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到對應的配置文件中,通過頭文件引出實例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單6.111 和程序清單6.112。

程序清單6.111 ZLG72128 實例初始化函數(shù)實現(xiàn)(am_hwconf_zlg72128.c)

程序清單6.112 ZLG72128 實例初始化函數(shù)聲明(am_hwconf_zlg72128.h)

后續(xù)只需要使用無參數(shù)的實例初始化函數(shù)即可獲取到ZLG72128 的實例句柄。即:

>>> 6.5.3 按鍵管理接口函數(shù)

ZLG72128 支持32 個鍵(4 行8 列矩陣鍵盤),其中,前3 行為普通鍵,同一時刻只能有一個普通鍵按下。最后一行為功能鍵,多個功能鍵可以同時按下。按鍵管理僅一個注冊按鍵回調接口函數(shù)。

為了在檢測到按鍵事件(有鍵按下)時,及時將按鍵事件通知用戶,需要用戶注冊一個回調函數(shù),當有按鍵事件發(fā)生時,將自動調用用戶注冊的回調函數(shù)。其函數(shù)原型為:

其中,pfn_key_cb 為注冊的按鍵回調函數(shù),p_arg 為回調函數(shù)的第一個參數(shù)的值,即當檢測到按鍵事件自動調用回調函數(shù)時,將p_arg 的值作為回調函數(shù)的第一個參數(shù)的值。

回調函數(shù)的類型am_zlg72128_key_cb_t(am_zlg72128.h)定義如下:

由此可見,回調函數(shù)有4 個參數(shù),用戶可以通過這些參數(shù)獲取按鍵相關的信息。特別地,第一個參數(shù)p_arg 為用戶自定義的參數(shù),其值即為注冊回調函數(shù)時p_arg 參數(shù)設置的值。

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。

  • 普通鍵一直按下(處于連擊狀態(tài))

普通鍵按下保持時間超過2s 后進入連擊狀態(tài),處于連擊狀態(tài)時,每隔200ms 左右會產(chǎn)生一個按鍵事件,并使用一個連擊計數(shù)器對產(chǎn)生的按鍵事件計數(shù),每產(chǎn)生一個按鍵事件連擊計數(shù)器的值加1,由于連擊計數(shù)器的位寬為8 位,因此,當值達到255 后不再加1,但同樣還會繼續(xù)產(chǎn)生按鍵事件,直到鍵釋放,連擊計數(shù)器清0。處于連擊狀態(tài)時,key_val 表示按下鍵的鍵值,repeat_cnt 表示連擊計數(shù)器的值。

  • 功能鍵狀態(tài)發(fā)生變化(功能鍵按下或釋放都會造成狀態(tài)改變)

funkey_val 的值表示所有功能鍵的狀態(tài)。最后一行最多8 個鍵,從左至右分別為F0 ~ F7,與funkey_val 的bit0 ~ bit7 一一對應,位值為0 表示對應功能鍵按下,位值為1 表示對應功能鍵未按下。當無任何功能鍵按下時,funkey_val 的值為0xFF。只要funkey_val 的值發(fā)生改變,就會產(chǎn)生一個按鍵事件,功能鍵不提供連擊功能??梢允褂胊m_zlg72128.h 中的宏

AM_ZLG72128_FUNKEY_CHECK(funkey_val, funkey_num)來簡單判斷某一功能鍵是否按下。funkey_num 用于表示需要檢測的功能鍵, 值已經(jīng)定義為宏, F0 ~ F7 分別為AM_ZLG72128_FUNKEY_0 ~ AM_ZLG72128_FUNKEY_7。若對應鍵按下,則宏值為TURE;反之,則宏值FALSE。例如,通過funkey_val 判斷F0 是否按下可以使用如下語句:

功能鍵類似PC 機上的Ctrl、Alt、Shift 等按鍵,使用普通鍵和功能鍵很容易實現(xiàn)組合鍵應用,注冊按鍵回調函數(shù)的范例程序詳見程序清單6.113。

程序清單6.113 ZLG72128 注冊按鍵回調函數(shù)使用范例

若只按下第一行第一個鍵,則LED0 狀態(tài)翻轉,若按下第一行第一個鍵的同時,也按下了功能鍵F0,則LED1 狀態(tài)翻轉,該示例簡單的展示了組合鍵的使用方法。

>>> 6.5.4 數(shù)碼管顯示接口函數(shù)

ZLG72128 支持12 位共陰式數(shù)碼管,以及閃爍、位移等功能,雖然接口函數(shù)種類繁多,但各個接口函數(shù)的功能較為簡單,下面將一一介紹各個接口函數(shù)的使用方法。

1. 閃爍持續(xù)時間

當數(shù)碼管閃爍時,設置其點亮和熄滅持續(xù)時間的函數(shù)原型為:

上電時,數(shù)碼管點亮和熄滅的持續(xù)時間默認值為500ms。on_ms 和off_ms 有效的時間值為150、200、250、……、800、850、900,即150ms ~ 900ms,且時間間隔為50ms。若時間間隔不是這些值,應該選擇一個最接近的值。比如,設置數(shù)碼管以最快的頻率閃爍,即亮、滅時間最短為150ms,其使用方法如下:

注:僅設置閃爍時間還不能立即看到閃爍現(xiàn)象,必須打開某位的閃爍開關后才能看到閃爍現(xiàn)象,詳見am_zlg72128_digitron_flash_ctrl()函數(shù)介紹。

2. 閃爍控制

控制數(shù)碼管是否閃爍的函數(shù)原型為:

其中,ctrl_val 為控制值,bit0 ~ bit11 為有效位,分別對應數(shù)碼管0 ~ 11,位值為0 時不閃爍,位值為1 時閃爍。上電默認值為0x0000,即所有數(shù)碼管均不閃爍。比如,控制所有數(shù)碼管閃爍,其使用方法如下:

注:由于初始時可能數(shù)碼管未顯示任何內(nèi)容,這段代碼可能看不到閃爍現(xiàn)象,因此可以在設置前,使用后續(xù)相關API 使數(shù)碼管顯示一些實際有效的內(nèi)容。

3. 顯示屬性(開或關)

顯示屬性是指控制哪些數(shù)碼管顯示,哪些數(shù)碼管不顯示。在默認情況下,所有數(shù)碼管均處于打開顯示狀態(tài),掃描12 位數(shù)碼管。而實際上,可能需要顯示的位數(shù)并不足12 位,此時可以使用該函數(shù)關閉某些位的顯示。其函數(shù)原型為:

其中,ctrl_val 為控制值,bit0 ~ bit11 為有效位,分別對應數(shù)碼管0 ~ 11,位值為0 時打開顯示,位值為1 時關閉顯示。上電的默認值為0x0000,即所有位均正常顯示。比如,只使用了數(shù)碼管0 ~ 7,基于此,可以關閉數(shù)碼管8 ~ 11,其使用方法如下:

注:使用該函數(shù)控制顯示屬性時,對應數(shù)碼管的段碼內(nèi)容并不會改變。

4. 顯示字符

在指定位置顯示字符,ZLG72128 已經(jīng)提供了0 ~ 9 這10 個數(shù)字和常見的21 種字母的自動譯碼顯示,無需應用再自行譯碼。其函數(shù)原型為:

顯示的字符必須是ZLG72128 已經(jīng)支持的可以自動完成譯碼的字符,包括字符'0'~'9'與AbCdEFGHiJLopqrtUychT(區(qū)分大小寫)。注意,若要顯示數(shù)字1,則ch 參數(shù)應為字符'1',而不是數(shù)字1。

若指定的字符不支持,則返回-AM_ENOTSUP。只要成功顯示,則返回AM_OK。若需要顯示一些自定義的圖形,使用 am_zlg72128_digitron_dispbuf_set() 直接設置顯示的段碼。

比如,在數(shù)碼管0 顯示字符F,不顯示小數(shù)點,不閃爍,其使用方法如下:

5. 顯示字符串

指定字符串顯示的起始位置,開始顯示一個字符串。其函數(shù)原型為:

字符串顯示遇到字符結束標志'\0'將自動結束,或當超過有效的字符顯示區(qū)域時,也會自動結束。顯示的字符應確保是ZLG72128 能夠自動完成譯碼的,包括字符'0'~'9'與AbCdEFGHiJLopqrtUychT(區(qū)分大小寫)。如遇到有不支持的字符,對應位置將不顯示任何內(nèi)容。比如,從數(shù)碼管0 開始,顯示字符串“0123456789”,其使用方法如下:

6. 顯示0~9 的數(shù)字

在指定位置顯示0~9 的數(shù)字,其函數(shù)原型為:

該函數(shù)僅用于顯示一個0~9 的數(shù)字,若數(shù)字大于9,應自行根據(jù)需要分別顯示各個位。

注意,num 參數(shù)為數(shù)字0~9,不是字符'0'~'9'。比如,在數(shù)碼管0 顯示數(shù)字8,不顯示小數(shù)點,不閃爍。其使用方法如下:

7. 直接設置數(shù)碼管顯示段碼

該函數(shù)用于設置各個數(shù)碼管顯示的段碼,當需要顯示一些不能自動譯碼顯示的圖形或字符時,可以使用該函數(shù)靈活的顯示各種各樣的圖形。其函數(shù)原型為:

該函數(shù)一次可以設置多個連續(xù)數(shù)碼管顯示的緩沖區(qū)內(nèi)容,起始顯示位置由start_pos 指定,有效值為0 ~ 11,連續(xù)顯示數(shù)碼管的個數(shù)由參數(shù)num 指定。該函數(shù)將依次設置start_pos~ (start_pos + num -1)的各個數(shù)碼管的顯示內(nèi)容。

段碼為8 位,bit0~bit7 分別對應段a ~ dp。位值為1 時,對應段點亮,位值為0 時,對應段熄滅。如顯示數(shù)字1,則需要點亮段b 和段c,這就需要bit1 和bit2 為1,因此段碼為00000110,即0x06。其它顯示圖形可以以此類推。比如,在數(shù)碼管0 ~ 9 顯示數(shù)字0~9,可以使用該函數(shù)直接設置各個數(shù)碼管顯示的段碼,使用方法如下:

8. 直接控制段的點亮或熄滅

雖然已經(jīng)提供了直接設置顯示段碼的函數(shù),但為了更加靈活的顯示一個圖形,或控制圖形的變換。ZLG72128 支持直接控制某個段的亮滅。其函數(shù)原型為:

pos 用于指定數(shù)碼管的位置,有效值為0~11。seg 表明要控制的段,有效值為0~7,分別對應a ~ dp。各個段已經(jīng)在am_zlg72128.h 文件中使用宏的形式定義好了。建議不要直接使用立即數(shù)0~7,而應使用與a ~ dp 相對應的宏AM_ZLG72128_DIGITRON_SEG_A ~AM_ZLG72128_DIGITRON_SEG_DP。比如,在當前顯示的基礎上,需要在數(shù)碼管0 顯示出小數(shù)點,其它內(nèi)容不變,此時就可以直接使用該函數(shù)控制點亮數(shù)碼管0 的dp 段,其使用方法如下:

注:一次只能控制一個段。

9. 顯示移位控制

ZLG72128 支持移位控制,可以使所有數(shù)碼管根據(jù)命令進行移位。共支持4 種移位方式,左移、循環(huán)左移、右移和循環(huán)右移。其函數(shù)原型為:

dir 指定移位方向,表示方向的宏值已經(jīng)在am_zlg72128.h 文件中使用宏的形式定義好了,應直接使用宏值作為dir 參數(shù)的值,左移為AM_ZLG72128_DIGITRON_SHIFT_LEFT,右移為AM_ZLG72128_DIGITRON_SHIFT_RIGHT。

is_cyclic 為TRUE 時表明是循環(huán)移位,否則不是循環(huán)移位。如果不是循環(huán)移位,則移位后,右邊空出的位(左移)或左邊空出的位(右移)將不顯示任何內(nèi)容。若是循環(huán)移動,則空出的位將會顯示被移除位的內(nèi)容。num 指定移動的位數(shù),一次可以移動 0 ~ 11 位。大于11 的值將視為無效值。比如,要將當前數(shù)碼管顯示循環(huán)左移一位,其使用方法如下:

實際中,可能會發(fā)現(xiàn)移位方向與傳入的命令恰恰相反,這是由于硬件設計的不同造成的。常見的,可能有以下兩種硬件設計方式:

  • 最右邊為數(shù)碼管0,從左至右為:11、10、9、8、7、6、5、4、3、2、1、0

  • 最左邊為數(shù)碼管0,從左至右為:0、1、2、3、4、5、6、7、8、9、10、11

這主要取決于硬件設計時 COM0 ~ COM11 引腳所對應數(shù)碼管所處的物理位置。此處左移和右移的概念是以ZLG72128 典型應用電路為參考的,其COM0 對應的是最右邊的數(shù)碼管,即最右邊為數(shù)碼管0。那么左移和右移的概念分別為:

左移:數(shù)碼管0(最右側數(shù)碼管)顯示切換到1,數(shù)碼管1 顯示切換到2,……,數(shù)碼管10 顯示切換到11。

右移:數(shù)碼管11(最左側數(shù)碼管)顯示切換到10,數(shù)碼管1 顯示切換到2,……,數(shù)碼管10 顯示切換到11。

若硬件電路設計數(shù)碼管位置是相反的(如COM0 對應的是最左邊的數(shù)碼管),則移位效果恰恰是相反的,此處只需要稍微注意即可。

10. 復位顯示

復位顯示將數(shù)碼管顯示的內(nèi)容清空,即所有數(shù)碼管不顯示任何內(nèi)容。其函數(shù)原型為:

11. 測試命令

測試命令主要用于測試數(shù)碼管的硬件電路是否連接正常。其函數(shù)原型為:

執(zhí)行測試命令后,數(shù)碼管段顯示“8.8.8.8.8.8.8.8.8.8.8.8.”,并以0.5s 的速率閃爍。

12. 數(shù)碼管顯示測試

為了判斷數(shù)碼管是否工作正常,實現(xiàn)一個簡單的數(shù)碼管顯示測試:系統(tǒng)啟動時,數(shù)碼管進入測試狀態(tài),數(shù)碼管所有段全部點亮,即顯示“8.8.8.8.8.8.8.8.8.8.8.8.”,并以0.5s 的速率閃爍。歷時3 秒后,清空顯示內(nèi)容。

由于ZLG72128 自帶數(shù)碼管測試命令,所以該項功能很容易實現(xiàn),直接調用測試命令接口,延時3s 后,復位數(shù)碼管顯示即可。范例程序詳見程序清單6.114。

程序清單6.114 數(shù)碼管顯示測試范例程序

13. 單個普通鍵測試

為了測試各個普通鍵是否工作正常,實現(xiàn)一個簡單的按鍵測試:按下任何一個普通鍵,數(shù)碼管顯示當前鍵的鍵值(1~24)。

對于普通鍵,當鍵按下時,可以通過按鍵回調函數(shù)直接獲取到鍵值(1~24),獲取到鍵值后,使用數(shù)碼管顯示接口將該值顯示出來即可。范例程序詳見程序清單6.115。

程序清單6.115 普通按鍵測試范例程序

14. 組合鍵使用

ZLG72128 有8 個功能鍵,功能鍵如同電腦鍵盤的Ctrl、Shift 和Alt 鍵,與其它普通按鍵組合可以實現(xiàn)豐富的功能,如Ctrl+S(保存),Ctrl+A(全選),Ctrl+Z(撤銷)等。

這里,以功能鍵F0 為例,展示其如何與普通按鍵組合使用。為方便觀察,定義下列操作及對應的現(xiàn)象:

  • F0 + K1:數(shù)碼管顯示循環(huán)左移;

  • F0 + K2:數(shù)碼管顯示循環(huán)右移;

  • F0 + K3:所有閃爍顯示打開/關閉。

各種組合鍵對應的功能都有相應的API,相應的范例程序詳見程序清單6.116。

程序清單6.116 組合鍵使用范例程序

至此,各個功能的處理函數(shù)都編寫好了。但對于按鍵事件的處理,還有關鍵的一步就是獲取到鍵值。通過上述對ZLG72128 接口函數(shù)的介紹可知,如需獲取鍵值,只需要注冊按鍵回調函數(shù),然后在回調函數(shù)中即可通過傳遞給回調函數(shù)的參數(shù)獲得鍵值。

按照常規(guī)思維,獲取鍵值后,可能直接在回調函數(shù)中調用相關處理函數(shù)對按鍵作相應處理,但這是非常不妥的。這是因為,回調函數(shù)一般都是在中斷環(huán)境中執(zhí)行的,如果回調函數(shù)的處理占用了很長的時間,將嚴重影響整個系統(tǒng)的實時性。應該保證回調函數(shù)的處理盡可能快的結束。基于此,在按鍵回調函數(shù)中僅完成鍵值的保存,實際的處理在am_main()函數(shù)主循環(huán)中完成。因此回調函數(shù)的處理就非常簡單了,只需要保存下鍵值,并設置一個標志供am_main()主循環(huán)查詢即可。范例程序詳見程序清單6.117。

程序清單6.117 回調函數(shù)處理范例程序

這里定義了一個按鍵事件信息結構體變量,將按鍵回調函數(shù)中的相關信息全部存放在該結構體中。當key_event 的值為TRUE 時,說明有按鍵事件,范例程序詳見程序清單6.118。

程序清單6.118 綜合示例程序

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5271

    瀏覽量

    119647
  • 數(shù)碼管
    +關注

    關注

    32

    文章

    1872

    瀏覽量

    90727
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37523
  • zlg72128
    +關注

    關注

    1

    文章

    3

    瀏覽量

    3434

原文標題:周立功:重用外設驅動代碼——鍵盤與數(shù)碼管接口

文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鍵盤掃描和數(shù)碼管顯示源程序和電路

    鍵盤掃描和數(shù)碼管顯示源程序和電路圖 在RB口上擴充一個矩陣式鍵盤,一共4×4個按鍵,剛好4條行線、4條列線占用RB口的全部8個接口;而在R
    發(fā)表于 01-11 23:19 ?2578次閱讀
    <b class='flag-5'>鍵盤</b>掃描和<b class='flag-5'>數(shù)碼管</b>顯示源程序和<b class='flag-5'>電路</b>圖

    全面剖析數(shù)碼管與矩陣鍵盤聯(lián)合使用法則

    本文內(nèi)容為7.7 數(shù)碼管與矩陣鍵盤聯(lián)合使用、7.8 ZLG72128——數(shù)碼管鍵盤管理、7.9 溫控。
    的頭像 發(fā)表于 11-21 07:47 ?1.1w次閱讀
    全面剖析<b class='flag-5'>數(shù)碼管</b>與矩陣<b class='flag-5'>鍵盤</b>聯(lián)合使用法則

    數(shù)碼管與矩陣鍵盤聯(lián)合應用設計

    AMetal 提供了數(shù)碼管和矩陣鍵盤聯(lián)合使用的驅動,其本質上就是數(shù)碼管驅動和矩陣鍵盤驅動的簡單整合,避免了在多個實例信息中提供一些相同的信息,如數(shù)碼
    的頭像 發(fā)表于 01-19 09:31 ?7816次閱讀
    <b class='flag-5'>數(shù)碼管</b>與矩陣<b class='flag-5'>鍵盤</b>聯(lián)合應用設計

    使用到的鍵盤數(shù)碼管

    1.今日使用到的鍵盤數(shù)碼管和期望達到的控制目標:用到的鍵盤數(shù)目為3個,key1(與單片機P3.0口相接)、key2(與單片機P3.0口相接)、key3(與單片機P3.0口相接)。數(shù)碼管
    發(fā)表于 11-22 08:13

    掌握通過并行接口芯片對鍵盤進行掃描并在多位數(shù)碼管顯示數(shù)字的方法

    實驗九、鍵盤掃描及數(shù)碼管顯示實驗1、實驗目的學習了解鍵盤掃描的基本原理。掌握通過并行接口芯片對鍵盤進行掃描并在多位
    發(fā)表于 01-13 08:22

    TM1638按鍵數(shù)碼管模塊說明

    文章目錄一、TM1638按鍵數(shù)碼管模塊說明1.TM1638概述和特性2.驅動模塊電路圖3.TM1638管腳功能說明4.驅動模塊寄存器地址和顯示模式5.指令發(fā)送說明5.1數(shù)據(jù)命令設置5.2地址命令設置
    發(fā)表于 01-25 08:10

    數(shù)碼管驅動及鍵盤控制芯片--CH452

    數(shù)碼管驅動及鍵盤控制芯片CH452:CH452是數(shù)碼管顯示驅動和鍵盤掃描控制芯片。CH452 內(nèi)置時鐘振蕩電路,可以動態(tài)驅動8 位
    發(fā)表于 01-07 12:23 ?61次下載

    數(shù)碼管顯示矩陣鍵盤掃描程序

    數(shù)碼管顯示矩陣鍵盤掃描程序 ?/*矩陣鍵盤掃描出鍵值,在數(shù)碼管上顯示出來?????? P0口接數(shù)碼管的段選碼,P2口通過反相
    發(fā)表于 01-11 19:14 ?2246次閱讀

    數(shù)碼管顯示矩陣鍵盤掃描值

    數(shù)碼管顯示矩陣鍵盤掃描值 ?/*矩陣鍵盤掃描出鍵值,在數(shù)碼管上顯示出來?????? P0口接數(shù)碼管的段選碼,P2口通過反相
    發(fā)表于 01-14 21:01 ?2706次閱讀

    LED數(shù)碼管顯示分類及其典型用電路

    本文主要講述了LED數(shù)碼管的顯示分類及其特點、LED數(shù)碼管典型用電路。 一.LED數(shù)碼管顯示分類 LED
    發(fā)表于 07-31 11:09 ?1.1w次閱讀
    LED<b class='flag-5'>數(shù)碼管</b>顯示分類及其<b class='flag-5'>典型</b>應<b class='flag-5'>用電路</b>

    單片機的鍵盤及LED數(shù)碼管顯示接口

    本文主要介紹了單片機的應用--矩陣鍵盤和LED數(shù)碼管顯示接口。
    發(fā)表于 03-25 11:38 ?7次下載

    74ls164驅動4位數(shù)碼管_74ls164驅動數(shù)碼管電路

    74LS164是一個串行輸入并行輸出的移位寄存器,可用于擴展并行輸出口。74LS165是8位并行輸入串行輸出移位寄存器,可以擴展一個或多個8位并行I/O口。本文主要介紹了74ls164驅動數(shù)碼管
    發(fā)表于 01-27 11:48 ?2w次閱讀
    74ls164驅動4位<b class='flag-5'>數(shù)碼管</b>_74ls164驅動<b class='flag-5'>數(shù)碼管</b><b class='flag-5'>電路</b>

    典型的按摩數(shù)碼管顯示電路

    下圖所示為一種典型的按摩數(shù)碼管顯示電路。該電路的控制核心是微處理EM78156,它接收操作
    的頭像 發(fā)表于 12-22 10:31 ?4082次閱讀
    <b class='flag-5'>典型</b>的按摩<b class='flag-5'>器</b><b class='flag-5'>數(shù)碼管</b>顯示<b class='flag-5'>電路</b>

    數(shù)碼管顯示常用外圍設備接口電路

    數(shù)碼管顯示常用外圍設備接口電路免費下載。
    發(fā)表于 06-04 14:33 ?10次下載

    16位數(shù)碼管驅動及鍵盤控制芯片CH453技術手冊

    CH453 是 16 位數(shù)碼管顯示驅動和鍵盤掃描控制芯片。CH453 內(nèi)置時鐘振蕩電路,可以動態(tài)驅動 16 位數(shù)碼管或者 128 只 LED 發(fā)光
    發(fā)表于 09-09 11:30 ?2次下載
    16位<b class='flag-5'>數(shù)碼管</b>驅動及<b class='flag-5'>鍵盤</b>控制芯片CH453技術手冊