1、概述
CH455 是數碼管顯示驅動和鍵盤掃描控制芯片。CH455內置時鐘振盪電路,可以動態驅動4 位數
碼管或者32 只LED;同時還可以進行28 鍵的鍵盤掃描;CH455 通過SCL 和SDA 組成的2 線串行接口
與單片機等交換數據。
2、鍵盤掃描
下表是在DIG3~DIG0 與SEG6~SEG0 之間7×4 矩陣的按鍵編址,也是數碼管段位和發光管LED
陣列的順序編址。由於按鍵代碼是8 位,鍵按下時位6 總是1,所以當鍵按下時,CH455 所提供的實
際按鍵代碼是表中的按鍵編址加上40H,也就是說,此時的按鍵代碼應該在44H 到7FH 之間。
在編程時,可以使判斷讀取的數值第六位是否爲1判斷是否有按鍵按下以及按鍵是否鬆開。
3、LED 燈驅動
CH455 內部具有4個8位的數據寄存器,用於保存4個字數據,分別對應於CH455 所驅動的4個
數碼管或者4 組每組8個的發光二極管。數據寄存器中字數據的位7~位0 分別對應各個數碼管的小
數點和段G~段A,對於發光二極管陣列,則每個字數據的數據位唯一地對應一個發光二級管。當數
據位爲1 時,對應的數碼管的段或者發光管就會點亮;當數據位爲0 時,則對應的數碼管的段或者發
光管就會熄滅。
4、串行通信接口
CH455 具有硬件實現的2線串行接口,包含2個主要信號線:串行數據時鐘輸入線SCL、串行數
據輸入和輸出線SDA;以及1個輔助信號線:中斷輸出線INT#。其中,SCL 是帶上拉的輸入信號線,默認是高電平;SDA是帶上拉的準雙向信號線,默認是高電平;INT#是帶上拉的開漏輸出,在啓用鍵
盤掃描功能後作爲鍵盤中斷輸出線,默認是高電平。
SDA 用於串行數據輸入和輸出,高電平表示位數據1,低電平表示位數據0,串行數據輸入的順
序是高位在前,低位在後。
SCL 用於提供串行時鐘,CH455 在其上升沿從SDA 輸入數據,在其下降沿從SDA 輸出數據。
在SCL 爲高電平期間發生的SDA 下降沿定義爲串行接口的啓動信號,在SCL 爲高電平期間發生
的SDA 上升沿定義爲串行接口的停止信號。CH455只在檢測到啓動信號後才接收並分析命令。所以在
單片機I/O引腳資源緊張時,可以在保持SDA 引腳狀態不變的情況下,將SCL引腳與其它接口電路共
用;如果能夠確保SDA引腳的變化僅在SCL引腳爲低電平期間發生,那麼SCL引腳和SDA 引腳都可以
與其它接口電路共用。
INT#用於鍵盤中斷輸出,默認是高電平。當CH455 檢測到有效按鍵時,INT#輸出低電平有效的
鍵盤中斷;單片機被中斷後,對CH455執行讀操作,CH455將INT#恢復爲高電平,並從SDA 輸出按鍵
代碼,單片機從SDA 獲得一個字節的數據,即按鍵代碼。
單片機與CH455 的通訊過程總是分爲6 個步驟,按單片機的操作方向分成兩種類型,一種是寫
操作,用於輸出數據,一種是讀操作,用於輸入數據。具體過程可以參考例子程序中的說明。
寫操作包括以下6 個步驟:輸出啓動信號、輸出字節1、應答1、輸出字節2、應答2、輸出停
止信號。其中,啓動信號和停止信號如上所述,應答1 和應答2 總是固定爲1,輸出字節1和輸出字
節2 各自包含8個數據位,即一個字節數據。
讀操作包括以下6 個步驟:輸出啓動信號、輸出字節1、應答1、輸入字節2、應答2、輸出停
止信號。其中,啓動信號和停止信號如上所述,應答1 和應答2 總是固定爲1,輸出字節1和輸入字
節2 各自包含8個數據位,即一個字節數據。
下圖是一個寫操作的實例,字節1爲01001000B,即48H;字節2 爲00000001B,即01H
5、編程例程
主要是兩個函數:
/*********************************************************************
函數名: CH455_Read
功能: 讀取CH455一個字節數據數據(按鍵碼值)
輸入:
輸出:
返回:
*********************************************************************/
unsigned char CH455_Read(void)
{
unsigned char keycode;
CH455_I2C_Start(); //啓動總線
CH455_I2C_WriteByte(0x4F);
keycode = CH455_I2C_ReadByte(); //讀取數據
CH455_I2C_Stop(); //結束總線
return keycode;
}
/*********************************************************************
函數名: CH455_Write
功能: 向CH455寄存器寫入命令值
輸入: 寫入命令值
輸出:
返回:
*********************************************************************/
unsigned char CH455_Write(unsigned short cmd)
{
CH455_I2C_Start(); //啓動總線
CH455_I2C_WriteByte(((unsigned char)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
CH455_I2C_WriteByte((unsigned char)cmd); //發送數據
CH455_I2C_Stop(); //結束總線
return 0;
}
點亮LED燈
CH455_Write(CH455_DIG0 | 0x01);
CH455_Write(CH455_DIG1 | 0x02);
CH455_Write(CH455_DIG0 | 0x04);
CH455_Write(CH455_DIG1 | 0x08);
/* */
獲取按鍵碼值
void Keyboard_proc(void)
{
unsigned char keyID;
keyID = CH455_Read();
if(0xFF == keyID)
{
/* 無按鍵按下 */
return;
}
else if(keyID & 0x40)
{
/* 有按鍵按下,記錄下按鍵鍵值 */
keyID &= ~0x40;
gu8KeyID = keyID;
}
else
{
/* 按鍵鬆開,處理鍵值 */
if(keyID == gu8KeyID)
{
/* 處理函數 */
gu8KeyID = 0xFF;
}
else
{
gu8KeyID = 0xFF;
}
}
return;
}
// 加載字數據命令
#define CH455_DIG0 0x1400 // 數碼管位0顯示,需另加8位數據
#define CH455_DIG1 0x1500 // 數碼管位1顯示,需另加8位數據
#define CH455_DIG2 0x1600 // 數碼管位2顯示,需另加8位數據
#define CH455_DIG3 0x1700 // 數碼管位3顯示,需另加8位數據
// 讀取按鍵代碼命令
#define CH455_GET_KEY 0x0700 // 獲取按鍵,返回按鍵代碼
/*CH455接口定義*/
#define CH455_I2C_ADDR 0x40 // CH455的地址
#define CH455_I2C_MASK 0x3E // CH455的高字節命令掩碼
#define CH455_BIT_ENABLE 0x01 // 開啓/關閉位
#define CH455_BIT_SLEEP 0x04 // 睡眠控制位
#define CH455_BIT_7SEG 0x08 // 7段控制位
#define CH455_BIT_INTENS1 0x10 // 1級亮度
#define CH455_BIT_INTENS2 0x20 // 2級亮度
#define CH455_BIT_INTENS3 0x30 // 3級亮度
#define CH455_BIT_INTENS4 0x40 // 4級亮度
#define CH455_BIT_INTENS5 0x50 // 5級亮度
#define CH455_BIT_INTENS6 0x60 // 6級亮度
#define CH455_BIT_INTENS7 0x70 // 7級亮度
#define CH455_BIT_INTENS8 0x00 // 8級亮度
#define CH455_SYSOFF ( 0x0400) // 關閉顯示、關閉鍵盤
#define CH455_SYSON ( CH455_SYSOFF | CH455_BIT_ENABLE ) // 開啓顯示、鍵盤
#define CH455_SLEEPOFF ( CH455_SYSOFF) // 關閉睡眠
#define CH455_SLEEPON ( CH455_SYSOFF | CH455_BIT_SLEEP ) // 開啓睡眠
#define CH455_7SEG_ON ( CH455_SYSON | CH455_BIT_7SEG ) // 開啓七段模式
#define CH455_8SEG_ON ( CH455_SYSON | 0x00 ) // 開啓八段模式
#define CH455_SYSON_4 ( CH455_SYSON | CH455_BIT_INTENS4 ) // 開啓顯示、鍵盤、4級亮度
#define CH455_SYSON_8 ( CH455_SYSON | CH455_BIT_INTENS8 ) // 開啓顯示、鍵盤、8級亮度