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

【经验分享】STM32或GD32驱动TM1637

[复制链接]
STMCU小助手 发布时间:2022-4-20 20:40
一、TM1637介绍
( m' A- L- T6 i! T' s- ATM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于电磁炉、微波炉及小家电产品的显示屏驱动。采用DIP/SOP20的封装形式。
  c$ C3 a  c% [: N& ?功能特点:
+ {  y+ F+ ]: A5 J   采用功率CMOS 工艺
( G$ L4 X& ]3 k- e6 Y/ v   显示模式(8 段×6 位),支持共阳数码管输出/ i3 }/ s4 v( z
   键扫描(8×2bit),增强型抗干扰按键识别电路
1 `3 w$ `" b% D+ g   辉度调节电路(占空比 8 级可调)
' ~2 |$ e! X1 o( S9 g+ e   两线串行接口(CLK,DIO)  振荡方式:内置RC 振荡4 _; D& o. |) m! z7 y
   内置上电复位电路
. K) q" m( s1 G  y   内置自动消隐电路
( J0 s% V$ ?6 C) m" H* f+ ]: ~   封装形式:DIP20/SOP20' a6 L- `$ \8 g7 _7 m
二、时序介绍( j1 |0 W9 B' y" Y: T; u- v

" F3 S* j3 [+ O6 _( P* k" n
$EX7KA)6U0P11OYC_M@IY`U.png 8 N6 B$ S' {3 O% S% m
PIX0(BP@`BMW7G(8DBEF3VV.png
0 W8 ]' r' ]- w" @3 S
1 t! M5 P& o: D/ R0 v; u7 t三、寄存器介绍1 C  w( ]1 E' L& L+ U7 E
( `" p' Y4 s# E/ f
20210616151702141.png
5 U7 v0 W+ U( p- ?8 Y9 m
: U5 }9 v  @' t& D: w四、驱动程序, v6 g3 e- q' G4 v7 p% p
main.c! O7 Q* r1 n( M2 v! k7 `

2 r. Z! y5 c8 C0 {" N1 I. |
  1. #include "sys.h"& }4 k2 }; e) t. I" o8 r+ e1 `9 h
  2. #include "usart.h"
    7 m6 e! U! O) `  A, r% w" U* j$ ?3 f
  3. #include "delay.h"" j* O8 D8 B  o' B- y7 y! K
  4. #include "led.h"* s* Q  J& G3 s; \8 N
  5. #include "tm1637.h"
    & ?' [; a4 s! j6 |$ O5 w, G
  6. #include "string.h"
    & K  b6 m# t$ T
  7. ; e5 C' y8 k  X( o2 Z
  8. int main(void)
    ' L  t7 h9 _8 S  U
  9. {
    ; D7 [9 z, D' S+ J
  10. u8 sendData[6];3 {+ Y9 r% I3 t! U
  11. Cache_Enable();                                        //打开L1-Cache
    ) S" S3 S2 j' @- j( Y" Z7 |9 j/ @
  12. HAL_Init();                                                //初始化HAL库, E0 c4 O% c  {7 K/ X/ |
  13. Stm32_Clock_Init(160,5,2,4);        //设置时钟,400Mhz  Y$ `6 X5 t2 }# B7 T4 f0 t' ?
  14. delay_init(400);                                //延时初始化
    8 T7 k& {; L" \
  15. uart_init(115200);                                //串口初始化
    " ?9 L" o3 ^& i1 U! l+ l
  16. led_init();                                                //初始化LED时钟4 W+ c/ }7 ?% u1 l: H2 d/ ?
  17. tm1637_init();) Z! J- Z& j$ @2 O) i% V  I
  18. while(1)0 F7 ?5 ?( m/ E
  19. {
    . @7 h0 U1 l' N& w

  20. . V/ a! k; b( x
  21.         turn_g_led();
    / S+ Z4 Q9 I3 }4 j  O6 e* K( j" e
  22.         memset(sendData,0xff,sizeof(sendData));6 Y1 D5 ?4 {  u# V6 z4 Q
  23.         tm1637_show_data(sendData,sizeof(sendData));
    7 F4 t. x' D5 W0 c/ Y
  24.         delay_ms(500);+ S( w( a2 V$ Y- v$ K

  25. . Y& S& v# T: J, J
  26.         turn_g_led();
    0 N8 \" W, f. @. d, |! R
  27.         memset(sendData,0x00,sizeof(sendData));0 ]1 U, z/ J( u/ W
  28.         tm1637_show_data(sendData,sizeof(sendData));6 o7 Y$ j8 Y* R3 e
  29.         delay_ms(500);' }; ?/ e; c* z5 D8 j
  30.         printf("key=0x%02x\r\n",tm1637_read_key());4 x4 I4 p% c" c& z
  31. }2 v0 f+ N9 v% x6 D; j; R# R) S4 J% f( z
  32. }
复制代码
# s! i5 p  F* Y/ W
tm1637.c( R* G, V4 W8 g" r5 D. v% e9 M  B
( Q" Y0 K- `! m7 M
  1. #include "tm1637.h"7 m# n, S  Q+ D) ?# T# m
  2. #include "delay.h"
    & K# d: _0 [  p( `2 u( x% Y* T

  3. " ?% j: n- F# K& n- P
  4. void tm1637_init(void)
    # t$ h' c8 ^( u) W/ m
  5. {4 c  r  A. a6 y, d
  6. GPIO_InitTypeDef GPIO_Initure;
    ' c. R: O4 Y7 `$ i! f9 ?! c/ x
  7. __HAL_RCC_GPIOC_CLK_ENABLE();                                        //开启GPIOB时钟
    + n  D. b8 [7 m# K  `' v- v  y
  8. $ \8 x2 l1 ~1 s* v( d6 M/ j/ ~
  9. GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8;                        //PB0,14 o6 o% Y6 b9 i4 m. g* a8 X) W
  10. GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;                  //推挽输出
    / A- N8 ]" P8 c, Z6 U  I
  11. GPIO_Initure.Pull=GPIO_PULLUP;                                 //上拉
    3 r' p" d6 G5 W4 y. \. [
  12. GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;          //高速
    $ u' f7 D+ T) l( W0 u
  13. HAL_GPIO_Init(GPIOC,&GPIO_Initure);                     //初始化GPIOB.0和GPIOB.18 `9 C8 Q) [. u3 i9 B9 j8 ^2 K
  14. ! _: ~/ H4 ]  G" }  Q
  15. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);        //PB0置0
    1 K$ @3 }  n6 ^) j: y& p& v: _
  16. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);        //PB1置1
    & B% e1 ?8 r* X; @
  17.   g8 k* \4 }: ?4 S  N1 {- B; {

  18. $ f& {. a5 @# M4 W
  19. GPIO_Initure.Pin=GPIO_PIN_6;            //PA0
    ' z7 I' D! D( z& ?
  20. GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
    / F6 t" d$ {" I$ l
  21. GPIO_Initure.Pull=GPIO_PULLUP;        //上拉, Z2 ^( b$ r$ h" H) l% M
  22. GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;     //高速
    ; ^9 P" j$ w% i  w4 [
  23. HAL_GPIO_Init(GPIOC,&GPIO_Initure);5 Z+ D' Z$ i  Z; k
  24. }' h; E4 J+ H2 U- `" y* G% K

  25. ( N, ^( L( F) N  y
  26. //产生IIC起始信号
    2 o% p5 [; b6 k& \
  27. void tm1637_start(void)& q- }( j% G4 e2 I9 Q& i" S6 K
  28. {/ }( w, ]. _% p4 v
  29. DIO_OUT();     //sda线输出# P% l5 C9 M. R$ J; M+ Z: G/ b- J
  30. led_dio(1);
    1 e0 o! d3 {3 l3 i
  31. led_clk(1);& I4 O" q2 s; H8 ~
  32. delay_us(4);
    1 |7 ]% v& b' _
  33. led_dio(0);//START:when CLK is high,DATA change form high to low
    " Y, I$ f0 {9 _5 r$ y7 |
  34. delay_us(4);
    # j* ?+ t! C6 }: m/ B/ N
  35. led_clk(0);//钳住I2C总线,准备发送或接收数据6 f9 T# W$ H/ x9 H4 _; ~( C, Y
  36. }9 X  |  Z" b( l9 l. w1 M$ y' m+ g
  37. //产生IIC停止信号. N; A. }8 h  Q% _/ W: z
  38. void tm1637_stop(void)' w0 Y: [* [# X) S( f
  39. {
    , z/ w1 |3 m6 ]/ S" Z/ i" K( _
  40. DIO_OUT();//sda线输出* _0 o- d* I% O" n" _  p2 C
  41. led_clk(0);
    - G) ^5 T, W! f- ~% U
  42. led_dio(0);//STOP:when CLK is high DATA change form low to high9 p4 |  D$ P$ z
  43. delay_us(4);
    & _' z3 X* z+ l# w0 y9 c& G/ O
  44. led_clk(1);8 Z$ y- R4 b( y" Y6 U+ `2 I. V
  45. led_dio(1);//发送I2C总线结束信号( L; A. o9 l* y5 a0 T
  46. delay_us(4);                                                           $ P+ W% `- |: _* M! ]
  47. }3 A; u4 h% W7 Z4 O
  48. //等待应答信号到来& g$ z/ S' s- W) B0 ^
  49. //返回值:1,接收应答失败
    1 q0 C6 k! e5 I; t0 N# u# _4 _( I' c
  50. //        0,接收应答成功
    $ l0 s6 u9 P  p- ?
  51. u8 tm1637_wait_ack(void)
    5 r+ i( V( f9 P9 Y
  52. {! y/ O8 P( r' s4 }7 z3 h
  53. u8 ucErrTime=0;
    ! O2 f! y! Z" x, |
  54. DIO_IN();      //SDA设置为输入: d2 h, R3 r/ G4 ], [( x& g, u# I
  55. led_dio(1);delay_us(1);; W' T/ {3 `. y. z) B: l9 A
  56. led_clk(1);delay_us(1);. s/ _' I' F- h3 L
  57. while(READ_DIO)* o3 f: y+ R8 F. ^- \
  58. {$ r9 h' N/ w# Z- i# w; Q6 n
  59. ucErrTime++;; A- F- `1 v- W* ~4 ~0 i1 j
  60. if(ucErrTime>250)/ d8 L9 W3 u! M$ k2 E
  61. {# y9 |+ f7 P1 S
  62. tm1637_stop();
    - ~+ ~' q/ J% A7 v3 X. s5 F
  63. return 1;
    4 z0 x2 ?3 w$ f0 f
  64. }
    0 s0 G4 E) S# k6 o9 E: e
  65. }
    ; a) I) O7 f; d" m5 @
  66. led_clk(0);//时钟输出0
    ) @# H) Y3 {* B1 v9 ]% f- k. R
  67. return 0;
    5 E2 ?3 L; O- P4 F" k+ n
  68. }
    , `: T# Y& F( _3 Z
  69. //产生ACK应答* U/ @2 ?: D) x6 `4 i" O( E
  70. void tm1637_ack(void)2 \) |+ `; q+ M: h: P" \1 Z8 V3 W
  71. {
    7 w3 {( S4 L! l: f9 M. J
  72. led_clk(0);
    / L7 k, p; S/ N5 K' H& {
  73. DIO_OUT();
    # T' e. O3 Y1 j8 t& W3 Z( ~
  74. led_dio(0);6 n, t5 E9 j# P2 I4 G
  75. delay_us(2);
    7 n: O) J: C, c* f6 R# @+ S! K
  76. led_clk(1);
    9 J( f. m0 E9 d- w
  77. delay_us(2);
      G' z8 I3 a7 g- w
  78. led_clk(0);
    3 k4 c, p& ?: k3 g) Z7 a
  79. }+ K9 k5 _' M7 S0 y# _# G* @
  80. //不产生ACK应答2 H4 w4 z2 t# \+ [/ p7 ~
  81. void tm1637_nack(void)/ X+ f  W# a+ r
  82. {
    ! y+ s1 J; e$ B& m' C
  83. led_clk(0);
    ) ]+ a2 I, \% V* R' k8 b9 }
  84. DIO_OUT();
    . O8 h6 b" q5 a
  85. led_dio(1);$ N* ?" ]; Q0 Z! @& r. u4 h) p
  86. delay_us(2);
    " C) c* E( _# y* }$ ^7 l- g
  87. led_clk(1);% u1 w2 ?/ y: N7 ~1 r
  88. delay_us(2);
    / [/ r% a4 H3 I! g/ E+ j3 S' i4 X
  89. led_clk(0);# j/ r; d! a- k0 H4 S6 c+ z
  90. }" j% }( q9 ^5 [, |! y9 K
  91. //IIC发送一个字节( Z" e) F" p/ B
  92. //返回从机有无应答4 D/ x7 t6 s: r) _
  93. //1,有应答* x9 S: ?6 m0 I# F) c
  94. //0,无应答
    5 X0 M( L& U8 y4 Y0 @! _
  95. void tm1637_send_byte(u8 txd)) z9 {- W3 r6 V( [' [" Q* @8 W0 ~1 b
  96. {
    " c1 l0 X, n/ [. i  s
  97. u8 t;. V8 C3 r. G5 n6 ^+ X' s
  98. DIO_OUT();
    , q, Q+ `- E  B/ w
  99. led_clk(0);//拉低时钟开始数据传输9 _8 U. t, n$ g6 q' z1 Q
  100. for(t=0;t>=1;
    5 j) `" t% Y! H1 l/ W9 k5 e
  101. delay_us(2);   //对TEA5767这三个延时都是必须的
    / V$ Z- s; h5 j9 X
  102. led_clk(1);% t; {% A9 V5 @6 S
  103. delay_us(2);0 h. h. @7 q- N3 S6 p: [! F+ b
  104. led_clk(0);
    ' k8 i  d3 z1 U
  105. delay_us(2);' r; N  C4 n3 `3 P1 m5 A
  106. }4 R9 }7 p9 j' J  o0 S
  107. }
    ; f" i2 `+ M( i
  108. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
    / f/ a' C0 k$ i8 r& @9 y
  109. u8 tm1637_read_byte(unsigned char ack)
    , ?3 `$ P1 Q3 O( \
  110. {
    4 T. O% z% C% m# b/ S5 v
  111. unsigned char i,receive=0;7 K+ t5 @& {$ Q5 o, I! P
  112. DIO_IN();//SDA设置为输入
    ( F& \) t) P$ }: u
  113. for(i=0;i
复制代码
& k5 L; f5 X& d% M1 j$ q

+ U7 d- E- {7 }$ e! h
赞 收藏 评论0 发布时间:2022-4-20 20:40

举报

0个回答

所属标签

相似技术帖

官网相关资源

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