前言
本文主要介绍了使用单片机如何在Oled12864
上显示图片,以及相关的注意事项,若文章有不当之处,欢迎在评论区交流讨论.(又水了一篇文章~)
图像取模
打开Img2Lcd
软件,然后载入目标jpg图片
按照图片上面的选项设置
- 输出数据类型:
C语言数组
- 扫描模式:
数据水平,字节垂直
(列行式) - 输出灰度:
单色
(黑白) - 最大宽度和高度:
128*64
-
- 字节内像素数据反序
注意观察下边的输入图像尺寸和输出图像的尺寸大小,否者Oled显示乱码
我们设置好之后点击上方栏的保存
,然后它会自动打开记事本,这时候我们就去复制数据
在你代码中定义同等
大小的数组(当然你可以全部复制黏贴)即可.我们可以采用结构体方式,这样方便定位图像数据,如下所示.
显示图像
/**
* @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
屏幕的显示原理,其实都是通用的,作者本人就不在这详细介绍了T_T