TM1652 驱动两位数码管 代码
时间: 2023-12-09 12:04:19 浏览: 40
由于没有提供具体的硬件连接和功能要求,以下代码仅供参考:
```c
#include <TM1652.h>
TM1652 tm(2, 3); //初始化TM1652对象,接口为D2和D3
void setup() {
tm.set(BRIGHT_TYPICAL); //设置显示亮度
}
void loop() {
for (int i = 0; i < 100; i++) {
tm.displayNum(i); //显示0-99的数字
delay(500);
}
}
```
需要注意的是,TM1652驱动的数字管是共阴极的,因此需要将数字0-9的每个段取反后再传递给TM1652进行显示。具体实现可以参考TM1652库中的源码。
相关问题
ESP32-C3 控制TM1652 驱动两位数码管 代码
以下是ESP32-C3控制TM1652驱动两位数码管的代码:
```c++
#include <Wire.h>
#define TM1652_I2C_ADDRESS 0x24
byte SEG_TAB[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
void writeByte(byte data) {
Wire.beginTransmission(TM1652_I2C_ADDRESS);
Wire.write(data);
Wire.endTransmission();
}
void writeCmd(byte cmd) {
Wire.beginTransmission(TM1652_I2C_ADDRESS);
Wire.write(0x40);
Wire.write(cmd);
Wire.endTransmission();
}
void setDisplay(byte data, byte index) {
writeCmd(0xc0 + index * 2);
writeByte(data);
}
void setup() {
Wire.begin();
writeCmd(0x8f);
}
void loop() {
for (int i = 0; i < 100; i++) {
setDisplay(SEG_TAB[i / 10], 0);
setDisplay(SEG_TAB[i % 10], 1);
delay(100);
}
}
```
在setup函数中,我们初始化Wire对象并发送一个命令0x8f,该命令用于开启TM1652的显示功能。
在loop函数中,我们循环计数器i从0到99,每次调用setDisplay函数来设置两位数码管的显示值。setDisplay函数的第一个参数是要显示的数据,第二个参数是要设置的数码管的索引(0或1)。我们使用SEG_TAB数组来将数字转换为对应的7段数码管编码。
在每次循环结束时,我们延迟100毫秒,以便我们可以看到数码管上的数字变化。
ESP32-C3 IO脚9 控制TM1652 驱动两位数码管 代码
以下是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内部有扫描驱动电路,所以可以在两个数码管之间切换显示,从而实现动态显示的效果。