发新帖本帖赏金 10.00元(功能说明)我要提问
12下一页
返回列表
打印
[STM32F1]

基于STM32F103实现TM1640点亮16位共阴极数码管,显示“0~F”数字

[复制链接]
2309|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lilijin1995 于 2022-10-30 19:18 编辑

#申请原创#@21小跑堂




EgTM1640——【基于STM32F103】
本节我们目标是实现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

管脚定义:

file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028215534932.png?lastModify=1667127310
管脚功能定义:


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;

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


file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028221751517.png?lastModify=1667127310
这里我们使用写 SRAM 数据地址自动加  1 模式:
Command1:设置数据;
Command2:设置地址;
data1~N:传输显示数据(最多 16 字节,不能多写);
Command3:控制显示;

数据指令
指令用来设置显示模式和LED 驱动器的状态。在指令START有效后由DIN输入的第一个字节作为一条指令。经过译码,取最高B7、B6两位比特位以区别不同的指令。
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222030939.png?lastModify=1667127310


数据命令设置:

地址命令设置:
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221028222201843.png?lastModify=1667127310

上电时,地址默认设为C0H。显示数据与芯片管脚以及显示地址之间的对应关系如下表所示:
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,设置为开漏极输出,如下:

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);

  /*Configure GPIO pins : PB6 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

接着设置TM1640,并写入段码

void TM1640_Handle(void)
{
    u8 i;
    TM1640_Generate_START();
    TM1640_WriteData(0x40);//数据命令设置:普通模式,地址自动加一
    TM1640_Generate_STOP();

    TM1640_Generate_START();
    TM1640_WriteData(0xC0);////地址命令设置:初始地址00H
    for(i=0;i<16;i++)  //发送16位显示数据
    {
        TM1640_WriteData(CODE);
    }
    TM1640_Generate_STOP();

    TM1640_Generate_START();
    TM1640_WriteData(0x8c);    //显示控制:显示开,脉冲宽度设为11/16
    TM1640_Generate_STOP();
    delay_ms(10);

}

其中,
TM1640_WriteData(0x40);是Command1数据命令设置,普通模式,地址自动加一;
TM1640_WriteData(0xC0);是Command2地址命令设置,初始地址00H;
TM1640_WriteData(CODE);是传输显示数据(最多 16 字节,不能多写);
TM1640_WriteData(0x8c);是Command3控制显示:显示开,脉冲宽度设为11/16

3 下载验证
显示"0~F";

4 入门视频教程【TM1640驱动数码管】TM1640驱动原理介绍以及基于STM32F103实现TM1640控制点亮16位共阴极数码管】





使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2022-10-31
理由:恭喜通过原创审核,期待您更多的作品~

沙发
benjaminka| | 2022-11-19 16:00 | 只看该作者
这个是不是不需要动态刷新数码管了呢?

使用特权

评论回复
板凳
benjaminka| | 2022-11-20 13:45 | 只看该作者
tm1640需要接限流电阻吗?

使用特权

评论回复
地板
ingramward| | 2022-11-23 23:22 | 只看该作者
TM1640B和TM1628A一样吗?      

使用特权

评论回复
5
lilijin1995|  楼主 | 2022-11-24 02:32 | 只看该作者
ingramward 发表于 2022-11-23 23:22
TM1640B和TM1628A一样吗?

不要问这种问题,一不一样你去官网下个规格书看下啊

使用特权

评论回复
6
lilijin1995|  楼主 | 2022-11-24 02:33 | 只看该作者
benjaminka 发表于 2022-11-20 13:45
tm1640需要接限流电阻吗?

不需要,按参考原理图

使用特权

评论回复
7
lilijin1995|  楼主 | 2022-11-24 02:34 | 只看该作者
benjaminka 发表于 2022-11-19 16:00
这个是不是不需要动态刷新数码管了呢?

芯片内置扫描电路吧

使用特权

评论回复
8
wuhaishou| | 2022-12-14 20:17 | 只看该作者
能介绍下为什么引脚6和7要设置开漏模式吗,我遇到的问题是:用arduino控制万年历数码管,2个TM1640各控制9个1.2寸大数码管,需要的电流可能更多才能足够亮,但目前程序运行正常,可是亮度却只能设置成4级(0-7),用的TM16XX-1640库,查找发现对应的4级好像是0x8c,可以降低亮度,但超过4级第二个TM1640就不显示。
我这是仿制的,原版万年历同样数码管用的BS003F3P6芯片却控制的2个TM1640非常亮
大神给看看可能出现的问题在哪里

使用特权

评论回复
9
lilijin1995|  楼主 | 2022-12-15 09:22 | 只看该作者
wuhaishou 发表于 2022-12-14 20:17
能介绍下为什么引脚6和7要设置开漏模式吗,我遇到的问题是:用arduino控制万年历数码管,2个TM1640各控制9 ...


官网有技术支持

使用特权

评论回复
10
Bowclad| | 2022-12-15 11:09 | 只看该作者
tm1640不用接限流电阻

使用特权

评论回复
11
usysm| | 2022-12-15 11:43 | 只看该作者
为什么不使用oled呢?              

使用特权

评论回复
12
belindagraham| | 2022-12-15 13:04 | 只看该作者
显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。

使用特权

评论回复
13
modesty3jonah| | 2022-12-15 16:33 | 只看该作者
16段共阴极数码管如何编码?  

使用特权

评论回复
14
wangdezhi| | 2022-12-15 20:12 | 只看该作者
一般数据显示比较多的时候都用液晶显示吧。

使用特权

评论回复
15
robincotton| | 2022-12-15 22:22 | 只看该作者
TM1650只能驱动共阴数码管

使用特权

评论回复
16
belindagraham| | 2022-12-16 22:27 | 只看该作者
共阴极数码管小数点怎么显示   

使用特权

评论回复
17
febgxu| | 2022-12-16 23:45 | 只看该作者
数码管显示的内容有限,而且显示比较麻烦

使用特权

评论回复
18
sesefadou| | 2022-12-17 12:27 | 只看该作者
TM1640最多可以驱动16位共阴数码管吧

使用特权

评论回复
19
pl202| | 2022-12-17 13:46 | 只看该作者
数码管扫描芯片,非常好用。              

使用特权

评论回复
20
fengm| | 2022-12-17 15:34 | 只看该作者
比hc595好用多了。              

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

162

帖子

7

粉丝