數碼管驅動及鍵盤控制芯片 CH455 STM32F407使用

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級亮度   
    
    

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章