基于过程单片机CH32、STM32实现TM1640点亮16位共阴极数码管,显示“0~F”数字
TM1640入门学习手册
实例1 EgTM1640——【基于CH32V103】
本节我们目标是实现TM1640点亮16位共阴极数码管,显示“0~F”数字;
1 硬件设计
GPIO初始化配置 SCL(PB6) SDA(PB7);开漏输出,通过IO模拟驱动TM1640,TM1640IC驱动有点类似于I2C;
2 软件设计
首先是TM1640初始化TM1640_GPIO_INIT,设置为开漏极输出,如下:
/*********************************************************************
* @fn TM1640_GPIO_INIT
*
* @brief Initializes GPIOB.6 GPIOB.7
*
* @return none
*/
void TM1640_GPIO_INIT(void) {
GPIO_InitTypeDef GPIO_InitStructure = { 0 };
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_6);//SCL
GPIO_SetBits(GPIOB, GPIO_Pin_7);//SDA
}
接着设置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[i]);
}
TM1640_Generate_STOP();
TM1640_Generate_START();
TM1640_WriteData(0x8c); //显示控制:显示开,脉冲宽度设为11/16
TM1640_Generate_STOP();
Delay_Ms(10);
}
3 下载验证
显示"0~F";
实例2 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
管脚定义:
管脚功能定义:
逻辑电源电压 为5V,SEG 脚驱动拉电流(VDD = 4.5~ 5.5 V、Vo = 0V)为90mA;GRID脚驱动灌电流200 mA;最大时钟频率为1MHz;
接口说明
微处理器的数据通过两线总线接口和 TM1640 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号必须保持不变;只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变。数据的输入总是低位在前,高位在后传输.数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平变为高电平。
指令数据传输过程如下图:
这里我们使用写 SRAM 数据地址自动加 1 模式:
Command1:设置数据
Command2:设置地址
data1~N:传输显示数据(最多 16 字节,不能多写)
Command3:控制显示
数据指令
指令用来设置显示模式和LED 驱动器的状态。
在指令START有效后由DIN输入的第一个字节作为一条指令。经过译码,取最高B7、B6两位比特位以区别
不同的指令。
数据 命令设置:
地址命令设置:
上电时,地址默认设为C0H。
显示数据与芯片管脚以及显示地址之间的对应关系如下表所示:
显示控制 命令
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[i]);
}
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[i]);是传输显示数据(最多 16 字节,不能多写);
TM1640_WriteData(0x8c);是Command3控制显示:显示开,脉冲宽度设为11/16
3 下载验证
显示"0~F";
4 入门视频
TM1640驱动原理介绍以及基于STM32F103实现TM1640控制点亮16位共阴极数码管
https://www.bilibili.com/video/BV1yD4y1b7b1/?vd_source=2bbde87de845d5220b1d8ba075c12fb0