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

STM32与CH455g通信测试键盘

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

1、概述# @$ |" g: G" m  z: V2 B' A
  CH455是数码管显示驱动和键盘扫描控制芯片。CH455内置时钟振荡电路,可以动态驱动4位数码管或者32只LED;同时还可以进行28键的键盘扫描;CH455通过SCL和SDA组成的2线串行接口与单片机等交换数据。& Q, a; G! m9 [5 ]1 \9 q
  


# w& U0 @/ i! N$ a  f( ~# a2、键码


  g7 Z/ ~3 @  Y2 z) [2 f
编址DIG3DIG2DIG1DIG0
SEG007H06H05H04H
SEG10FH0EH0DH0CH
SEG217H16H15H14H
SEG31FH1EH1DH1CH
SEG427H26H25H24H
SEG52FH2EH2DH2CH
SEG637H36H35H34H
SEG0+SEG13FH3EH3DH3CH

+ o$ L; i; V0 d" X0 }( S* d

3、原理图接线

9 P. @7 h6 C0 h) K8 R

9 G; d. T* v! l4 l9 S

20200929131040128_meitu_1.jpg 注意:INT接单片机的中断接收口,作为按键按下的信号
9 h" b' G, n; ~( G( y' N! Q

: e. b4 u- n$ G# U$ n% C4 A

4、程序设计/ d2 i3 ~% {0 v4 Y0 ~6 j: e
这里由于篇幅问题,主要贴一下IIC控制函数:


( k+ Q  L0 F, f: s
  1. //--------------------------------------------i2c-------------------------------------------
    ( W# g1 _: m3 R  r
  2. // 设置SDA为输出方向,对于双向I/O需切换为输出& V0 D" q  ]8 t* G, G
  3. void CH455_SDA_D_OUT(): A$ Y, t$ H( m& S! s8 U7 @
  4. {  3 @  }9 w. _" T3 N" z
  5.         GPIO_InitTypeDef GPIO_InitStruct = {0};8 L6 n1 O) A8 W. X( W( [2 P; d
  6.         GPIO_InitStruct.Pin = GPIO_PIN_9;
    6 ^4 k6 c" N; ]! k
  7.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    ( J  c" j6 [' f7 c& g0 R
  8.   GPIO_InitStruct.Pull = GPIO_NOPULL;; K& [5 G" K* \6 f5 P- v
  9.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    , K! S# e( I: _; j9 E# L
  10.         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    , n3 k, G" P8 r% K# A! ?
  11.         ( P7 |1 D0 J7 ~; l9 X. P2 u
  12. }8 M2 y. w) a8 E* r0 Q3 }# O! W

  13. % S7 m0 `9 p; ^
  14. // 设置SDA为输入方向,对于双向I/O需切换为输入
    ( R1 p& ~: W/ i
  15. void CH455_SDA_D_IN(). C" m( u9 Z9 ~" Q- L' i
  16. {  
    9 m  v' [5 o; y, U
  17.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    9 A8 P: t: O% Q  I' m
  18.   GPIO_InitStruct.Pin = GPIO_PIN_9;8 O$ p) ^5 ?7 B8 b& e6 k% g
  19.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;+ U7 s' x- g$ J+ X
  20.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    4 E3 g$ d/ J; ?+ K' o3 i' T
  21.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    ) x! z0 {. `0 B% X
  22.         . k$ @: X% W& m. s, D5 L
  23. }
    ! i1 d. v5 R# J. ?( `, A& m

  24. 4 V+ b0 j5 L7 ^- w' g" _% _
  25. void CH455_I2c_Start( void )  // 操作起始
    ) t8 ~- d' H" u, ?
  26. {8 y- ]1 G3 k8 c# K$ [& u9 c
  27.         //DISABLE_KEY_INTERRUPT;  //禁止键盘中断,防止开始时被CH455中断而进入中断服务程序中的START4 C5 K9 k& c+ Y9 z, d: N, v
  28.        
    1 q8 H& H4 K# Q& M; {; o/ L
  29.         CH455_SDA_SET;   /*发送起始条件的数据信号*/6 |/ U3 J- u5 f% c$ y2 I) F
  30.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
      ~6 f/ i/ Q& P: W) w+ R% K' L
  31.         CH455_SCL_SET;
      l4 j1 t/ ?& {9 s# Y: d7 o/ T4 l
  32.         CH455_SCL_D_OUT;   /* 设置SCL为输出方向 */
    & p* @/ p) n+ H# y5 t
  33.         HAL_Delay(10);2 y$ v8 G$ |. }4 Z) `* J
  34.         CH455_SDA_CLR;   /*发送起始信号*/, e7 G1 C% R4 |" K# b- n0 D7 b% C! |
  35.         HAL_Delay(10);      6 T5 T" [  ]1 `# S' o+ q
  36.         CH455_SCL_CLR;   /*钳住I2C总线,准备发送或接收数据 */1 g# ^+ S9 o$ @' L3 E; H
  37. }" ^+ U" O2 L  {2 @5 X* t

  38. 8 p4 j; [& G- S, j1 n! n
  39. void CH455_I2c_Stop( void )  // 操作结束
    3 y4 i+ c* e0 Q3 [
  40. {
    . u& L2 \8 g# h' q4 g6 N
  41.         CH455_SDA_CLR;* ]3 q/ D0 x: l# q( L4 c8 e) v! f: ^
  42.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
    * |& e0 L! }9 f
  43.         HAL_Delay(10);7 }& W1 ]- Q2 G6 U! Z* i
  44.         CH455_SCL_SET;
    ; U2 D+ t8 \1 y4 \: F7 G3 O
  45.         HAL_Delay(10);
    + |, h6 e& g  n5 U  p6 }$ ~& @
  46.         CH455_SDA_SET;  /*发送I2C总线结束信号*/  a1 z: ]! W3 i' a# R
  47.         HAL_Delay(10);
    5 E5 Z: X2 i' Z! T7 z. {
  48.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
      p1 p* i+ l( D& M
  49.         //ENABLE_KEY_INTERRUPT;
    7 W( V. ^9 X) X. m
  50. }2 \: |( j2 x! {* w

  51. 1 p9 H% ]- E+ q& U" ^
  52. void CH455_I2c_WrByte( uint8_t dat )        //写一个字节数据, d2 ~) V9 C2 G' y, \' ~
  53. {
    , U! H. S7 N7 R! a6 ]
  54.         uint8_t i;, i1 a# N; X$ t/ W0 n9 x; a% ?5 Z1 r
  55.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
    ; m7 X+ s" P. a8 X; L+ ?" T
  56.         for( i = 0; i != 8; i++ )  // 输出8位数据
    ; h# r( u2 E' _7 k( s  v7 |; H
  57.         {6 ~! D! X0 A& _5 R! j2 T' F
  58.                 if( dat & 0x80 )
    . {, X+ D) L6 Y' M: O
  59.                 {
    ; m* G( }/ Q. v6 O& K
  60.                     CH455_SDA_SET;2 {2 p; [$ g/ ^' b! F9 Y3 w
  61.                 }
    * |2 i3 M& M! s' I  S0 }8 e
  62.                 else   n& {9 Q. z# l5 y9 u6 t
  63.                 {, y# x0 l8 T3 A5 ~/ K, j; L
  64.                     CH455_SDA_CLR;) n; R; c- o, t1 I, X, C
  65.                 }, S4 G1 x  _$ o
  66.                 HAL_Delay(10);
    3 n2 v- f$ Z6 p1 H" F/ e# f( N
  67.                 CH455_SCL_SET;
    " C4 u4 |3 V5 }
  68.                 dat <<= 1;3 c/ j- \" t; H( G  g8 f
  69.                 HAL_Delay(10);  // 可选延时. N' M& _. A* S7 g4 s+ x6 a& F
  70.                 CH455_SCL_CLR;
    % ^  y: ^  L  M, ?7 }
  71.         }
    - K' d1 B( C& o+ o$ p
  72.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */9 Y9 \# y% N2 N8 h# q* I* E
  73.         CH455_SDA_SET;! p6 I9 v9 U# B$ r& m; [+ b3 `
  74.         HAL_Delay(10);
    : R6 r* z2 c. W) C7 A
  75.         CH455_SCL_SET;  // 接收应答" \: G+ t5 j$ y" I* C
  76.         HAL_Delay(10);! V  Q# x6 B' D2 |: x8 |0 V
  77.         CH455_SCL_CLR;
    3 D6 w, l8 Z& t- L
  78. }* }7 b* [* Y' n$ v' u/ B
  79. 2 }2 C2 b1 U( ~' V% b  V& k
  80. uint8_t  CH455_I2c_RdByte( void )                //读一个字节数据
    - h- [  C& k: t& O
  81. {  q1 Q4 `6 E1 i) T! V
  82.         uint8_t dat,i;
    0 Y# e$ @  {( `, v+ s3 F  ?
  83.         CH455_SDA_SET;
    * ?) x- P5 C4 K- u* V
  84.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    9 {# ?! f) c6 I7 D
  85.         dat = 0;. w2 u! \$ T0 q4 s0 S
  86.         for( i = 0; i != 8; i++ )  // 输入8位数据0 k# c4 I0 w2 U6 i7 j6 \4 e' x
  87.         {/ |/ m& `* ?" b% A
  88.                 HAL_Delay(10);  // 可选延时
    ( j6 m& K, A" ?5 [) V
  89.                 CH455_SCL_SET;/ H% Y2 V" r4 p# b$ ?0 b+ x
  90.                 HAL_Delay(10);  // 可选延时1 ?+ s, G( e% y* b" _8 J
  91.                 dat <<= 1;& P* W. [: }. I$ ~& g
  92.                 if( CH455_SDA_IN ) dat++;  // 输入1位
    * r! @( Q6 q0 d4 d& X0 d
  93.                 CH455_SCL_CLR;  n6 S, Q, [# x9 S  r/ M
  94.         }0 F/ @* Q1 }, `; X9 T
  95.         CH455_SDA_SET;
    " O% F' {( {% V7 M
  96.         HAL_Delay(10);
    . c2 B( b: K" ]7 y8 G1 t
  97.         CH455_SCL_SET;  // 发出无效应答
      s& p6 R* t4 J. `* Z8 U
  98.         HAL_Delay(10);
    9 _/ Z5 j6 t7 J9 l5 j7 t& x5 R
  99.         CH455_SCL_CLR;
    . P- Y$ q! T( q* V" |7 L+ V
  100.         return dat;
    $ s* r2 _3 R0 S5 z2 o$ W8 b/ q! j' S6 c: N/ @
  101. }6 E2 `* ]$ }$ z+ `. a+ C5 \% I
  102. 2 U: i( \) g& H8 Z+ U& p" T9 }
  103. void CH455_Write( uint16_t cmd )        //写命令/ F" u. O$ r& A# _  a
  104. {
    4 v4 z/ L' [  @9 B6 ]
  105.         CH455_I2c_Start();               //启动总线
    4 T! I1 x- @$ a, E9 Q2 s
  106.   CH455_I2c_WrByte(((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);  w5 L! a! B6 d
  107.   CH455_I2c_WrByte((uint8_t)cmd);               //发送数据
    4 A; M4 F0 B$ b& Y1 Q4 a" u" N
  108.   CH455_I2c_Stop();                 //结束总线 - r$ H. X% A2 ]/ q% |7 M4 K
  109. }1 i: o+ y- b- D& v
  110. : h# W; P$ J! w& i& r: D. `
  111. uint8_t CH455_Read( void )                //读取按键
    3 W) s4 Y' E# _/ B6 ]
  112. {' h: {( M7 S% Q+ c* \: \
  113.         uint8_t keycode;/ H3 L7 z5 S' U5 R
  114.            CH455_I2c_Start();                //启动总线8 T! u+ f( f9 Q. i( S3 `
  115.            CH455_I2c_WrByte((uint8_t)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
    - }  Z" \8 L  @; N; p
  116.            keycode=CH455_I2c_RdByte();      //读取数据; J$ T. d* U* S
  117.         CH455_I2c_Stop();                //结束总线
    9 M, o$ i5 h! g! N2 x. @, k1 z3 y
  118.         return keycode;( c! X! }6 ?% S6 z; w
  119. }
复制代码
) I- P/ s9 b8 O+ H, f

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

+ n" }' c5 m( a) i" ?1 j

  1. HAL_ADC_Start_IT(&hadc1);3 |  ~# q8 |) P, t, J- P# \7 F
  2.         CH455_Write( CH455_7SEG_ON );// 开启显示和键盘,8段显示方式
复制代码

: R& x8 P2 m* d+ L3 g- [1 v
收藏 评论0 发布时间:2020-9-30 09:30

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版