本节我们目标是实现TM1640点亮16位共阴极数码管,显示“0~F”数字; 1. 硬件设计 GPIO初始化配置 SCL(PB6) SDA(PB7);开漏输出,通过IO模拟驱动TM1640,TM1640IC驱动有点类似于I2C; TM1640概述 TM1640 是一种LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。本产品性能优良,质量可靠。主要应用于电子产品LED显示屏驱动。采用SOP28、SSOP28的封装形式。 特性说明 - 采用CMOS工艺
- 显示模式(8 段×16 位)
- 辉度调节电路(占空比 8 级可调)
- 两线串行接口(SCLK,DIN)
- 振荡方式:内置RC振荡
- 内置上电复位电路
- 封装形式:SOP28、SSOP28
+ H9 p$ A+ T7 M, i: m. N
管脚定义:7 ~3 f8 x6 B3 [1 C$ m$ y
 file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028215534932.png?lastModify=1667127310 管脚功能定义: & g( G4 c$ |0 h# P0 y
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028215737311.png?lastModify=1667127310 逻辑电源电压 为5V,SEG 脚驱动拉电流(VDD = 4.5~ 5.5 V、Vo = 0V)为90mA;GRID脚驱动灌电流200 mA;最大时钟频率为1MHz; . K0 [' g7 k2 K+ N4 w; O! |
接口说明 微处理器的数据通过两线总线接口和 TM1640 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号必须保持不变;只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位在后传输.数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平变为高电平。指令数据传输过程如下图: . K( ]( }8 Z& F. R4 `& F3 W
3 ~! l4 s6 t# G% T. Q
0 t8 c9 U6 W8 R
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028221751517.png?lastModify=1667127310 这里我们使用写 SRAM 数据地址自动加 1 模式: / M: ^- o( b( v( a2 n2 U3 @
Command1:设置数据; Command2:设置地址; data1~N:传输显示数据(最多 16 字节,不能多写); Command3:控制显示;
* Y' ?, n# y1 f+ e9 I( d5 T* I数据指令 指令用来设置显示模式和LED 驱动器的状态。在指令START有效后由DIN输入的第一个字节作为一条指令。经过译码,取最高B7、B6两位比特位以区别不同的指令。 file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222030939.png?lastModify=1667127310 
数据命令设置:  $ u: L! H9 r8 ]3 I9 Z2 t
地址命令设置: 
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222201843.png?lastModify=1667127310 上电时,地址默认设为C0H。显示数据与芯片管脚以及显示地址之间的对应关系如下表所示:
$ p9 z) d7 d# T! h6 G- pfile:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222246762.png?lastModify=1667127310 显示控制命令 
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222344305.png?lastModify=1667127310 2 软件设计 首先是TM1640初始化MX_GPIO_Init,设置为开漏极输出,如下:
. Y' h9 E3 s. M# ]& \4 ]8 C$ q! a* n, _, Y
/ a: \! _, `% Z6 n3 S; I
; D. x% x+ |4 X# ~" w/ J- void MX_GPIO_Init(void)' N; d1 M$ d q& o% |
- {$ ?$ Y! G' h2 l0 V5 a3 i. e7 I
- + R4 E$ e# ` K5 E3 A) n
- GPIO_InitTypeDef GPIO_InitStruct = {0};
# q3 ?6 { ~, e" j7 n" E/ G - : O u# `& Q% l! d0 l! c7 h
- /* GPIO Ports Clock Enable */) Y' q; ?, Y( Z3 H- ?
- __HAL_RCC_GPIOD_CLK_ENABLE();. E7 C$ I; s p, ?+ Q# u$ M
- __HAL_RCC_GPIOA_CLK_ENABLE();
6 f3 j! V2 @ ]( T+ M) ~8 E p - __HAL_RCC_GPIOB_CLK_ENABLE();1 m8 Q! O3 }5 Q+ w
- ' S( S! x( J, y0 a0 o
- /*Configure GPIO pin Output Level */
' Z/ p( K, l( d' {6 Z& \ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);8 P6 |$ ]; |* P9 j# w& o
2 I7 S! @3 k9 d+ h- l/ |% S% V$ w
5 a3 ?4 V$ ^2 r7 v+ ^- /*Configure GPIO pins : PB6 PB7 */; n$ X7 m: \3 Y
- GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;7 b" S2 P' K3 `
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
* O9 c. z3 }& ? - GPIO_InitStruct.Pull = GPIO_NOPULL;; V: R& x1 { z$ P5 E& ~
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
2 [, ?4 |) {4 b6 C0 x9 D - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);" E9 Y# N8 o6 ?; u& x) x
5 v3 J' N4 N' j1 o% V- }. m2 T; \$ I9 \ B

: b% Z5 K3 x* @! Q0 }- k
" @" v1 o3 D P+ K* @- b& p, P# W) V% L3 }7 ~, l6 I& Q! J
接着设置TM1640,并写入段码
& S S4 a: a5 _+ O9 w- void TM1640_Handle(void)9 H8 E6 r d6 Q- b
- }
- u8 i;
6 Y% v5 i" w* _* f! I - TM1640_Generate_START();
- TM1640_WriteData(0x40);//数据命令设置:普通模式,地址自动加一' j8 ]$ f9 W# e4 u* f. ^4 k" l t
- TM1640_Generate_STOP();1 [4 F( y/ v8 P4 Y% c6 Y
- TM1640_Generate_START();% N/ p3 I2 [% X; O4 s
- TM1640_WriteData(0xC0);地址命令设置:初始地址00H. H2 D7 w4 c* X2 y! N
- for(i=0;i<16;i++) //发送16位显示数据
6 I* I" B# P: A" x) r! l! S - {
2 O2 V2 y) H* u- p - TM1640_WriteData(CODE);6 j& q4 N8 b! D1 Y5 ^; w4 F) y
- }. g5 j$ Z5 c' f' O2 W2 o6 v
- TM1640_Generate_STOP();
- TM1640_Generate_START();7 q6 P+ r' K! k5 i6 Q$ |$ x- h$ O
- TM1640_WriteData(0x8c); //显示控制:显示开,脉冲宽度设为11/16/ ?/ L4 d5 b' s; ^/ E6 Z
- TM1640_Generate_STOP();/ ?* g8 x+ z0 T1 \7 v1 \4 G
- delay_ms(10);
4 l* c# |+ s/ b+ s" Y- R8 p! d - 9 k ?; ^5 m! S8 L& M
- }
1 s& |7 B8 z4 B. `2 s2 Y: U9 o; j4 Y0 a* }& T2 ?# F
: q& Y b- h- R
0 k% u9 ~+ k$ j: ]- v) Y8 r2 z

, N6 q0 ~8 C* N
4 z a, R. C. P( X
8 U. n; B" P+ N其中,4 a# Q8 n4 @# y
TM1640_WriteData(0x40);是Command1数据命令设置,普通模式,地址自动加一;
; P6 \; @- a; @5 N$ [TM1640_WriteData(0xC0);是Command2地址命令设置,初始地址00H;
" n2 ]# D$ w1 o' ]+ vTM1640_WriteData(CODE);是传输显示数据(最多 16 字节,不能多写);
9 @/ z+ @- w/ q0 q8 o& u0 fTM1640_WriteData(0x8c);是Command3控制显示:显示开,脉冲宽度设为11/16 p+ ?! l" r2 D; L8 N
g$ \1 ?6 m9 t3 下载验证 显示"0~F";
- ?+ K/ z: K$ f
8 e }& y9 Y, Q; q L# H* C1 o( Q* G! g t8 q2 H! b
---------------------' P* O5 ]6 j' C# a3 v
作者:lilijin1995 z" N$ |5 z5 c' P; I& V7 @8 X
! E# E) @5 n: a4 n7 j
|