超级版主
- 积分
- 4671
- 金钱
- 4671
- 注册时间
- 2019-5-8
- 在线时间
- 1224 小时
|
本帖最后由 正点原子运营 于 2021-11-2 16:46 编辑
以下文章摘自微信公众号——开源电子网《如何使用OLED显示图片 》
更多技术文章,请扫下方二维码关注
前言
这篇文章不过多描述OLED工作原理及驱动过程,仅从实用性出发,如何使用OLED显示图片。这里我们以正点原子战舰板OLED实验例程为基础。
使用OLED显示图片分为两步:
1.图像取模
2.编写oled显示图片函数
一、图像取模
图片格式转换,将图片转化为单色,并且对单色图片进行取模。
①首先准备好要操作的图片,然后使用Image2Lcd软件进行格式转换,输出数据类型为BMP格式,并且尺寸大小转换为128*64,具体操作如下图所示:
②BMP单色图片进行取模,获取图形数据,具体操作如下:
③在工程某个文件中定义一个数组接收图形数据数组,如下图所示:
(注意:我们已经知道图片尺寸是64*64 即数组的大小得需要512字节大小(64 * 8 byte))
二、编写oled显示图片函数
- /**
- * @brief OLED显示图片
- * [url=home.php?mod=space&uid=271674]@param[/url] x : 0~127
- * @param y : 0~63
- * @param width : 0~127
- * @param height : 0~63
- * @param *pic : 图片的起始地址
- * @param mode: 1 正常显示 0,反向显示
- * @retval 无
- */
- void oled_show_picture(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *pic, uint8_t mode)
- {
- uint8_t temp, j;
- uint8_t y0 = y;
- uint8_t *g_pic = NULL;
- uint16_t i, psize = 0;
- /* 获取该图片的总字节数 */
- psize = (height / 8 + ((height % 8) ? 1 : 0)) * width;
- /* 超出范围 直接返回 */
- if ((x + width > 128) || (y + height > 64)) return;
- g_pic = (uint8_t *)pic;
- for (i = 0; i < psize; i++)
- {
- temp = g_pic<i>;
- for (j = 0; j < 8; j++) /* 对一个字节中的8个位数据进行判断 */
- {
- if (temp & 0x80) /* 高位存放的是低坐标 */
- {
- OLED_DrawPoint(x, y, mode);
- }
- else
- {
- oled_DrawPoint(x, y, !mode);
- }
- temp <<= 1;
- y++;
- if ((y - y0) == height) /* 一列数据已经处理完毕 */
- {
- y = y0;
- x++;
- break;
- }
- }
- }
- }</i>
复制代码
显示图片函数,思路参照显示字符函数:按照从上到下(先y++),从左到右(再x++)的取模方式来编写,先得到最高位,然后判断是写1还是0,进行画点;接着读第二位,如此循环,直到数组数据全部读取完成。这里涉及到里地址和行地址的自增,根据取模方式来理解,就不难了。
下载运行,最终的效果如下图所示:
网上很火的使用OLED播放bad_apple或者太空人都是将视频转为一帧帧图像进行快速播放进行实现,有兴趣的小伙伴可以尝试实现一下。
OLED还有支持一些硬件滚动效果,大家感兴趣的话,可以留言点赞,可以多写一些关于OLED屏幕的推文。
以上用到的软件以及工程源码大家可以通过网盘链接进行下载。
复制链接,打开浏览器下载工程文件。
链接:https://pan.baidu.com/s/1L8V1ehuh_rJRyoR_FV5b5A
提取码:dnbu |
|