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

【经验之谈】基于STM32F103实现TM1640点亮16位共阴极数码管,显示“0~F”数字的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-8 16:00

本节我们目标是实现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, B/ t' f' z* u/ u, a) y

管脚定义:) A. ~0 _' s+ X! n+ A2 J6 ~5 y7 `

file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028215534932.png?lastModify=1667127310

管脚功能定义:

) h5 K. a1 F# ?9 C9 S

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;


) l; f; c! R6 G4 M

接口说明

微处理器的数据通过两线总线接口和 TM1640 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号必须保持不变;只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位在后传输.数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平变为高电平。指令数据传输过程如下图:


- u, v( n$ r; J  q
' m8 c' Y! u: e7 Z  s$ u
: a2 n0 u5 Y( t5 ~9 b5 w$ _, y

file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028221751517.png?lastModify=1667127310

这里我们使用写 SRAM 数据地址自动加  1 模式:


" z" u3 t  x. x' B

Command1:设置数据;

Command2:设置地址;

data1~N:传输显示数据(最多 16 字节,不能多写);

Command3:控制显示;

9 d8 ^* [2 [+ M) G6 |0 \/ S' ?

数据指令

指令用来设置显示模式和LED 驱动器的状态。在指令START有效后由DIN输入的第一个字节作为一条指令。经过译码,取最高B7、B6两位比特位以区别不同的指令。

file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222030939.png?lastModify=1667127310

数据命令设置:

4 q( j7 N3 H1 l, E; K

地址命令设置:

file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222201843.png?lastModify=1667127310

上电时,地址默认设为C0H。显示数据与芯片管脚以及显示地址之间的对应关系如下表所示:


" t% C7 C! w% |: n

file:///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,设置为开漏极输出,如下:


; m1 E3 `3 U' p2 i1 {& N

    2 [$ s7 X+ T$ t
    % X8 s/ C* T1 G2 M2 \3 u7 O
    $ q! ?: D. I- D- h: `0 x) J
  • void MX_GPIO_Init(void)) {2 \4 C) G( L8 c$ D2 }$ I! C
  • {' T& j9 `7 B6 V; b4 `+ U

  • ) G& ]3 z5 f7 S( j2 c
  • GPIO_InitTypeDef GPIO_InitStruct = {0};
    6 J3 t+ U6 [1 r+ K9 U. D& W. x

  • : @+ F! U7 x$ i: T& O& h
  • /* GPIO Ports Clock Enable */& k  D. `/ ]& y8 ]
  • __HAL_RCC_GPIOD_CLK_ENABLE();. @0 w7 c, ~" K  z
  • __HAL_RCC_GPIOA_CLK_ENABLE();
    - v; f. c% G7 l/ Q8 ]+ M( Z9 }
  • __HAL_RCC_GPIOB_CLK_ENABLE();6 P0 _# T$ x4 @3 I8 O' D
  • 2 o; w* N! i6 O' M
  • /*Configure GPIO pin Output Level */. K" m) b. w7 j! v4 k- i& }
  • HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
    % y$ C7 y# M6 X6 ?( p& I
  • $ A* F" ^1 O) n+ P* B- l8 ?
    + S7 z" o# `0 D' _0 M" }' f
  • /*Configure GPIO pins : PB6 PB7 */
    % n) S) P& ?) r8 N, d
  • GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;( }: p9 x- Y* ]. Y0 \' I2 ]" c/ h
  • GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    " {' d7 T; o+ M; f" H1 j- A9 f
  •   GPIO_InitStruct.Pull = GPIO_NOPULL;
    " P5 A: h7 M* u* {+ U. R9 a
  •   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    ; Z- t6 Y# O; R' R/ y8 b1 K( h, `
  • HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    , Z+ e$ ]: ~# b% O1 e
  • + L- k1 x; K. Z5 U
  • }* y5 m) d& p' ]: ^2 ~

$ Y% F6 Y& k. K$ f  J9 Y, |) b+ q" S# w8 B5 i

. T) ]3 V1 e( u2 j2 C  v: O接着设置TM1640,并写入段码

    : h2 l& ^* _6 R; v6 N' {
  • void TM1640_Handle(void)( w6 }, ?) W0 j0 P3 c3 H
  • }
  • u8 i;
    . z7 C* I4 m! I
  •   TM1640_Generate_START();
  • TM1640_WriteData(0x40);//数据命令设置:普通模式,地址自动加一
    $ y$ K8 Z$ u* b6 p$ `* j9 M
  • TM1640_Generate_STOP();
    7 N8 p' Z- U; y( p, R! h
  • TM1640_Generate_START();
    9 _9 C- d4 o( p; C: v" o: w
  • TM1640_WriteData(0xC0);地址命令设置:初始地址00H
    7 o7 x( @( I" q! Q
  • for(i=0;i<16;i++)  //发送16位显示数据
    % v4 S" R# e/ I# q5 _, X
  • {
    + _4 Y7 \2 A1 U, F" y  V
  •   TM1640_WriteData(CODE);3 b$ B2 s2 M4 u
  •   }' ]# B, K/ `% R# `) b) e: c
  • TM1640_Generate_STOP();
  • TM1640_Generate_START();5 E- S9 l+ ~" i7 b/ B  }- G
  • TM1640_WriteData(0x8c);    //显示控制:显示开,脉冲宽度设为11/16- ]# l0 I  Q& Q7 g* V+ \% k8 U
  • TM1640_Generate_STOP();
    ) F3 P& k; r) g$ d8 }
  •   delay_ms(10);. ~, t  g" A2 M- }/ o; R- o' Y: U1 ^

  • 2 B* r3 y$ g# n& H+ |
  • }
    * s+ g" _# o2 l" q# `) W9 N. d; O+ |2 M* S3 g! ~5 k( d7 w

    # E" w7 W( \- R, t$ S. i

    . K- E2 g2 c2 e

0 |' ~% H9 |" a( A# V. e/ I) G' Y3 S  }" E
, l  q5 v2 }5 C7 X5 _7 M% Z) ^
其中,0 O2 M1 w+ B  x& W# @
TM1640_WriteData(0x40);是Command1数据命令设置,普通模式,地址自动加一;  E% m( l$ f; b# j& f$ t1 f- I
TM1640_WriteData(0xC0);是Command2地址命令设置,初始地址00H;
7 Y9 a5 Z, F$ h$ E3 J# NTM1640_WriteData(CODE);是传输显示数据(最多 16 字节,不能多写);
! I% h7 `# T2 u4 HTM1640_WriteData(0x8c);是Command3控制显示:显示开,脉冲宽度设为11/16, b/ L; p" H' d( _

# z9 F7 a, S& d) t) l: w

3 下载验证

显示"0~F";5 p& `" H/ X, O% g


! n- ]- U: i8 V

/ s% X' @  M" I7 z
---------------------: }  ?' n* Z/ l# m6 W* P
作者:lilijin1995


# b- p' Z/ P6 p; d' ~% `
# I& g$ \( D" _( v; T- ]6 t7 G
赞 收藏 评论0 发布时间:2022-12-8 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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