TM1637 + 4-Digit_Display(4位LED时间显示屏)的使用 with STM32

一、4-Digit Display显示屏外观

 

二、特征:

(1)、12脚的带时钟点的4位共阳数码管(0.56英寸)的显示模块,驱动芯片为TM1637,类I2C总线通讯,可使单片机控制4位8段数码管。 

(2)、显示器件为4位共阳红/绿/蓝/白字数码管
        数码管8级灰度可调
        控制接口电平可为5V或3.3V

(3)、TM1637是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路。它内部集成了 MCU 数字接口、数据锁存器、LED 高压驱动器和键盘扫描, 使用类I2C总线通讯

二、 显示模块与MCU的连接 STM32F103C8T6

显示模块是一个 4 位显示器,中间有冒号“:”,显示时钟数据是完美的。
显示器的 CLK 引脚连接到 STM32 的引脚 PB6DIO 引脚连接到引脚 PB7。显示器由 MCU 本身的 3.3V 供电。

四、CubeMX配置

(1)、时钟配置 

(2)、I2C配置:

 

注意:

(1)、虽然配置为硬件I2C,但是我们使用软件模拟I2C方式编程,这是因为TM1637驱动模块的驱动是类I2C,它并不是标准I2C。

(2)、STM32F103C8T6的PB6 和 PB7 配置为开漏输出,两引脚的最大输出速度设置为HIGH

以上是我们在这里需要做的所有配置。

五、TM1637写入时序

 根据设备的数据手册,数据必须按以下顺序发送。

(1)、基本上,我们首先需要发送Command1(控制命令),然后发送Command2(设置地址),然后是数据字节,最后发送Command3(显示控制命令)


(2)、如果您仔细注意到图片,会看到将在startstop之间发送 command1 command3。而 command2 和数据之间没有停止条件。 

(3)、将数据写入显示器主要有两种方式,地址自动递增模式和固定地址模式。在自动递增模式下,一个数据字节存储在给定地址,下一个数据字节将自动存储在下一个位置。本教程使用此模式。

六、起始和停止信号

(1)、起始信号

 根据参考手册,“当 CLK 为高电平, DIO 从高电平跳变为低电平时,表示start起始信号”。

我们将编写一个单独的函数来生成此启动条件:

void start (void)
{
	CLK_HIGH();
	DATA_HIGH();
	Delay_us (2);
	DATA_LOW();
}

上面代码,我们首先将 CLK 和 DATA 引脚拉高。然后等待 2us 并将 DATA 引脚拉至低电平,从而产生起始信号。

此函数 Delay_us 实际上不会以微秒为单位生成延迟。该器件数据手册没有指定某些特定的时钟要求,但它应该足够快,否则将无法工作。以下是用于延迟目的的函数。 

void Delay_us (int time)
{
	for (int i=0; i<time; i++)
	{
		for (int j=0; j<7; j++)
		{
			__asm__("nop");
		}
	}
}

您也可以用自己的延时函数来实现相同的功能。请注意,变量 j 的最大值设置为 7,这是因为我的系统以 72 MHz 的频率运行。您可以根据系统时钟更改此值。例如,如果 MCU 以 100 MHz 运行,请将其更改为 10,或者如果以 50 MHz 运行,请将其更改为 5。您还可以在此处尝试其他一些值,因为时钟要求不是问题。

(2)、停止信号

根据参考手册,“当 CLK 为高电平, DIO 从低电平跳变为高电平时,数据传输结束”。

以下是发送停止信号的函数:

void stop (void)
{
	CLK_LOW();
	Delay_us (2);
	DATA_LOW();
	Delay_us (2);
	CLK_HIGH();
	Delay_us (2);
	DATA_HIGH();
}

在这里,我们首先将 CLK 和 DATA 都拉到低。然后先将 CLK 拉高,稍后将 DATA 拉到高。由此产生了停止信号。

七、写入1字节数据

向设备写入单个字节的函数。此字节可以是命令或数据。

根据数据手册,“当输入数据时,高电平 CLK 的 DIO 信号不应改变,而低电平 CLK 信号的 DIO 信号应发生变化。基本上,数据引脚只能在时钟低时更改。

void writeByte (uint8_t byte)
{
	int i;
	for (i = 0; i<8; i++)
	{
		CLK_LOW();
		if (byte & 0x01) // low front
		{
			DATA_HIGH();
		}
		else
		{
			DATA_LOW();
		}
		Delay_us (3);
		byte = byte >> 1;
		CLK_HIGH();
		Delay_us (3);
	}
}
  • 在这里,我们将首先将 CLK 拉至低。
  • 然后检查数据字节的最小有效位。
  • 如果位为 1,则将数据引脚拉高,否则将数据引脚拉低。
  • 然后将数据字节向右移动 1 位,并将 CLK 引脚拉为高电平。

这样,数据位仅在时钟拉低时传输。我们对整个字节重复此过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值