STM32與CH455g通信測試(僅鍵盤)


1、概述

  CH455是數碼管顯示驅動和鍵盤掃描控制芯片。CH455內置時鍾振盪電路,可以動態驅動4位數碼管或者32LED;同時還可以進行28鍵的鍵盤掃描;CH455通過SCLSDA組成的2線串行接口與單片機等交換數據。

2、特點

內置顯示電流驅動級,段電流不小於25mA,字電流不小於160mA

動態顯示掃描控制,支持8×4或者7×4,直接驅動4位數碼管或者32只發光管LED

內部限流,通過占空比設定提供8級亮度控制。

內置28鍵鍵盤控制器,基於7×4矩陣鍵盤掃描。

內置輸入下拉,內置去抖動電路。

提供平有效的鍵盤中,提供釋放標志位,可供查詢按按下釋放

高速2線串行接口,時鍾04MHz兼容兩I2C線,節約引腳

內置位,支持2.7V5V

支持低功耗睡眠節約,可以被按喚醒或者被命令操作喚醒

內置時鍾振盪電路,不需要外部提供時鍾或者接振盪更抗干擾

3、引腳介紹

VCC:,持電流不小於150mA

GND:公共,持電流不小於150mA

SEG0 SEG6:輸出輸入數碼管的段驅動,平有效鍵盤掃描輸入平有效,內置下拉

SEG7:輸出數碼管的小數點段驅動輸出平有效7式下的鍵盤中斷輸出平有效

DIG0 DIG3:輸出數碼管的字驅動,平有效鍵盤掃描輸出平有效

SDA:內置上拉開漏輸出輸入2線串行接口的數據輸入輸出內置上拉SCL:輸入2線串行接口的數據時鍾,內置上拉

4、鍵盤掃描功能

  鍵盤掃描CH455的鍵盤掃描功能支持7×4矩陣的28鍵鍵盤。在鍵盤掃描期間,DIG3~DIG0引腳用於列掃描輸出,SEG6~SEG0引腳都帶有內部下拉電阻,用於行掃描輸入。CH455定期在顯示驅動掃描過程中插入鍵盤掃描。在鍵盤掃描期間,DIG3~DIG0引腳按照DIG0至DIG3的順序依次輸出高電平,其余引腳輸出低電平;SEG6~SEG0引腳的輸出被禁止,當沒有鍵被按下時,SEG6~SEG0都被下拉為低電平;當有鍵被按下時,例如連接DIG1與SEG4的鍵被按下,則當DIG1輸出高電平時SEG4檢測到高電平;為了防止因為按鍵抖動或者外界干擾而產生誤碼,CH455實行兩次掃描,只有當兩次鍵盤掃描的結果相同時,按鍵才會被確認有效。如果CH455檢測到有效的按鍵,則記錄下該按鍵代碼,並通過INT#引腳產生低電平有效的鍵盤中斷,此時單片機可以通過串行接口讀取按鍵代碼;在沒有檢測到新的有效按鍵之前,CH455不再產生任何鍵盤中斷。CH455支持SEG1和SEG0針對同一DIG的組合鍵,組合鍵是最優先的,除此之外,如果多個鍵同時按下,那么按鍵代碼較小的按鍵優先。例如連接DIG1與SEG1及連接DIG1與SEG0的兩個鍵,可作為組合鍵。CH455所提供的按鍵代碼為8位,位7始終為0,位2始終為1,位1~位0是列掃描碼,位5~位3是行掃描碼,位6是狀態碼(鍵按下為1,鍵釋放為0)。例如,連接DIG1與SEG4的鍵被按下,則按鍵代碼是01100101B或者65H,鍵被釋放后,按鍵代碼通常是00100101B或者25H(也可能是其它值,但是肯定小於40H),其中,對應DIG1的列掃描碼為01B,對應SEG4的行掃描碼為100B。單片機可以在任何時候讀取按鍵代碼,但一般在CH455檢測到有效按鍵而產生鍵盤中斷時讀取按鍵代碼,此時按鍵代碼的位6總是1,另外,如果需要了解按鍵何時釋放,單片機可以通過查詢方式定期讀取按鍵代碼,直到按鍵代碼的位6為0。下表是在DIG3~DIG0與SEG6~SEG0之間7×4矩陣的按鍵編址,也是數碼管段位和發光管LED陣列的順序編址。由於按鍵代碼是8位,鍵按下時位6總是1,所以當鍵按下時,CH455所提供的實際按鍵代碼是表中的按鍵編址加上40H,也就是說,此時的按鍵代碼應該在44H到7FH之間。

編址 DIG3 DIG2 DIG1 DIG0
SEG0 07H 06H 05H 04H
SEG1 0FH 0EH 0DH 0CH
SEG2 17H 16H 15H 14H
SEG3 1FH 1EH 1DH 1CH
SEG4 27H 26H 25H 24H
SEG5 2FH 2EH 2DH 2CH
SEG6 37H 36H 35H 34H
SEG0+SEG1 3FH 3EH 3DH 3CH

 

 

 

 

 

 

 

 

 

 

 

5、串行接口

  CH455實現2線串行接口,包含2線:串行數據時鍾輸入SCL、串行數輸入輸出SDA;以及1輔助信線:中斷輸出INT#中,SCL上拉輸入線,CH455中文手冊默認SDA上拉准雙向信線,默認INT#上拉開漏輸出在啟用盤掃描功能鍵盤中斷輸出線,默認SDA於串行數據輸入輸出示位數據1示位數據0,串行數據輸入SCL於提供串行時鍾,CH455在其升沿SDA輸入數據,在其沿SDA輸出數據。SCLSDA沿串行接口的SCLSDA升沿串行接口的停止信CH455檢測后才收並命令單片機I/O引腳緊張時,可以在保SDA引腳狀態不情況SCL引腳其它接口電路如果夠確SDA引腳變化僅SCL引腳那么SCL引腳SDA引腳可以其它接口電路INT#於鍵盤中斷輸出默認CH455檢測到有效按鍵時,INT#輸出低平有效鍵盤中;單片機CH455操作CH455INT#SDA輸出按碼,單片機SDA獲得的數據,碼。單片機與CH455的通6單片機的操作方向兩種類型操作輸出數據,操作輸入數據。可以中的說明操作6輸出輸出11輸出22輸出止信中,停止信述,121輸出1輸出2包含8數據位,數據。操作6輸出輸出11輸入22輸出止信中,停止信述,121輸出1輸入2包含8數據位,數據。

6操作命令

  CH455操作命令分3組。命令停止信12同,別在輸出1和字2的數據不同以及字2方向不同。

字數據命令:命令輸出168H6AH6CH或者6EH別對應DIG0DIG3引腳驅動的4數碼管;輸出2[DIG_DATA]B00H0FFH,是8位的字數據。字數據命令字數據DIG_DATA1的數據寄存器中。例如命令數據01101100B6CH對應DIG201111001B字數據79H1數據寄存器,使DIG2引腳驅動的數碼管顯示E

讀取命令:命令輸出101001111B4FH輸入2碼。讀取命令獲得CH455檢測有效按鍵的碼。命令操作,是數據返回命令,單片機必須釋放SDA引腳輸出禁止或者上拉到高CH455SDA引腳輸出按碼,碼的有效數據是位70中位6態碼,位50是掃描碼和編址

7、接口時序

  

TSSTA/THSTA/TSSTO/THSTO/TCLOW/TCHIG:最小時間100ns

TSD:最小時間30ns

THD:最小時間10ns

TAA/TDH:最小時間2ns

Rate:最大速率4Mbps

8、原理圖接線

9、程序設計

   由於這次只是做個簡單的按鍵檢測,所以只用到鍵盤掃描功能,數碼管有需要再做吧。先定義一下系統參數:

// 設置系統參數命令
#define CH455_SCL_SET         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET)
#define CH455_SCL_CLR         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET)
#define CH455_SCL_D_OUT        {}  // 設置SCL為輸出方向,對於雙向I/O需切換為輸出

#define CH455_SDA_SET         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET)
#define CH455_SDA_CLR         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET)
#define CH455_SDA_IN           HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)     //  讀取SDA輸入電平

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

// CH455接口定義
#define        CH455_I2C_ADDR        0x40            // CH455的地址
#define        CH455_I2C_MASK        0x3E            // CH455的高字節命令掩碼

// 讀取按鍵代碼命令
#define CH455_GET_KEY    0x0700                    // 獲取按鍵,返回按鍵代碼
define

另外,用的是stm32的HAL庫,但是IIC通訊依然用的是IO口模擬IIC的,主要是因為CH455g的器件地址沒有找到,其次是HAL庫自帶的IIC模塊不太可靠。

//--------------------------------------------i2c-------------------------------------------
// 設置SDA為輸出方向,對於雙向I/O需切換為輸出
void CH455_SDA_D_OUT()
{  
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
}

// 設置SDA為輸入方向,對於雙向I/O需切換為輸入
void CH455_SDA_D_IN()
{  
    GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
}

void CH455_I2c_Start( void )  // 操作起始
{
    //DISABLE_KEY_INTERRUPT;  //禁止鍵盤中斷,防止開始時被CH455中斷而進入中斷服務程序中的START
    
    CH455_SDA_SET;   /*發送起始條件的數據信號*/
    CH455_SDA_D_OUT();   /* 設置SDA為輸出方向 */
    CH455_SCL_SET;
    CH455_SCL_D_OUT;   /* 設置SCL為輸出方向 */
    HAL_Delay(10);
    CH455_SDA_CLR;   /*發送起始信號*/
    HAL_Delay(10);      
    CH455_SCL_CLR;   /*鉗住I2C總線,准備發送或接收數據 */
}

void CH455_I2c_Stop( void )  // 操作結束
{
    CH455_SDA_CLR;
    CH455_SDA_D_OUT();   /* 設置SDA為輸出方向 */
    HAL_Delay(10);
    CH455_SCL_SET;
    HAL_Delay(10);
    CH455_SDA_SET;  /*發送I2C總線結束信號*/
    HAL_Delay(10);
    CH455_SDA_D_IN();   /* 設置SDA為輸入方向 */
    //ENABLE_KEY_INTERRUPT;
}

void CH455_I2c_WrByte( uint8_t dat )    //寫一個字節數據
{
    uint8_t i;
    CH455_SDA_D_OUT();   /* 設置SDA為輸出方向 */
    for( i = 0; i != 8; i++ )  // 輸出8位數據
    {
        if( dat & 0x80 ) 
        {
            CH455_SDA_SET;
        }
        else 
        {
            CH455_SDA_CLR;
        }
        HAL_Delay(10);
        CH455_SCL_SET;
        dat <<= 1;
        HAL_Delay(10);  // 可選延時
        CH455_SCL_CLR;
    }
    CH455_SDA_D_IN();   /* 設置SDA為輸入方向 */
    CH455_SDA_SET;
    HAL_Delay(10);
    CH455_SCL_SET;  // 接收應答
    HAL_Delay(10);
    CH455_SCL_CLR;
}

uint8_t  CH455_I2c_RdByte( void )        //讀一個字節數據
{
    uint8_t dat,i;
    CH455_SDA_SET;
    CH455_SDA_D_IN();   /* 設置SDA為輸入方向 */
    dat = 0;
    for( i = 0; i != 8; i++ )  // 輸入8位數據
    {
        HAL_Delay(10);  // 可選延時
        CH455_SCL_SET;
        HAL_Delay(10);  // 可選延時
        dat <<= 1;
        if( CH455_SDA_IN ) dat++;  // 輸入1位
        CH455_SCL_CLR;
    }
    CH455_SDA_SET;
    HAL_Delay(10);
    CH455_SCL_SET;  // 發出無效應答
    HAL_Delay(10);
    CH455_SCL_CLR;
    return dat;
}

void CH455_Write( uint16_t cmd )    //寫命令
{
    CH455_I2c_Start();               //啟動總線
  CH455_I2c_WrByte(((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
  CH455_I2c_WrByte((uint8_t)cmd);               //發送數據
  CH455_I2c_Stop();                 //結束總線 
}

uint8_t CH455_Read( void )        //讀取按鍵
{
    uint8_t keycode;
       CH455_I2c_Start();                //啟動總線
       CH455_I2c_WrByte((uint8_t)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
       keycode=CH455_I2c_RdByte();      //讀取數據
    CH455_I2c_Stop();                //結束總線
    return keycode;
}
IO口模擬IIC

 主函數開啟中斷和鍵盤:

HAL_ADC_Start_IT(&hadc1);
CH455_Write( CH455_7SEG_ON );// 開啟顯示和鍵盤,8段顯示方式

 寫完回調函數,即可打印輸出鍵碼:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
    RX_AD = HAL_ADC_GetValue(&hadc1);
    if(RX_AD == 0)
    {
        RX_CH455 = CH455_Read();
        printf("鍵碼:%x\r\n",RX_CH455);
    }
}

完了給大伙看看按鍵打印結果:

需要程序的記得留言打賞哦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM