TM1637
1. TM1637概述
共阳,8段数码管x6个,还有按键扫描,可以调节亮度,串行接口、内置自动消隐电路。
模块图:
2. 管脚定义
可以看出,有两个IO用于串行数据输入/输出。此芯片不仅能够驱动数码管,还能够作为矩阵按键扫描。
3.接口说明
根据手册描述,数据在CLK为低时刻准备好,CLK为高(上升沿)被传输过去,每传输一个字节,在第八个时钟下降沿,1637都会产生一个ACK,会拉低DIO总线。
我使用的是地址自动加1模式,首先空闲状态都为高电平,发送start信号,然后命令,从机ack应答(拉低DIO),接着stop信号。然后start信号,设置地址,从机ack应答,然后data1,ack…,最后stop信号。
4.数据指令
可以看出,这两位是来区分,数据命令或者显示控制命令,或者地址命令的。
1.数据命令设置
0x40为写数据到显示寄存器、自动地址增加
2.地址命令设置
0xC0为第一个数码管显示寄存器地址,下一个地址加一,依次类推。
3.显示控制
脉冲宽度表示这个是控制显示亮度的,可根据自己场景选择。
下面0x88是显示打开!!!
5.四位数码管模块原理图
6.程序驱动
采用固定地址的程序流程图
程序代码
main.c
#include "tm1637.h"
int main(void)
{
tm1637_init(); //数码管初始化
smg_display(2142,0);//显示2142,冒号不显示
while(1)
{
}
}
tm1637.c
#include "tm1637.h"
#include "main.h"
#include "uart.h"
#include <stdio.h>
#include <string.h>
#include "retarget.h"
//段码表
const uint8_t num_tab[] =
{
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F, :(数码管中间那两点)
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x80
};
//显示缓冲区,要准备显示的段码值,从左到右
uint8_t show_buffer[4] = {
0};
/**
* @brief: tm1637初始化
* @param: void
* @return: none
*/
void tm1637_init(void)
{
GPIO_InitTypeDef tm1637_gpio_init;
TM1637_CLK_GPIO_CLK_ENABLE(