练习2:修改驱动,使的可以在数码管上显示时间,如"12:34",并闪烁 - 1.先找出":"是由哪个段码驱动的,用tm1637_set_segment_raw() - 2.找出":"是由显示数据中的哪一个位驱动 - 3.修改驱动
时间: 2024-05-10 14:16:23 浏览: 160
1. 根据TM1637的原理,我们可以知道“:”是由第二个数字的最高位(即十位数的最高位)的DP(小数点)控制的。那么我们可以使用tm1637_set_segment_raw()函数来控制DP的亮灭。
2. 我们可以先定义一个包含时分秒的结构体,例如:
```c
struct time {
uint8_t hour;
uint8_t minute;
uint8_t second;
};
```
然后我们将显示的数据按照以下方式定义为一个8位数组:
```c
uint8_t display_data[4] = {0, 0, 0, 0};
```
其中,第一个元素是十位数的最高位,第二个元素是十位数的次高位,第三个元素是个位数的最高位,第四个元素是个位数的次高位。
那么我们可以将时分秒的各个数字分别赋值给这个数组:
```c
struct time current_time = {12, 34, 0};
display_data[0] = current_time.hour / 10;
display_data[1] = current_time.hour % 10;
display_data[2] = current_time.minute / 10;
display_data[3] = current_time.minute % 10;
```
3. 接下来,我们需要修改驱动程序。我们可以在显示数据的循环中,每隔一段时间(例如500ms)将“:”的DP控制位取反,从而实现闪烁的效果。具体代码如下:
```c
void tm1637_display_time(struct time t) {
// 定义显示数据
uint8_t display_data[4] = {0, 0, 0, 0};
display_data[0] = t.hour / 10;
display_data[1] = t.hour % 10;
display_data[2] = t.minute / 10;
display_data[3] = t.minute % 10;
// 定义DP控制位变量
uint8_t dp_control = 0;
// 循环显示数据
while (1) {
// 设置DP控制位
tm1637_set_segment_raw(1, dp_control ? 0x80 : 0);
// 显示数据
for (int i = 0; i < 4; i++) {
tm1637_set_digit(i, display_data[i]);
}
// 取反DP控制位
dp_control = !dp_control;
// 延时500ms
HAL_Delay(500);
}
}
```
阅读全文