ESP32-C3 IO脚9 控制TM1652 驱动两位数码管 代码
时间: 2023-12-09 14:04:43 浏览: 222
以下是ESP32-C3控制TM1652驱动两位数码管的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define CLK_PIN GPIO_NUM_0
#define DIO_PIN GPIO_NUM_1
#define DIG1 0x68
#define DIG2 0x6a
static void tm1652_write_byte(uint8_t data)
{
uint8_t i;
gpio_set_direction(DIO_PIN, GPIO_MODE_OUTPUT);
gpio_set_direction(CLK_PIN, GPIO_MODE_OUTPUT);
for(i=0; i<8; i++) {
gpio_set_level(CLK_PIN, 0);
gpio_set_level(DIO_PIN, data & (1<<i));
gpio_set_level(CLK_PIN, 1);
}
}
static void tm1652_display(uint8_t dig1, uint8_t dig2)
{
tm1652_write_byte(0x48); // Control command, write data to display register
tm1652_write_byte(DIG1); // Write digit 1
tm1652_write_byte(dig1);
tm1652_write_byte(DIG2); // Write digit 2
tm1652_write_byte(dig2);
tm1652_write_byte(0x8f); // Control command, turn on display
}
void app_main()
{
gpio_pad_select_gpio(CLK_PIN);
gpio_pad_select_gpio(DIO_PIN);
uint8_t count = 0;
while(1) {
tm1652_display(count/10, count%10);
count++;
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
```
注释:
1. CLK_PIN和DIO_PIN分别对应TM1652的时钟和数据线引脚,可以根据实际连接的引脚进行修改。
2. DIG1和DIG2是TM1652内部控制寄存器中两个数码管的地址,分别为0x68和0x6a,不需要修改。
3. `tm1652_write_byte`函数用于向TM1652写入一个字节的数据,具体实现为模拟SPI协议,每次向DIO引脚写入一位数据,然后拉高CLK引脚,这样就可以逐位地向TM1652发送数据。在写入每个字节之前,需要先将DIO引脚和CLK引脚设置为输出模式。
4. `tm1652_display`函数用于向TM1652写入两个数字,具体实现为先向控制寄存器中写入控制命令,然后分别向两个数码管写入数据。最后再向控制寄存器中写入开启显示的命令。
5. 在`app_main`函数中,首先需要将CLK_PIN和DIO_PIN设置为GPIO模式,并且初始化一个计数器count。然后进入一个循环中,每隔1秒钟调用`tm1652_display`函数向TM1652写入count的十位数和个位数,然后将count加1。由于TM1652内部有扫描驱动电路,所以可以在两个数码管之间切换显示,从而实现动态显示的效果。
阅读全文