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

一、概述

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

二、特色

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

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

內部限流,經過佔空比設定提供8級亮度控制。spa

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

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

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

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

內置位,支持2.7V5Vblog

支持低功耗睡眠節約,能夠被按喚醒或者被命令操做喚醒接口

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

三、引腳介紹

VCC:,持電流不小於150mA

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

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

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

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

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

四、鍵盤掃描功能

  鍵盤掃描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

 

 

 

 

 

 

 

 

 

 

 

五、串行接口

  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是掃描碼和編址

七、接口時序

  

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

TSD:最小時間30ns

THD:最小時間10ns

TAA/TDH:最小時間2ns

Rate:最大速率4Mbps

八、原理圖接線

九、程序設計

   因爲此次只是作個簡單的按鍵檢測,因此只用到鍵盤掃描功能,數碼管有須要再作吧。先定義一下系統參數:

// 設置系統參數命令
#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);
    }
}

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

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

相關文章
相關標籤/搜索