OLED显示图片

前言

本文主要介绍了使用单片机如何在Oled12864上显示图片,以及相关的注意事项,若文章有不当之处,欢迎在评论区交流讨论.(又水了一篇文章~)

图像取模

打开Img2Lcd软件,然后载入目标jpg图片
OLED显示图片_第1张图片
按照图片上面的选项设置

  1. 输出数据类型:C语言数组
  2. 扫描模式: 数据水平,字节垂直(列行式)
  3. 输出灰度:单色(黑白)
  4. 最大宽度和高度: 128*64
    • 字节内像素数据反序

注意观察下边的输入图像尺寸和输出图像的尺寸大小,否者Oled显示乱码

我们设置好之后点击上方栏的保存,然后它会自动打开记事本,这时候我们就去复制数据
OLED显示图片_第2张图片
在你代码中定义同等大小的数组(当然你可以全部复制黏贴)即可.我们可以采用结构体方式,这样方便定位图像数据,如下所示.
OLED显示图片_第3张图片
OLED显示图片_第4张图片

显示图像

/**
 * @brief 在OLED上绘制位图
 *
 * 根据给定的位图参数,在指定位置绘制相应的图像。
 *
 * @param x 位图左上角的X坐标。
 * @param y 位图左上角的Y坐标。
 * @param l 位图的长度。
 * @param w 位图的宽度。
 */
void oled_draw_bmp(uint8_t x, uint8_t y, uint8_t l, uint8_t w) {
    // 计算位图每行的字节数,flag用于标记是否有剩余的不足一个字节的位
    uint8_t flag = (l % 8 == 0) ? 0 : 1;
    // 计算位图总共有多少行
    uint8_t rows = l >> 3;
    // 循环遍历每一行
    for (uint8_t row = 0; row < rows + flag; row++) {
        // 循环遍历每一列
        for (uint8_t column = 0; column < w; column++) {
            // 获取位图中相应位置的字节数据
            uint8_t bmp_byte = bmp_init.oled_ui[row * w + column];
            // 循环遍历字节中的每个位
            for (uint8_t bit = 0; bit < 8; bit++) {
                // 检查当前位是否为1,如果是则在OLED上绘制点
                if (bmp_byte & (1 << bit)) {
                    oled_draw_point(x + column, y + row * 8 + bit);//这里为你的画点函数
                }
            }
        }
    }
}

如果最后Oled屏幕显示乱码,请检查是否按照如上设置,以及输出图像的尺寸是否正确

仅供测试代码

oled_draw_bmp(0,0,64,128);

效果展示

OLED显示图片_第5张图片

讨论

虽然网上有很多不同的取模软件,但如果我们熟悉了解四种扫描模式,并掌握Oled屏幕的显示原理,其实都是通用的,作者本人就不在这详细介绍了T_T

你可能感兴趣的:(单片机,c语言,物联网,stm32,51单片机)