一、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 的引脚 PB6,DIO 引脚连接到引脚 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)、如果您仔细注意到图片,会看到将在start和stop之间发送 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 引脚拉为高电平。
这样,数据位仅在时钟拉低时传输。我们对整个字节重复此过程。