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

STM32与CH455g通信测试键盘

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

1、概述
9 K. Z6 J  `5 `% V  CH455是数码管显示驱动和键盘扫描控制芯片。CH455内置时钟振荡电路,可以动态驱动4位数码管或者32只LED;同时还可以进行28键的键盘扫描;CH455通过SCL和SDA组成的2线串行接口与单片机等交换数据。
! J- y5 Q; S) h4 t3 l" [  

: j0 M% n2 u0 d9 L1 B
2、键码


9 s) G3 ~: ~5 k1 c
编址DIG3DIG2DIG1DIG0
SEG007H06H05H04H
SEG10FH0EH0DH0CH
SEG217H16H15H14H
SEG31FH1EH1DH1CH
SEG427H26H25H24H
SEG52FH2EH2DH2CH
SEG637H36H35H34H
SEG0+SEG13FH3EH3DH3CH

  S0 D9 r# j! ~  Q' w) `9 O+ C

3、原理图接线

5 c0 o# Q" G6 j; R/ g; A  R3 C# s

4 K7 B: J5 b2 ^0 M& Z* S/ I

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

  j0 J9 h* @. ]9 v3 ^
9 p2 d; e5 `6 M6 o" g

4、程序设计
& H" t1 _' j/ d5 p. R: t9 G' F这里由于篇幅问题,主要贴一下IIC控制函数:


5 g$ {; s# o- X. ~" W  B
  1. //--------------------------------------------i2c-------------------------------------------, j( t, }$ R) C  y
  2. // 设置SDA为输出方向,对于双向I/O需切换为输出2 K' x0 |3 L1 n
  3. void CH455_SDA_D_OUT()
    - M, f7 Q$ f: h, G6 c
  4. {  / l. I0 R9 o+ c" D) S9 r
  5.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    - y- N7 V& a9 g, `  k, ?" q1 `
  6.         GPIO_InitStruct.Pin = GPIO_PIN_9;& `# o- @% i2 P2 n' z1 l2 \, X" M
  7.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      [0 e: `2 D( Q, v( `% F0 S
  8.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    & M5 t8 M2 F' ^( I8 H! E; S
  9.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;( n3 I: g$ f$ T1 |9 ~5 M: I7 M
  10.         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);& s! H" \+ S- d6 l
  11.        
    / m" Z1 C1 r" ?' r, r8 F
  12. }
    ! Q2 l( o6 O5 K# N  c1 W/ o' f
  13.   P: R1 {& `1 Y) \9 x- ?- M8 {( ]
  14. // 设置SDA为输入方向,对于双向I/O需切换为输入
    # T+ f6 f8 D( o1 B
  15. void CH455_SDA_D_IN()
    7 z* l% o4 }8 F$ e6 m% S- `& A
  16. {  
    ) q6 h" N! A* D: p
  17.         GPIO_InitTypeDef GPIO_InitStruct = {0};, {2 g/ i7 |, R% _) Y
  18.   GPIO_InitStruct.Pin = GPIO_PIN_9;
    . h& W  M& v, R. H) m# Z
  19.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    0 G+ i8 D8 \: f" |- X  D2 c7 n9 X7 H
  20.   GPIO_InitStruct.Pull = GPIO_NOPULL;+ E: I& u! V  Y  X& j, ~
  21.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    2 t5 F# B; M. w/ o
  22.        
    , v( B5 t$ L; [/ t3 u0 L# ?$ [0 R
  23. }
    / j8 I, x+ i1 a) u
  24. : @& E% m& I# C7 |6 D
  25. void CH455_I2c_Start( void )  // 操作起始
    2 a5 O3 ?5 a: f: D0 s: T
  26. {
    5 m# a" k; W3 g/ \+ t; Q7 Y' i7 b
  27.         //DISABLE_KEY_INTERRUPT;  //禁止键盘中断,防止开始时被CH455中断而进入中断服务程序中的START9 j6 s$ w/ b! ^9 _. h0 k
  28.         3 P# b! k1 ^  Y" L3 B
  29.         CH455_SDA_SET;   /*发送起始条件的数据信号*/: a3 U% g, [3 O
  30.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */+ g' Z( J' P  a; @6 P0 |
  31.         CH455_SCL_SET;
    " j) w1 b* l9 A( ?5 H
  32.         CH455_SCL_D_OUT;   /* 设置SCL为输出方向 */
    ! x: j" j, ?% P% j5 ?( m
  33.         HAL_Delay(10);
    " O" U; t$ j* i9 r3 d
  34.         CH455_SDA_CLR;   /*发送起始信号*/
    3 O: n; H  E% Z; j
  35.         HAL_Delay(10);      
    1 u/ O1 x! H% N/ v  k
  36.         CH455_SCL_CLR;   /*钳住I2C总线,准备发送或接收数据 */  o$ H4 I; w1 r5 ~3 b, M
  37. }; ^3 M. V' }2 F
  38.   C! K& A' ~! Y4 J) x  _3 [& w8 z
  39. void CH455_I2c_Stop( void )  // 操作结束2 d, y/ V+ d! z( A) i( t
  40. {- S4 _' c8 T/ X' H
  41.         CH455_SDA_CLR;5 ~7 E6 z( b; Q; l) z- C
  42.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
    2 L6 K/ L& R  @7 _% ?
  43.         HAL_Delay(10);
    + X' r# `# V7 C2 S$ `& J5 F  h
  44.         CH455_SCL_SET;
    # ^6 V3 Y& i+ X: i
  45.         HAL_Delay(10);
    8 l( O4 u* U8 Z; Q% e
  46.         CH455_SDA_SET;  /*发送I2C总线结束信号*/& k$ y( D$ }8 O. t2 |$ s
  47.         HAL_Delay(10);
    " E* l" F- f6 Q
  48.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    " c; J, P+ ~/ [9 J! v4 J5 ^4 I
  49.         //ENABLE_KEY_INTERRUPT;
    * Q! b" H* W6 K
  50. }$ m- J: Q. U6 `1 A, w) o
  51. / x, V5 w8 L; `; D# ^2 ]
  52. void CH455_I2c_WrByte( uint8_t dat )        //写一个字节数据8 J5 z  `( I" z# [
  53. {
    3 ?: X! J$ F# ^. O. t4 {
  54.         uint8_t i;% z, U5 |- f# H" {# r/ J& [
  55.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */3 f5 J) _2 N' n" x0 v: X- t
  56.         for( i = 0; i != 8; i++ )  // 输出8位数据
    / e& W8 w" `3 f- }
  57.         {% [6 c3 G3 C6 w0 ?5 Q- D! J5 D
  58.                 if( dat & 0x80 )
    ( w' N' k0 I& F2 V! e+ ^
  59.                 {
      m# ]4 G* F" b  p4 `3 l9 P& [, U
  60.                     CH455_SDA_SET;+ P, s2 Z! z: l; s/ H
  61.                 }
      B" [, j6 b3 ]* P
  62.                 else
    * J- L0 L/ H9 q
  63.                 {5 L9 h8 e" i6 Y9 H5 J
  64.                     CH455_SDA_CLR;
    / }$ M0 P  {) v, G
  65.                 }
    9 {% F& p: J6 g# u  X: c
  66.                 HAL_Delay(10);
    * |# a) h/ {, J9 `8 z8 Z
  67.                 CH455_SCL_SET;
      y* D* M5 H% J) b$ J
  68.                 dat <<= 1;, F( ?( F: }; L, s( N7 c
  69.                 HAL_Delay(10);  // 可选延时
    3 Y. ?4 o0 h! V6 @: W
  70.                 CH455_SCL_CLR;
    ' g" c3 a. y" F
  71.         }6 O9 N% \5 k# w5 R
  72.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    ( S9 i) T5 t7 P/ t6 c1 Z
  73.         CH455_SDA_SET;% \) l+ P7 A9 ~3 V0 n
  74.         HAL_Delay(10);
    5 P/ }' ?" ^4 W0 q. m
  75.         CH455_SCL_SET;  // 接收应答
    0 X8 I6 S8 \3 B5 W4 k. B1 ^
  76.         HAL_Delay(10);2 T/ Y, Z! M0 D. }. g
  77.         CH455_SCL_CLR;' Y  h7 f7 X$ o; d" P9 S
  78. }* f/ }1 _# `8 S' g, l

  79. ( x/ ]" R9 r; p) I3 J
  80. uint8_t  CH455_I2c_RdByte( void )                //读一个字节数据! r$ a# J/ k8 H% T  a3 @8 r
  81. {; p; d' b8 p; p/ D7 h. ?: |6 H
  82.         uint8_t dat,i;' |& J% D5 _( r: O2 H
  83.         CH455_SDA_SET;
    " y- g2 h- p9 ~; a
  84.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    + p& V' _4 |% g3 O& ~3 Z
  85.         dat = 0;
    0 z$ n+ E+ O- e  T7 V, }. J
  86.         for( i = 0; i != 8; i++ )  // 输入8位数据
    5 h1 U! `. A% J
  87.         {; K( i) f7 E4 K6 n; s
  88.                 HAL_Delay(10);  // 可选延时0 e( _* I& D% O' l
  89.                 CH455_SCL_SET;" `" d" ?7 b+ X
  90.                 HAL_Delay(10);  // 可选延时1 g5 V# q/ K& l; l% ]* F
  91.                 dat <<= 1;  [' i9 W5 u' B
  92.                 if( CH455_SDA_IN ) dat++;  // 输入1位
    3 H/ e. }; u1 B" M' x' f
  93.                 CH455_SCL_CLR;
    : Q( H! ]3 y* D- ]$ B% M
  94.         }0 `, V8 @! @$ Q- d, ?
  95.         CH455_SDA_SET;
    6 j5 L& ?7 \$ q" K. e* [
  96.         HAL_Delay(10);
    2 _+ E- N- a4 H+ D; e
  97.         CH455_SCL_SET;  // 发出无效应答
      R/ a! U; c7 e
  98.         HAL_Delay(10);
    . Z7 c& j1 j' w- d6 Z% ^4 l6 h6 |* B
  99.         CH455_SCL_CLR;3 \+ N; d0 \) t2 i2 N
  100.         return dat;# n2 q0 Y5 {3 P; p; {- ?  v
  101. }
    / x6 I6 R; o2 D2 C0 q

  102. * x  l' r1 C3 P( C
  103. void CH455_Write( uint16_t cmd )        //写命令% Z, }6 u+ ]) ^6 I2 G
  104. {
    0 d$ ^% D3 D& ]4 V$ \( l  C
  105.         CH455_I2c_Start();               //启动总线4 V; _6 v! [) x" M+ z) `
  106.   CH455_I2c_WrByte(((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);0 q0 o" B3 L0 C8 V1 G
  107.   CH455_I2c_WrByte((uint8_t)cmd);               //发送数据
    * b/ |  G( n4 c& L# n
  108.   CH455_I2c_Stop();                 //结束总线 7 q9 s3 b8 T! a+ [
  109. }6 c* }+ b2 C8 n9 l# _
  110. 3 O& P' h% u0 K7 r3 o
  111. uint8_t CH455_Read( void )                //读取按键
    # ]8 K4 R6 }7 w/ [
  112. {
    7 l6 N! c- n, V: `
  113.         uint8_t keycode;) u5 h" E9 r. f
  114.            CH455_I2c_Start();                //启动总线
    7 I" H& Z1 t/ o0 h$ q' B) k$ V
  115.            CH455_I2c_WrByte((uint8_t)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
    ' N0 ^' X# z$ X4 [. C
  116.            keycode=CH455_I2c_RdByte();      //读取数据
    8 o5 h2 W" ?% V( M$ y
  117.         CH455_I2c_Stop();                //结束总线( v! y( b+ [: j% G
  118.         return keycode;4 }4 s# j& E4 r4 q" p  C$ J
  119. }
复制代码
1 y/ }2 Z( [* l2 ^% L6 [! B

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

$ p6 I- Y- ?# p2 c2 R

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

# I" k- z8 Q  R& f
赞 收藏 评论0 发布时间:2020-9-30 09:30

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版