LED驱动控制芯片开发笔记(TM1637)

TM1637,天微电子的一款LED驱动控制芯片(也就是数码管驱动芯片,数码管这里就不过多废话)。其应用也比较常见,多应用于小家电产品的显示面板、简单测量仪器的显示面板等。

   --a--
  f     b
   --g--
  e     c
   --d--  .h

由于如果使用MCU直接驱动大量数码管,需要大量的GPIO,例如4位数码管其有40个多个像素点,意味着需要40个GPIO资源。对于成本至上的老板是不可能答应的。故TM1637的核心任务是使用MCU有限的GPIO引脚资源,驱动大量段码LED像素点。

这里TM1637采用了多路复用技术,将屏幕在时间上分成四个公共端,这样4COM+10SEG即可驱动40个像素点,再用2个GPIO与MCU通信。这就实现了2个端口控制40个显示单元,节省MCU资源!

更重要的是一块TM1637仅需一块四,批量采购仅需六毛!如果能直接联系到厂商说不定更便宜呢。

1. 关键信息

首先根据芯片手册,我们可以提取到一些关键信息:

  • 通信接口:两线串行接口(CLK、DIO,自定义两线串行协议),注意这里与I2C通信类似,但不完全相同;
  • 驱动能力:采用CMOS工艺,内置功率管,可以直接输出较大电流驱动LED数码管;
  • 显示能力:显示模式(8段×6位,能同时驱动6位数码管),支持共阳数码管;
  • 集成按键:键扫描(8×2bit,SEG线复用为按键扫描线,可以检测最多8×2=16个按键),增强型抗干扰按键识别电路(集成硬件消抖,滤波);
  • 内置上电复位电路,上电复位,通电即可工作;
  • 键扫和现实功能可以同时使用,合理地设计交替调用显示更新函数和按键读取函数即可。

2. 引脚定义

符号 管脚名称 管脚号 说明
DIO 数据输入/输出 17 串行数据输入/输出,输入数据在 SLCK 的低电平变化,在 SCLK 的高电平被传输,每传输一个字节芯片内部都将在第八个时钟下降沿产生一个 ACK
CLK 时钟输入 18 在上升沿输入/输出数据
K1~K2 键扫数据输入 19-20 输入该脚的数据在显示周期结束后被锁存
SG1~SG8 输出(段) 2-9 段输出(也用作键扫描),N 管开漏输出
GRID6~GRID1 输出(位) 10-15 位输出,P 管开漏输出
VDD 逻辑电源 16 5V±10%
GND 逻辑地 1 接系统地

3. 工作原理

3.1. TM1637键扫数据读取原理

键扫矩阵详细查看TM1637数据手册-读扫键章节1

其工作流程大致如下以S1按下为例:

sequenceDiagram
    participant MCU
    participant TM1637
    participant SEG1
    participant K1

    Note over TM1637: 1. 扫描周期开始
    TM1637->>SEG1: 激活SG1(输出低电平)
    Note over K1: 2. 由于S1按下,K1被SG1拉低
    TM1637->>K1: 检测到K1为低电平
    TM1637->>TM1637: 内部编码器工作
    Note over TM1637: 3. 根据"SG1激活 + K1低电平"<br>硬编码: 1110_1111
    MCU->>TM1637: 读取键值
    TM1637->>MCU: 返回 1110_1111

其中

  • 在无按键按下时,读键数据为:1111_1111,低位在前,高位在后。
  • 由于干扰较强,为改善这个问题,TM1637采用负沿触发方式解决误触发现象,即所谓“跳键”现象。
  • 编码中,低4位表示当前有效的SEG线(不过跟它手册里的按键顺序毫无对应关系)。高四位表示SEG线下的K1(1111)、K2(0111)状态。不知道为什么乱序编码,不过至少表中的编码是唯一的。

3.2. TM1637显示寄存器地址和显示模式

这里之前说过,不是同时点亮的。是利用了人眼的“视觉暂留”机制,所以同一时间只有一个数码管被点亮。

TM1637设计了一个显示寄存器(一块内存),通过串口,接收从MCU发来的数据。显示寄存器地址00H-05H共六个显示寄存器,对应六个数码管;每个寄存器又分了高低4位,对应数码管的每一个发光二极管。简单来说,往这个寄存器里写什么数据,GRID控制的数码管就怎么亮。

以GRID1为例,显示流程如下:

sequenceDiagram
    participant MCU
    participant TM1637
    participant DisplayRAM
    participant GRID1

    Note over MCU: 1. 准备显示数据
    MCU->>MCU: 确定GRID1显示数字"5", 查表得段码: 0x6D (0110_1101)

    Note over MCU, TM1637: 2. 设置显示地址,发送显示数据
    MCU->>TM1637: 发送命令: 0xC0 (GRID1地址)
    MCU->>TM1637: 发送数据: 0x6D (数字5段码)

    Note over TM1637, DisplayRAM: 3. 存储到显示寄存器
    TM1637->>DisplayRAM: 将0x6D存入地址0xC0

    Note over TM1637: 4. 动态扫描循环
    loop 每帧扫描
        TM1637->>GRID1: 激活GRID1(输出低电平)
        TM1637->>DisplayRAM: 读取地址0xC0的数据0x6D
        TM1637->>SEG: 根据0x6D输出段信号
        Note over GRID1: GRID1显示数字"5"
        TM1637->>GRID1: 关闭GRID1
        TM1637->>GRID2: 激活GRID2...
    end

注意

  • 扫描一个GRID位的周期:Tdisp=500ms,每一位显示时间:1/16 Tdisp;
  • 键盘扫描在每一轮显示周期结束后进行一次,参考TM1637数据手册-显示和键扫周期章节1

3.3. TM1637两线总线接口

CLK:时钟线;DIO:数据线。

TM1637特性:

  • 总线空闲:数据线 High,时钟线 High;
  • 起始信号:数据线 ↓,时钟线 High;
  • 终止信号:数据线 ↑,时钟线 High;
  • 数据有效:在触发起始条件之后,数据信号需在时钟线为低电平期间变化,在时钟高电平时保持(读取);
  • 应答信号:当数据传输正确时,在第八个时钟的下降沿,芯片内部会产生一个应答信号ACK将DIO管脚拉低,在第九个时钟结束之后释放DIO;
  • 数据低位在先,高位在后;
  • 跟I2C特性很像,差别在于传输的位顺序不一样。而且他没有设备地址的概念,直接命令+数据。

数据写入模式:

  • 指令数据传输模式(读按键数据)
    • start --> command --> ack --> end
    • command:读按键指令;S0、S1、S2、K1、K2 组成按键信息编码,S0、S1、S2 为SGn的编码,K1、K2为K1和K2键的编码,其他位可能是0。
  • 普通模式数据传输模式:
    • start --> command --> ack --> data --> ack --> end
      • Command: 设置地址
      • data:设置数据
  • 写SRAM数据地址自动加1模式:
    • start --> +1modeCommand --> command --> ack --> data --> ack --> data1 --> ack --> end
      • 1modeCommand:设置数据
      • command:设置地址
      • data:显示数据
    • 在+1模式下地址自动+1,方便批量写入。
  • 写SRAM数据固定地址模式:
    • start --> fixModeCommand --> command --> ack --> data --> ack --> command --> ack --> data1 --> ack --> end
      • fixModeCommand:设置数据
      • command:设置地址
      • data:显示数据
    • 没搞清楚跟普通模式有什么区别,// todo 待测试

命令字(8位): 用于设置地址、模式等。

  • [ B7 B6 B5 B4 B3 B2 B1 B0 ] (MSB -> LSB)
    • B7,B6: 功能选择位。
      • 数据命令(00) → 数据写入模式(写LED/读按键、自增或固定)
      • 显示控制(10) → 总体显示状态(开/关、亮度)
      • 地址命令(01) → 写入的具体位置
    • B5,B4: 无关项,填0。
    • 详细控制命令,参考TM1637数据手册-命令控制章节1

4. TM1637应用

4.1. 初始化流程

4.2. 参考代码

常见问题

TM1637在处理多键同时按下时的行为

经过测试,仅返回最后一个按下的编码结果。

参考资料

results matching ""

    No results matching ""