数码管驱动¶
数码管/LED 点阵是嵌入式系统中常见的显示方案,该方案比 LCD 显示屏占用更少的引脚和内存资源,实现也更加简单,比较适合计时、计数、状态显示等具有单一显示需求的应用场景。
ESP-IoT-Solution 已经适配的数码管/LED 显示驱动器如下:
名称 |
功能 |
接口 |
驱动 |
数据手册 |
---|---|---|---|---|
CH450 |
数码管显示驱动芯片,支持 6 位数码管 |
I2C |
||
HT16C21 |
20×4/16×8 LCD 控制器,支持 RAM 映射 |
I2C |
||
IS31FL3XXX |
LED 点阵控制器 |
I2C |
CH450 驱动¶
CH450 是一款数码管显示驱动芯片,可以用于驱动 6 位数码管或 48 点 LED 矩阵,可通过 I2C
接口与 ESP32 进行通信。
该驱动对 CH450 的基本操作进行了封装,用户可以直接调用 ch450_write()
或 ch450_write_num()
接口在数码管上进行数字显示。
示例¶
i2c_bus_handle_t i2c_bus = NULL;
ch450_handle_t seg = NULL;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_MASTER_SCL_IO,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf);
seg = ch450_create(i2c_bus);
for (size_t i = 0; i < 10; i++) {
for (size_t index = 0; index < 6; index++) {
ch450_write_num(seg, index, i);
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
ch450_delete(seg);
i2c_bus_delete(&i2c_bus);
HT16C21 驱动¶
HT16C21 是一款支持 RAM 映射的 LCD 控制/驱动芯片,可用于驱动 20 x 4
或 16 x 8
段码式液晶屏,该芯片通过 I2C
接口与 ESP32 进行通信。
该驱动对 HT16C21 的基本操作进行了封装,用户使用 ht16c21_create
创建实例之后,通过 ht16c21_param_config
对驱动器参数进行配置,之后即可直接调用 ht16c21_ram_write
进行写入操作。
示例¶
i2c_bus_handle_t i2c_bus = NULL;
ht16c21_handle_t seg = NULL;
uint8_t lcd_data[8] = { 0x10, 0x20, 0x30, 0x50, 0x60, 0x70, 0x80 };
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_MASTER_SCL_IO,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf);
seg = ht16c21_create(i2c_bus, HT16C21_I2C_ADDRESS_DEFAULT);
ht16c21_config_t ht16c21_conf = {
.duty_bias = HT16C21_4DUTY_3BIAS;
.oscillator_display = HT16C21_OSCILLATOR_ON_DISPLAY_ON;
.frame_frequency = HT16C21_FRAME_160HZ;
.blinking_frequency = HT16C21_BLINKING_OFF;
.pin_and_voltage = HT16C21_VLCD_PIN_VOL_ADJ_ON;
.adjustment_voltage = 0;
};
ht16c21_param_config(seg, &ht16c21_conf);
ht16c21_ram_write(seg, 0x00, lcd_data, 8);
ht16c21_delete(seg);
i2c_bus_delete(&i2c_bus);
IS31FL3XXX 驱动¶
IS31FL3XXX 系列芯片可用于驱动不同规模的 LED 点阵屏幕。其中 IS31FL3218 支持 18 个恒流通道,每个通道由独立的 PWM 控制,最大输出电流 38 mA,可直接驱动 LED 进行显示。IS31FL3736 支持更多的通道,最大可组成 12 x 8
LED 矩阵,每个通道由一个 8 位 PWM 驱动,最大支持 256 级渐变。
该驱动对 IS31FL3XXX 的基本操作进行了封装,示例如下节所示。
IS31FL3218 示例¶
i2c_bus_handle_t i2c_bus = NULL;
is31fl3218_handle_t fxled = NULL;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_MASTER_SCL_IO,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf);
fxled = is31fl3218_create(i2c_bus);
is31fl3218_channel_set(fxled, 0x00ff, 128); // set PWM 1 ~ PWM 8 duty cycle 50%
is31fl3218_delete(fxled);
i2c_bus_delete(&i2c_bus);