[ESP32]:使用esp_lcd_panel_draw_bitmap绘制字符

本文详细介绍了如何在esp-idf中利用T77891.4英寸LCD驱动,通过两种方法(单个点绘制和buffer绘制)使用`esp_lcd_panel_draw_bitmap`函数来绘制字符,包括字符取模、点位判断以及测试结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何使用esp_lcd_panel_draw_bitmap绘制字符

本文所使用的软硬件:

  • idf master
  • st7789 1.4 inch
  • esp_lcd 驱动

1.字符取模

在绘制之前,需要对字符进行取模,本文以字符A为例:

打开绘制工具:单片机-LCD-LED-OLED中文点阵生成软件

以字高为16,字列为2为例,设置软件:
在这里插入图片描述

生成字库:

0{0x00, 0x00, 0x0e, 0x1e, 0x1f, 0x3f, 0x3b, 0x3b, 0x73, 0x7f, 0x7f, 0xe1, 0xe0, 0xc0, 0x00, 0x00}1{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0x00, 0x00}

static const unsigned char bitmap_bytes[] = {
    0x00, 0x00, 
    0x00, 0x00, 
    0x0e, 0x00, 
    0x1e, 0x00, 
    0x1f, 0x00, 
    0x3f, 0x00, 
    0x3b, 0x00, 
    0x3b, 0x80, 
    0x73, 0x80, 
    0x7f, 0xc0, 
    0x7f, 0xc0, 
    0xe1, 0xc0, 
    0xe0, 0xe0, 
    0xc0, 0xe0, 
    0x00, 0x00, 
    0x00, 0x00
};

static const unsigned char bitmap_bit_bytes[] = {
    0b00000000, 0b00000000, 
    0b00000000, 0b00000000, 
    0b00001110, 0b00000000, 
    0b00011110, 0b00000000, 
    0b00011111, 0b00000000, 
    0b00111111, 0b00000000, 
    0b00111011, 0b00000000, 
    0b00111011, 0b10000000, 
    0b01110011, 0b10000000, 
    0b01111111, 0b11000000, 
    0b01111111, 0b11000000, 
    0b11100001, 0b11000000, 
    0b11100000, 0b11100000, 
    0b11000000, 0b11100000, 
    0b00000000, 0b00000000, 
    0b00000000, 0b00000000
};

这样我们就知道哪里需要绘制像素,哪里不要绘制像素。

下面这张图可能更为清晰

在这里插入图片描述

2.单个点绘制方式:

首先,先写单点绘制的函数

uint16_t POINT_COLOR = swap_hex(rgb565(255, 255, 255)); // 画笔颜色
uint16_t BACK_COLOR = swap_hex(rgb565(0, 0, 0));        // 背景色

void lcd_draw_point(int x, int y)
{
    esp_lcd_panel_draw_bitmap(lcd_panel, x, y, x + 1, y + 1, &POINT_COLOR);
}

接下来,按照字模位置,进行上色

void app_main(void)
{
    // Initialize button that will trigger HID reports
    const gpio_config_t boot_button_config = {
        .pin_bit_mask = BIT64(APP_BUTTON),
        .mode = GPIO_MODE_INPUT,
        .intr_type = GPIO_INTR_DISABLE,
        .pull_up_en = true,
        .pull_down_en = false,
    };
    ESP_ERROR_CHECK(gpio_config(&boot_button_config));

    ESP_ERROR_CHECK(lcd_init(lcd_config));
    lcd_fullclean(lcd_panel, lcd_config, rgb565(0, 0, 0));
    for (int i = 0; i < 16; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            // 第j列
            for (int k = 0; k < 8; k++)
            {
                //先获取高位
                if (temp & 0x80)
                {   
                    //如果为1,表明需要绘制
                    lcd_draw_point(100 + j * 8 + k, 100 + i);
                }
                temp <<= 1;
            }
        }
    }
}

可以看到,这段代码的核心就是将每一个uint8_t的数据按照其二进制的0与1判断时候绘制点

3.buffer绘制的方式

buffer绘制的方式和我们之前的博客中提到的刷屏差不多,都是按照一列的方式来刷。

首先,创建一个buffer,在需要绘制的地方保存颜色

void app_main(void)
{
    ESP_ERROR_CHECK(lcd_init(lcd_config));
    lcd_fullclean(lcd_panel, lcd_config, rgb565(0, 0, 0));
    uint16_t buffer[16][2 * 8]; //创建buffer
    memset(buffer, BACK_COLOR, sizeof(buffer));
    for (int i = 0; i < 16; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            // 第j列
            uint8_t temp = bitmap_bytes[i * 2 + j];
            for (int k = 0; k < 8; k++)
            {
                if (temp & 0x80)
                {
                    buffer[j * 8 + k][i] = POINT_COLOR; //保存颜色
                    lcd_draw_point(100 + j * 8 + k, 100 + i);
                }
                else
                {
                    buffer[j * 8 + k][i] = BACK_COLOR; 
                }
                temp <<= 1;
            }
        }
    }

    for (int i = 0; i < 16; i++)
    {
        //按照一行的方式刷buffer
        esp_lcd_panel_draw_bitmap(lcd_panel, 150 + i, 150, 150 + i + 1, 150 + 16, &buffer[i]);
    }
}

4.测试结果

在这里插入图片描述

### 关于 `esp_err_t` 类型 在ESP-IDF框架中,`esp_err_t` 是一种用于表示错误码的数据类型[^1]。这种数据类型的定义允许开发者通过返回特定的错误码来处理不同场景下的异常情况。 通常情况下,在ESP-IDF中的API函数会返回一个 `esp_err_t` 值以指示操作的结果是否成功或者遇到了什么具体的问题。当调用这些API时,应该检查其返回值并根据需要采取相应的措施。 常见的 `esp_err_t` 错误码包括但不限于: - `ESP_OK`: 表示无错误发生 (0) - `ESP_FAIL`: 操作失败 (-1) 更多详细的错误码可以在官方文档中找到对应的解释说明。 ### 函数 `panel_st7789_draw_bitmap` 对于 `panel_st7789_draw_bitmap` 这一函数而言,虽然标准工具链设置指南并未直接提及该函数的具体实现细节,但从命名上可以推测这是一个专门针对ST7789液晶面板绘制位图图像的功能接口。一般这类显示驱动程序会被集成到具体的硬件抽象层(HAL),以便更好地支持不同的显示屏型号。 为了获取更精确的信息,建议查阅有关 ST7789 显示屏的支持库或组件手册,其中可能包含了此功能更为详尽的应用实例和参数描述。如果是在使用基于 ESP32 的开发板,则应查看对应版本的 ESP-IDF 文档或其他社区资源寻找确切的 API 参考资料。 ```c // 示例代码片段展示如何使用 panel_st7789_draw_bitmap 函数 #include "st7789.h" void example_function(void){ esp_err_t ret; // 调用绘图函数前先准备必要的输入参数... const uint16_t* bitmap_data = ... ; // 图像像素数组指针 int width = ... ; int height = ... ; // 尝试执行绘图命令并将结果存储至变量 'ret' ret = panel_st7789_draw_bitmap(bitmap_data, x_position, y_position, width, height); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值