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

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个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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