TM1640驱动代码解析指南:从原理到实践应用,零基础入门STM32进阶教程第四十六步

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

师从洋桃电子,杜洋老师


📑文章目录

  • 一、TM1640芯片概述
  • 二、驱动代码结构分析
  • 2.1 代码模块结构图
  • 2.2 核心代码模块说明
  • 2.2.1 底层通信协议
  • 2.2.2 初始化配置
  • 2.2.3 显示控制函数
  • 2.2.4 LED流水灯实现
  • 三、关键数据结构解析
  • 四、开发注意事项
  • 五、典型应用场景
  • 六、相关资源

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


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

    (图2:TM1640数码管实现示意图)


    一、TM1640芯片概述

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

  • 支持7×8段(数码管)或16×4段(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显示程序


    三、关键数据结构解析

    段码对照表

    序号 段码值 对应显示
    0 0x3F 0
    1 0x06 1
    10 0xbF 0.
    19 0xeF 9.
    20 0x00 全灭

    四、开发注意事项

    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)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » TM1640驱动代码解析指南:从原理到实践应用,零基础入门STM32进阶教程第四十六步

    发表回复