环境开发环境VSCODE ESP-IDF开发板信盈达ESP32-S3-N16*R8开发板使用的是D200C2407V0液晶屏液晶屏的IC是ST7789V屏幕是如何显示的屏幕是由一个个像素组成的一个像素一般由三原色组成红绿蓝RGB要显示一张图片实际上就是通过控制每个像素点中红、绿、蓝三个子像素的亮度混合出不同的颜色。成千上万个像素点各自显示指定的颜色拼在一起就形成了我们看到的完整图像。不过我们并不需要去分别把每一个RGB的亮度都定义好来决定颜色显示IC已经帮我们完成了这件事所以我们只需要输入色彩信息色彩的位数1位2色非黑即白像老式电报4位16色早期游戏机色彩很复古8位256色调色板模式从256个油漆桶里选颜色填充16位6.5万色高彩日常看图基本够用24位1677万色真彩色RGB各8位人眼几乎分不出差别32位1677万色透明真彩色 Alpha通道多8位透明度为了节省存储量最大化的利用位数的颜色还诞生出了RGB233 即8位中 (B: 2 bits; G: 3 bits; R: 3 bits)。RGB565 即16 位中B: 5 bits, G: 6 bits, R: 5 bits)ST7789V显示IC使用的就是RGB556进行显示取个色把R 1781011 0010 取5G 1210111 1001 取6B 2401111 0000 取5从高位开始取相当于去掉小数点一样低位的数字舍弃对颜色的影响相对较小得到 1011 0011 1101 11100xB3DE 但这个邪门的屏幕需要颜色反转所以使用0xDEB3从RGB颜色到RGB565根据上面颜色就可以正确映射了。uint16_t RGB_Convert(uint8_t R, uint8_t G, uint8_t B) { uint16_t r5 (R 3) 0x1F; // Keep 5 bits uint16_t g6 (G 2) 0x3F; // Keep 6 bits uint16_t b5 (B 3) 0x1F; // Keep 5 bits uint16_t rgb565 (r5 11) | (g6 5) | b5; uint16_t swapped ((rgb565 0xFF00) 8) | ((rgb565 0x00FF) 8); return swapped; }设置全屏颜色代码void lcd_set_color(uint16_t color) { // 分配内存 这里分配了液晶屏一行数据需要的大小 uint16_t *buffer (uint16_t *)heap_caps_malloc(BSP_LCD_H_RES * sizeof(uint16_t), MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); if (NULL buffer){ ESP_LOGE(TAG, Memory for bitmap is not enough); }else{ for (size_t i 0; i BSP_LCD_H_RES; i){ // 给缓存中放入颜色数据 buffer[i] color; } for (int y 0; y BSP_LCD_V_RES; y){ // 显示整屏颜色 esp_lcd_panel_draw_bitmap(panel_handle, 0, y, BSP_LCD_H_RES, y1, buffer); } free(buffer); // 释放内存 } }字库其实我更愿意把这些都称之为点阵图每个字/字母都用一个固定大小的像素网格表示不过为了方便存储一般取8的倍数通过16进制存储会很方便如果你的字号是12或者19等的非8倍数取模软件一般就会向上取整字号12会用16bit存储剩下4bit就空出来了字号20会用24bit存储。使用的是PctoLCD2002这个小软件需要设置一下1那里是字号3那里的点阵会影响数据的分行可以修改看看导出的效果。生成字模待用创建一个数组。注意这里的48位计算方法是按照24高 12宽24*16/8 4812按照8的倍数取16这里以24x12的字体为例。void lcd_draw_char24(int x_start, int y_start, uint8_t Ch, uint16_t fc, uint16_t bc) { // 分配内存 分配了需要的字节大小 且指定在外部SPIRAM中分配 size_t pixels_byte_size 24 * 16 * 2; uint16_t *pixels (uint16_t *)heap_caps_malloc(pixels_byte_size, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); if (NULL pixels){ ESP_LOGE(TAG, Memory for char is not enough); return; } unsigned char Temp; Ch Ch - 0; for (int i0;i48;i){ Temp ascii_2412[Ch][i]; for(int j0;j8;j){ if(Temp(0x01j)) pixels[i*8j] fc; else pixels[i*8j] bc; } } esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start16, y_start24, (uint16_t *)pixels); // 显示一个字符数据 heap_caps_free(pixels); // 释放内存 }如果用其他规格需要改的地方挺多的图中标出汉字也一样取模方法类似如果太长可能会出现分行的情况改点阵输入999就可以了就不会分行了。结束然后最后差不多就有这样效果啦~