TM1640驱动代码解析:从原理到代码实现 | 零基础入门STM32第四十六步

主题内容教学目的/扩展视频
数码管与8个LED电路原理,跳线设置,手册分析。驱动程序与调用。做触摸设置的RTC时钟项目。

师从洋桃电子,杜洋老师



回顾上期🔍TM1640数码管驱动芯片详解与应用实践 | 零基础入门STM32第四十五步


(图1:TM1640数码管部分连接示意图)
(图2:TM1640数码管实现示意图)

一、TM1640芯片概述

TM1640是一款LED驱动控制芯片,具有以下特性:

  • 支持7x8段(数码管)或16x4段(LED阵列)显示
  • 内置时钟振荡电路
  • 两线式串行接口(DIN、SCLK)
  • 8级亮度调节
  • 两种地址模式:自动增量/固定地址

🔍 TM1640 数据手册


二、驱动代码结构分析

2.1 代码模块结构图

主程序
TM1640初始化
显示控制
LED控制
GPIO配置
通信协议配置
段码转换
地址设置
LED数据移位

2.2 核心代码模块说明

2.2.1 底层通信协议
void TM1640_start(){ //通信时序 启始(基础GPIO操作)(低层)
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1	
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1	
	delay_us(DEL);
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
	delay_us(DEL);
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
	delay_us(DEL);
}
void TM1640_stop(){ //通信时序 结束(基础GPIO操作)(低层)
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1	
	delay_us(DEL);
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1	
	delay_us(DEL);
}
void TM1640_write(u8 date){	//写数据(低层)
	u8 i;
	u8 aa;
	aa=date;
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
	for(i=0;i<8;i++){
		GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
		delay_us(DEL);

		if(aa&0x01){
			GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1	
			delay_us(DEL);
		}else{
			GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
			delay_us(DEL);
		}
		GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1	
		delay_us(DEL);
		aa=aa>>1;
   }
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
}

时序特点

  • 下降沿锁存数据
  • 低位(LSB)先发送
  • 每个时钟周期传输1bit

2.2.2 初始化配置
void TM1640_Init(void){
    // GPIO初始化(略)
    
    TM1640_start();
    TM1640_write(0x44);  // 固定地址模式
    TM1640_stop();
    
    TM1640_start();
    TM1640_write(0x8C);  // 显示开启,亮度等级4
    TM1640_stop();
}

关键配置说明

  • 0x44:固定地址模式(推荐避免显示错位)
  • 0x8C:显示使能 + 亮度设置(值范围0x88-0x8F)

2.2.3 显示控制函数
void TM1640_display(u8 address,u8 date){ //固定地址模式的显示输出
 	const u8 buff[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};//数字0~9及0~9加点显示段码表
    //---------------   0    1    2    3    4    5    6    7    8    9    0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   无   
   TM1640_start();
   TM1640_write(0xC0+address);	         //传显示数据对应的地址
   TM1640_write(buff[date]);				 //传1BYTE显示数据
   TM1640_stop();

地址映射规则

  • 数码管地址范围:0xC0~0xC7(对应8位数码管)
  • LED地址固定为0xC8(控制8个独立LED)

2.2.4 LED流水灯实现
// 主程序中的LED控制逻辑
u8 c = 0x01;
while(1){
    TM1640_led(c);  // 输出LED数据
    c <<= 1;        // 左移实现流水效果
    if(!c) c = 0x01;// 循环复位
    delay(125);
}

移位逻辑说明
• 初始值0x01(二进制00000001)
• 每次左移1位实现LED流动效果
• 0x01 → 0x02 → 0x04 → … → 0x80 → 复位

完整工程代码示例⏬数码管RTC显示程序


三、关键数据结构解析

段码对照表

序号段码值对应显示
00x3F0
10x061
100xbF0.
190xeF9.
200x00全灭

四、开发注意事项

  1. 时序稳定性:调整DEL值确保通信可靠
  2. 地址模式选择
    • 固定地址(0x44):需指定每个显示位置
    • 自动增量(0x40):连续写入多个数据
  3. 亮度调节:根据环境光照选择合适等级(0x88-0x8F)
  4. 段码自定义:修改buff数组实现特殊符号

五、典型应用场景

  1. 电子时钟(如文中RTC时间显示)
  2. 工业仪表显示
  3. LED状态指示面板
  4. 智能家居控制面板

六、相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] 数码管RTC显示程序
[6] TM1640 数据手册


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨旋转编码器原理与驱动,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-05)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值