基于STM32f103的TM1640驱动程序(地址自动加1 和 固定地址)

基于STM32f103的TM1640驱动共阴极LED数码管程序(地址自动加1 和 固定地址)

  • TM1640的个人理解

首先需要知道TM1640是什么,其功能如何,TM1640 是一种LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。本产品性能优良,质量可靠。主要应用于电子产品LED显示屏驱动。采用SOP28的封装形式。
特性说明
管脚定义:在这就自行省略了,下面要说的才是重点,后面会将在网上下载的中文手册贴到下面。
数据传输:其采用的是两线串行接口SCLKDIN,微处理器的数据通过两线总线接口和 TM1640 通信,在输入数据时当 CLK 是高电平时,DIN 上的信号必须保持不变,只有 CLK 上的时钟信号为低电平时,DIN 上的信号才能改变(可以理解为一个时钟周期发送一个高/低电平)。数据的输入总是低位在前,高位在后传输。在这里加个个人理解,当你想发送一个0x44的指令时,其对应的二进制为0100 0100,那么数据输入的顺序是0010 0010。数据输入的开始条件是 CLK 为高电平时,DIN 由高变低;结束条件是 CLK 为高时,DIN 由低电平变为高电平。开始上图(就是截图过来的),指令数据传输格式:(水印不会去掉,将就着看吧)
指令数据传输格式
由上图可见,当开始一个指令时,CLKDIN都是由高电平转换为低电平的,而且DIN的转换要在CLK之前,结束时CLK先于DIN转换为高电平。由此就可以写出数据传输的起始结束指令了:

void TM1640Start(void)  //起始指令
{   
        TM1640SLK_HING;
		delay_us(2);
		TM1640DAT_HING;    
        delay_us(2) ;  
        TM1640DAT_LOW;
		delay_us(2);  
}
void TM1640Stop(void)  //结束指令
{      
		TM1640SLK_LOW;  
        delay_us(2);
		TM1640DAT_LOW;  
        delay_us(2); 
        TM1640SLK_HING;  
        delay_us(2);
        TM1640DAT_HING;           
}  

在这里插入图片描述
如上表所示:这是一个数据命令设置表,在这里只提地址自加和固定地址的模式;如下图所示,
地址自动加1
Command1是设置数据的,就是通过传输上表中的数据来设置芯片工作模式;即 0x40 为地址自动加1模式,0x44 为固定地址模式。(下图为数据地址自动加1模式)

在这里插入图片描述
Command2是设置地址,也就是我们平时调试数码管的位选值,这里可以根据个人所使用的原理图来进行选择。后面的就是所要显示的数据传输了,以及Command3的控制显示,就是控制LED的亮度。
在这里插入图片描述
上图是每个地址所对应的数据,自动地址加1模式,只需要设置起始地址即可,根据个人的电路需求进行选择起始地址。下面是显示数据与芯片管脚以及显示地址之间的对应关系表:
在这里插入图片描述
这些都是根据个人的电路需求来设置的,本次是以驱动共阴极为例的,不建议使用共阳极,个人认为很麻烦。
在这里插入图片描述

在这里插入图片描述
此为共阴极数码管,由此为例,若选择GRID1为起始地址并显示"7",其指令的先后顺序是:
1.先传输工作状态指令:0x40
2.继续传输起始地址指令:0xc0
3.发送显示“7”的数据:0x07(0000 0111)(dp g f e d c b a)
4.发送亮度指令:0x8D。
如果要显示更多继续在第三步后面加要显示的数值对应的数据即可。

固定地址显示
下图为固定地址的时序图:可以发现,在每一次传输完指令前后都会有起始结束的标志。
在这里插入图片描述
细心的人可以发现,在Command2data1之间与地址自动加1的一样并没有结束和起始的标识,但是在data1后面出现了结束标识,CommandN前面出现了开始标识符,由此可见每发送一个地址+显示数据 都要加上 起始结束标识,其它的和上述的地址自动加1一样。
好了下面直接上代码。

  • 代码

先准备头文件 .h

#ifndef __TM1640_H__
#define __TM1640_H__
#include "stm32f10x.h"  
#include "sys.h"
/* 
控制显示:
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f 0x0X(这里X代表十六进制的任意值)
1/16,  2/16,  4/16,  10/16, 11/16, 12/16, 13/16, 14/16, 关灯  
 
0x40,0x44  分别对应  地址自动加1 和 固定地址      
*/  
#define SCLK_GPIO_PORT      GPIOB		              
#define SCLK_GPIO_CLK 	    RCC_APB2Periph_GPIOB		
#define SCLK_GPIO_PIN	    GPIO
stm32f103zet6是一种32位微控制器,而tm1637是一种四位数码管驱动芯片。要在stm32f103zet6上驱动tm1637,首先需要连接硬件电路。将tm1637的VCC引脚连接到stm32f103zet6的5V引脚,GND引脚连接到GND引脚,DIO引脚连接到stm32f103zet6的一个GPIO引脚,CLK引脚连接到另一个GPIO引脚。 在软件方面,我们可以使用stm32的开发环境进行编程。首先,需要配置用于连接tm1637的GPIO引脚为输出模式。然后,可以通过设置DIO引脚的电平来发送数据给tm1637。通常情况下,要写入数据到数码管,需要先发送一个起始信号,然后发送要显示的数据和相应的控制信号,最后发送一个停止信号。具体的协议可以参考tm1637的数据手册。 在编写代码时,可以使用stm32提供的GPIO库来方便地设置和读取引脚的电平。通过切换DIO引脚的状态,将数据发送给tm1637。同时,还可以使用定时器来控制CLK引脚的频率,以达到适当的数据传输速率。 在具体的实现上,可以定义一些函数来实现发送起始信号、停止信号和数据发送功能。然后,在主程序中调用这些函数,实现对tm1637的驱动。可以通过循环调用这些函数,以实现不同的显示效果,比如显示数字、字母或者其他符号。 综上所述,通过连接硬件电路并编写相应的代码,可以驱动stm32f103zet6上的tm1637芯片,实现对数码管的驱动和显示。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值