Arduino UNO驱动SSD1351 OLED显示纯红色位图异常求助
SSD1351 OLED纯红位图显示乱色的排查与解决
核心问题分析
SSD1351采用RGB565 16位颜色格式,但多数图片转换工具默认输出大端字节序(高字节在前),而SSD1351实际需要小端字节序(低字节在前),这会导致颜色通道错位,出现杂乱色彩。此外,部分场景下控制器可能采用BGR565的通道顺序,也会引发颜色异常。
排查与修复步骤
1. 验证库的颜色输出是否正常
先排除ucglib库的颜色处理问题,用库自带的颜色生成宏绘制纯红方块:
#include <Ucglib.h> Ucglib_SSD1351_18x128x128_SWSPI ucg(13, 11, 9, 10, 8); void setup() { ucg.begin(UCG_FONT_MODE_TRANSPARENT); ucg.clearScreen(); } void loop() { ucg.clearScreen(); // 生成纯红的RGB565值(0xF800) ucg.setColor(ucg.color565(255, 0, 0)); ucg.drawBox(0, 0, 20, 20); delay(1000); }
- 如果方块显示纯红:说明库的颜色逻辑正常,问题出在位图数组的字节序。
- 如果方块显示蓝色/其他颜色:说明控制器采用BGR565顺序,需将颜色改为
ucg.color565(0, 0, 255)测试,后续位图转换要设为BGR565格式。
2. 修正位图数组的字节序
方法一:修改图片转换工具设置
如果用的是LCD Image Converter这类工具:
- 打开「输出设置」,找到「字节顺序」选项,选择Little Endian(低字节在前)
- 重新生成位图数组,直接用于绘制即可。
方法二:代码中手动交换字节
如果无法修改转换工具,在绘制位图时对每个像素的高低字节进行交换:
const uint16_t red_bitmap[] = { /* 你的位图数据 */ }; const int BITMAP_W = 128; const int BITMAP_H = 128; void drawCorrectedBitmap() { for (int y = 0; y < BITMAP_H; y++) { for (int x = 0; x < BITMAP_W; x++) { uint16_t raw_color = red_bitmap[y * BITMAP_W + x]; // 交换高低字节,适配SSD1351的小端要求 uint16_t corrected_color = (raw_color << 8) | (raw_color >> 8); ucg.setColor(corrected_color); ucg.drawPixel(x, y); } } }
3. 确认转换工具的颜色通道顺序
如果上述操作后仍异常,检查转换工具的颜色通道设置:
- 若控制器是BGR565顺序,需将转换预设改为Color B5G6R5,重新生成位图数组。
内容的提问来源于stack exchange,提问作者OMEGA_F
相关产品推荐
相关产品推荐

