1、概述
CH455是数码管显示驱动和键盘扫描控制芯片。CH455内置时钟振荡电路,可以动态驱动4位数码管或者32只LED;同时还可以进行28键的键盘扫描;CH455通过SCL和SDA组成的2线串行接口与单片机等交换数据。
2、键码
编址 | 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 |
3、原理图接线
注意:INT接单片机的中断接收口,作为按键按下的信号
4、程序设计
这里由于篇幅问题,主要贴一下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;
}
主函数中记得加上开中断和键盘:
HAL_ADC_Start_IT(&hadc1);
CH455_Write( CH455_7SEG_ON );// 开启显示和键盘,8段显示方式
贴个工程地址:
https://download.csdn.net/download/weixin_44007438/12897901
有问题记得留言,能解决你的疑惑记得打赏哟