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

STM32与CH455g通信测试键盘

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

1、概述
1 y% `5 Q6 ^( h$ k9 z  CH455是数码管显示驱动和键盘扫描控制芯片。CH455内置时钟振荡电路,可以动态驱动4位数码管或者32只LED;同时还可以进行28键的键盘扫描;CH455通过SCL和SDA组成的2线串行接口与单片机等交换数据。& L0 T5 M- ~# a+ t  G& O
  

( U. L- F* ^( Y' |' e5 V& H
2、键码


& z: s7 ]' ?' ]+ j
编址DIG3DIG2DIG1DIG0
SEG007H06H05H04H
SEG10FH0EH0DH0CH
SEG217H16H15H14H
SEG31FH1EH1DH1CH
SEG427H26H25H24H
SEG52FH2EH2DH2CH
SEG637H36H35H34H
SEG0+SEG13FH3EH3DH3CH

! g0 v( U+ O) p) O/ N

3、原理图接线

6 W  q' U: h0 m% N


3 l2 Q# X5 j  o- \! \0 M8 w

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

3 ~3 c$ O( H6 X7 w+ U+ @" e, ?. r$ x$ C2 O  |

4、程序设计3 R* @5 e( m8 Y7 t* i
这里由于篇幅问题,主要贴一下IIC控制函数:


5 S( @( v6 x& W3 m8 n
  1. //--------------------------------------------i2c-------------------------------------------' a6 S  O% S" o# T
  2. // 设置SDA为输出方向,对于双向I/O需切换为输出
    - I/ N$ x) \, ~4 b5 f5 q  L
  3. void CH455_SDA_D_OUT(); D9 ^8 O+ e' d- L$ i
  4. {  
    ; \8 Q4 w3 c0 Z( o
  5.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    8 A, u# W* x3 ?4 _5 j  _$ o
  6.         GPIO_InitStruct.Pin = GPIO_PIN_9;
    % M5 Z, C( ^5 o+ u, E+ o( g8 [
  7.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    3 j! s2 [% Q9 h
  8.   GPIO_InitStruct.Pull = GPIO_NOPULL;0 V: n, i/ k5 r% `8 G4 q
  9.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    + v- Q+ f. I3 u/ q- F7 `
  10.         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);4 J. h% M. K8 O/ G
  11.         ; ^+ K& L9 M: Y" X, e
  12. }
    & A" }4 }5 Q# s

  13. + K. {3 L4 v3 n% `) r
  14. // 设置SDA为输入方向,对于双向I/O需切换为输入
    / c- Q3 E& H5 z; B1 T
  15. void CH455_SDA_D_IN()
    ) {/ k7 j6 I0 c- V* o7 e" j
  16. {  4 d  R; h3 L/ T7 }
  17.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    * T$ @0 M1 M2 Z( F' M
  18.   GPIO_InitStruct.Pin = GPIO_PIN_9;, j4 k. _( ]: o/ y* p2 c  \
  19.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;# Z: g9 I& x* Z) j/ |5 g
  20.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    6 f3 Z* R1 Y8 Z% k. i  }
  21.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    $ [# o* H$ {; x4 `! b' v- O9 N% v
  22.        
    3 ?+ Z% A( g% c9 U* M- q% j/ j1 K
  23. }
    ) d! j# z' I! w  y" _: X
  24. ; f) u7 c2 q! _4 T) ^6 U3 r7 R+ n: h
  25. void CH455_I2c_Start( void )  // 操作起始
    & \6 d4 m1 P8 K0 z& ?9 {
  26. {" L+ {) W* \% m2 ^
  27.         //DISABLE_KEY_INTERRUPT;  //禁止键盘中断,防止开始时被CH455中断而进入中断服务程序中的START+ w; ?" Y7 M6 H! F7 K  G' ]! Q) Q
  28.         , x# [) N$ h6 K- L
  29.         CH455_SDA_SET;   /*发送起始条件的数据信号*/5 r' l; Z* h$ d: R
  30.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */3 X1 A# s# \4 G) i- b
  31.         CH455_SCL_SET;& S6 T, Y1 a, x- x/ }& t" \7 Y+ M9 j
  32.         CH455_SCL_D_OUT;   /* 设置SCL为输出方向 */
    8 b) c2 T- ?  Y
  33.         HAL_Delay(10);
    & d3 ]$ C  i  \9 _& Y$ D+ U/ N0 `: u
  34.         CH455_SDA_CLR;   /*发送起始信号*/& q' g* I& k0 Y; u
  35.         HAL_Delay(10);      # r+ a: O' o8 J4 c
  36.         CH455_SCL_CLR;   /*钳住I2C总线,准备发送或接收数据 */: P+ T0 R; r1 Y. z$ A- C/ H' r
  37. }4 L3 q8 a2 n6 ]$ k  m

  38. ' [4 t" ?& h7 f5 t. v& u
  39. void CH455_I2c_Stop( void )  // 操作结束# U" u9 z$ d! ^% V: T
  40. {
    2 N' V! }- N0 z) t% }5 ]. `
  41.         CH455_SDA_CLR;
    + }; d  t/ a# E7 d$ x
  42.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */
    ! t9 T$ b) v# K7 G: K% u; y
  43.         HAL_Delay(10);9 k  m% Q3 n9 T. ~7 X# u' C" n
  44.         CH455_SCL_SET;
    + q6 u/ k% c4 _/ d) B$ }
  45.         HAL_Delay(10);
    ) L6 `+ _+ u6 N5 L
  46.         CH455_SDA_SET;  /*发送I2C总线结束信号*/5 Q. t- ~% K1 }& }; `
  47.         HAL_Delay(10);
    1 D- X5 Q8 P4 U$ y6 J! I) A3 X& a: I
  48.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    & K' _) }4 {" z( Q( R. Q/ _/ ^
  49.         //ENABLE_KEY_INTERRUPT;
    ! K% k( a2 u  J# o: f: C5 G; I
  50. }& R0 W0 V3 n0 K: O* B: X
  51. % Y& K6 U+ n- D4 g$ f: r. U
  52. void CH455_I2c_WrByte( uint8_t dat )        //写一个字节数据8 G  P; L: g" Q* Y0 G& N$ z8 ~
  53. {* g# `5 T1 A( r+ B6 o3 C
  54.         uint8_t i;* g9 X1 o6 S4 C  u# m: j6 Y
  55.         CH455_SDA_D_OUT();   /* 设置SDA为输出方向 */' ?; M6 a) q  t9 J7 T9 |6 _4 r& k7 y  _
  56.         for( i = 0; i != 8; i++ )  // 输出8位数据; X' Y- i; H: x9 T+ K% j/ _
  57.         {* p7 O# O, a: t
  58.                 if( dat & 0x80 )
    7 u" Z0 [: F- b6 p
  59.                 {
    0 _9 y7 s! u) g, Q
  60.                     CH455_SDA_SET;% Q$ i& c& a! P
  61.                 }
    + N5 t; U& N; C6 O) g, |
  62.                 else
    3 m+ K! [+ u# N3 l0 b3 t' P
  63.                 {' X) H' e" f: h9 B, R3 G  [
  64.                     CH455_SDA_CLR;
    # S- l- {% Z0 o  O
  65.                 }
    , F9 q7 Q+ {" h
  66.                 HAL_Delay(10);6 g9 k$ k# r! n; Y! @' L
  67.                 CH455_SCL_SET;
    ( X( s/ F0 d+ d: O" V
  68.                 dat <<= 1;6 m! u& W' G$ J+ E$ l
  69.                 HAL_Delay(10);  // 可选延时
    : F; O$ W' H' w2 ?' o2 B
  70.                 CH455_SCL_CLR;
    * B1 o: X# h5 I. v% K1 j* I( p5 l
  71.         }" _- t1 k3 J& o& Y9 i# x; C, T0 ]4 _& a
  72.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    ! D# G% q  j# u. q/ C: Y
  73.         CH455_SDA_SET;1 s) N, X: i' o3 O
  74.         HAL_Delay(10);
    7 `* w* ?7 \6 e$ G% h2 q3 L
  75.         CH455_SCL_SET;  // 接收应答
    " s3 o: e: u  T$ n. c' Q5 S3 P8 P# ?
  76.         HAL_Delay(10);) n( T4 }2 B" c5 ]& L
  77.         CH455_SCL_CLR;) f* I8 D8 y. ^; k1 k% O5 o9 g
  78. }! U. C8 X+ Z5 ^8 |! n) D

  79. 4 \, n/ J  w. ?& m
  80. uint8_t  CH455_I2c_RdByte( void )                //读一个字节数据
    % m# Y0 x7 |. r; q
  81. {
    # a$ K  L" O" L2 r
  82.         uint8_t dat,i;
    9 ~) @  y0 |% l2 ]4 U/ V
  83.         CH455_SDA_SET;
    $ L7 ^5 y4 _' Y
  84.         CH455_SDA_D_IN();   /* 设置SDA为输入方向 */
    ; K8 j+ C" \6 h- ]# ^$ Y. [
  85.         dat = 0;. [8 b1 Z# o" }
  86.         for( i = 0; i != 8; i++ )  // 输入8位数据$ A' r" `6 o2 r. T" a
  87.         {
    % c4 V, h4 [: ^1 }- l4 @4 A
  88.                 HAL_Delay(10);  // 可选延时' N) i, m' N, A8 o+ V
  89.                 CH455_SCL_SET;0 R0 X' I( ~' W$ y* m  k
  90.                 HAL_Delay(10);  // 可选延时# p1 }- R( P, R. h2 V4 k  C" i
  91.                 dat <<= 1;
    : ?5 _/ L; A; o$ }
  92.                 if( CH455_SDA_IN ) dat++;  // 输入1位
    ) ^: y' n" C; h8 B- M/ C" [
  93.                 CH455_SCL_CLR;
    7 d& Y- G+ B2 L, j& t- \
  94.         }
    : C3 O0 m+ h$ G* X+ @: u
  95.         CH455_SDA_SET;/ }  H0 \1 ]! Q9 a, v* H
  96.         HAL_Delay(10);
    . R8 V# |+ J! G# E4 U
  97.         CH455_SCL_SET;  // 发出无效应答8 h7 T0 R0 T( Z
  98.         HAL_Delay(10);& R1 _8 ^5 P' H: F5 N
  99.         CH455_SCL_CLR;4 }. ~; E$ W' U2 }! J. P- R
  100.         return dat;9 ?  J. n) g  V: z8 u
  101. }
    5 y1 O  @2 w- F5 w8 W9 V' w, W
  102. / @( [- d3 P$ y  M, H+ j
  103. void CH455_Write( uint16_t cmd )        //写命令& w( p! f+ s5 P
  104. {
    4 W3 z; \8 R9 N, F  f
  105.         CH455_I2c_Start();               //启动总线4 b# P9 d3 ^% B# b' x+ o
  106.   CH455_I2c_WrByte(((uint8_t)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);5 V+ x& }0 P  `+ S
  107.   CH455_I2c_WrByte((uint8_t)cmd);               //发送数据# x% E. T0 o3 x' @0 o; P+ P
  108.   CH455_I2c_Stop();                 //结束总线 ; E& w* r2 g8 \& j, g
  109. }
    " Y- H5 g9 i% \" g. Y6 g. H& y; o
  110.   I. H7 F: z. ?
  111. uint8_t CH455_Read( void )                //读取按键
    * N$ M4 t0 Q' ?) ]) _3 p+ H$ A
  112. {' k$ d" a/ \* t( y: Z
  113.         uint8_t keycode;5 c1 G8 R0 C: j
  114.            CH455_I2c_Start();                //启动总线
    " W6 v) x: z% h/ r9 K
  115.            CH455_I2c_WrByte((uint8_t)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);
    1 X: `5 L( C- ?! ?. C2 l
  116.            keycode=CH455_I2c_RdByte();      //读取数据; {, x2 I+ r2 ~- t/ O& H) r
  117.         CH455_I2c_Stop();                //结束总线
    ' y% h; I/ a: X3 I* ^
  118.         return keycode;
    6 W6 Q# D; R/ \) ~& T0 ~, b
  119. }
复制代码
- m4 t( i5 T( |; m

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


1 L$ c" F) D" t' w* x) |  D% m

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

  l) N3 W( t- Q5 r
收藏 评论0 发布时间:2020-9-30 09:30

举报

0个回答

所属标签

相似分享

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