本帖最后由 lilijin1995 于 2022-9-17 17:51 编辑
#申请原创#
@21小跑堂
TM1640 是一种LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。我们目标是实现TM1640点亮16位数码管,显示“0~F”数字;
1 硬件设计GPIO初始化配置 SCL(PB6) SDA(PB7);开漏输出,通过IO模拟驱动TM1640,TM1640IC驱动有点类似于I2C;
我们程序采样的是自动地址的方式去驱动,1次刷16个数据;可以看到cmd1~cm3分半是设置数据、设置地址、控制显示的命令; 然后命令格式如下
在软件设计中我们将实现这个自动地址驱动时序 2 软件设计首先是TM1640初始化TM1640_GPIO_INIT,设置为开漏极输出,如下:
/*********************************************************************
* @fn TM1640_GPIO_INIT
*
* [url=home.php?mod=space&uid=247401]@brief[/url] Initializes GPIOB.6 GPIOB.7
*
* [url=home.php?mod=space&uid=266161]@return[/url] 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);
}
TM1640_Generate_STOP();
TM1640_Generate_START();
TM1640_WriteData(0x8c); //显示控制:显示开,脉冲宽度设为11/16
TM1640_Generate_STOP();
Delay_Ms(10);
}
3 下载验证显示"0~F";
演示视频链接:
4. 为了方便大家理解,另有视频对代码进行见解
如下:
https://www.bilibili.com/video/BV1SG4y1z7yh/?spm_id_from=333.788&vd_source=2bbde87de845d5220b1d8ba075c12fb0
附件是代码:
|
视频内容很丰富,下篇文字部分有待补充哦~