你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32与CH455g通信测试键盘

[复制链接]
STMCU-管管 发布时间:2020-9-30 09:30

1、概述
  CH455是数码管显示驱动和键盘扫描控制芯片。CH455内置时钟振荡电路,可以动态驱动4位数码管或者32只LED;同时还可以进行28键的键盘扫描;CH455通过SCL和SDA组成的2线串行接口与单片机等交换数据。
  


2、键码


编址DIG3DIG2DIG1DIG0
SEG007H06H05H04H
SEG10FH0EH0DH0CH
SEG217H16H15H14H
SEG31FH1EH1DH1CH
SEG427H26H25H24H
SEG52FH2EH2DH2CH
SEG637H36H35H34H
SEG0+SEG13FH3EH3DH3CH

3、原理图接线



20200929131040128_meitu_1.jpg 注意:INT接单片机的中断接收口,作为按键按下的信号


4、程序设计
这里由于篇幅问题,主要贴一下IIC控制函数:


  1. //--------------------------------------------i2c-------------------------------------------
  2. // 设置SDA为输出方向,对于双向I/O需切换为输出
  3. void CH455_SDA_D_OUT()
  4. {  
  5.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  6.         GPIO_InitStruct.Pin = GPIO_PIN_9;
  7.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  8.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  9.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  10.         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  11.        
  12. }

  13. // 设置SDA为输入方向,对于双向I/O需切换为输入
  14. void CH455_SDA_D_IN()
  15. {  
  16.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  17.   GPIO_InitStruct.Pin = GPIO_PIN_9;
  18.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  19.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  20.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  21.        
  22. }

  23. void CH455_I2c_Start( void )  // 操作起始
  24. {
  25.         //DISABLE_KEY_INTERRUPT;  //禁止键盘中断,防止开始时被CH455中断而进入中断服务程序中的START
  26.        
  27.         CH455_SDA_SET;   /*发送起始条件的数据信号*/
  28.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
  29.         CH455_SCL_SET;
  30.         CH455_SCL_D_OUT;   /* 设置SCL为输出方向 */
  31.         HAL_Delay(10);
  32.         CH455_SDA_CLR;   /*发送起始信号*/
  33.         HAL_Delay(10);      
  34.         CH455_SCL_CLR;   /*钳住I2C总线,准备发送或接收数据 */
  35. }

  36. void CH455_I2c_Stop( void )  // 操作结束
  37. {
  38.         CH455_SDA_CLR;
  39.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
  40.         HAL_Delay(10);
  41.         CH455_SCL_SET;
  42.         HAL_Delay(10);
  43.         CH455_SDA_SET;  /*发送I2C总线结束信号*/
  44.         HAL_Delay(10);
  45.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
  46.         //ENABLE_KEY_INTERRUPT;
  47. }

  48. void CH455_I2c_WrByte( uint8_t dat )        //写一个字节数据
  49. {
  50.         uint8_t i;
  51.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
  52.         for( i = 0; i != 8; i++ )  // 输出8位数据
  53.         {
  54.                 if( dat & 0x80 )
  55.                 {
  56.                     CH455_SDA_SET;
  57.                 }
  58.                 else
  59.                 {
  60.                     CH455_SDA_CLR;
  61.                 }
  62.                 HAL_Delay(10);
  63.                 CH455_SCL_SET;
  64.                 dat <<= 1;
  65.                 HAL_Delay(10);  // 可选延时
  66.                 CH455_SCL_CLR;
  67.         }
  68.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
  69.         CH455_SDA_SET;
  70.         HAL_Delay(10);
  71.         CH455_SCL_SET;  // 接收应答
  72.         HAL_Delay(10);
  73.         CH455_SCL_CLR;
  74. }

  75. uint8_t  CH455_I2c_RdByte( void )                //读一个字节数据
  76. {
  77.         uint8_t dat,i;
  78.         CH455_SDA_SET;
  79.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
  80.         dat = 0;
  81.         for( i = 0; i != 8; i++ )  // 输入8位数据
  82.         {
  83.                 HAL_Delay(10);  // 可选延时
  84.                 CH455_SCL_SET;
  85.                 HAL_Delay(10);  // 可选延时
  86.                 dat <<= 1;
  87.                 if( CH455_SDA_IN ) dat++;  // 输入1位
  88.                 CH455_SCL_CLR;
  89.         }
  90.         CH455_SDA_SET;
  91.         HAL_Delay(10);
  92.         CH455_SCL_SET;  // 发出无效应答
  93.         HAL_Delay(10);
  94.         CH455_SCL_CLR;
  95.         return dat;
  96. }

  97. void CH455_Write( uint16_t cmd )        //写命令
  98. {
  99.         CH455_I2c_Start();               //启动总线
  100.   CH455_I2c_WrByte(((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);
  101.   CH455_I2c_WrByte((uint8_t)cmd);               //发送数据
  102.   CH455_I2c_Stop();                 //结束总线
  103. }

  104. uint8_t CH455_Read( void )                //读取按键
  105. {
  106.         uint8_t keycode;
  107.            CH455_I2c_Start();                //启动总线
  108.            CH455_I2c_WrByte((uint8_t)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
  109.            keycode=CH455_I2c_RdByte();      //读取数据
  110.         CH455_I2c_Stop();                //结束总线
  111.         return keycode;
  112. }
复制代码

主函数中记得加上开中断和键盘:


  1. HAL_ADC_Start_IT(&hadc1);
  2.         CH455_Write( CH455_7SEG_ON );// 开启显示和键盘,8段显示方式
复制代码

收藏 评论0 发布时间:2020-9-30 09:30

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版