0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RTT大赛作品连载】 OLED显示图片

闲来无事玩单片机呀 来源:闲来无事玩单片机呀 作者:闲来无事玩单片机 2021-12-06 09:17 次阅读

上一篇文章讲了OLED文字显示代码:http://www.elecfans.com/d/1749110.html

这片文章将讲解如何用OLED显示图片,包括长度为128像素,64像素,48像素,24像素,16像素的bmp单色图片,各种像素的图片可以根据自己的要求进行修改,本文只是举例。

一、生成图片

找一张想要显示的图片,使用PS或者其他图片处理工具将图片变换成长度为128像素大小。

本文使用电子发烧友的logo来实验。

1. 保存电子发烧有的图片,并使用PS工具将图片大小修改为128像素,宽度不用设置,然后打开画图工具将图片另存为单色bmp格式。

pYYBAGGrVViAZH3cAACmjBW2SK8945.png

2. 打开PCtoLCD取模工具,选择模式→图形模式

pYYBAGGrVj2AWdLZAADk28Zft58910.png

3. 打开图片,选择需要取模的图片,然后点击生成字模

poYBAGGrVkqALwIQAAI8ujCA-e4492.png

poYBAGGrVliAapJjAAJFFBeHI8k527.png

4. 将生成的字模复制到bmp.c中,放在EleFans_Logo数组中

const unsigned char EleFans_logo[][16] =
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x7F},
{0xC0,0x00,0x00,0x00,0x03,0xFF,0xF8,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x00},
{0x1F,0xFF,0xFF,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x80,0x00,0x00,0x7F,0xF1,0xFF,0xC0},
{0x00,0x00,0xFF,0xE4,0xFF,0xC0,0x00,0x01,0xFF,0xEE,0xFF,0xC0,0x00,0x01,0xFF,0xE4},
{0xFF,0xC0,0x00,0x03,0xFF,0xE1,0xFF,0xC8,0x00,0x03,0xFF,0xCF,0xFF,0xD8,0x00,0x07},
{0xFF,0x9F,0xFF,0x9C,0x00,0x07,0xFF,0xBF,0xFF,0x3C,0x00,0x07,0xFF,0x3F,0xFF,0x7C},
{0x00,0x0F,0xFE,0x7F,0xFE,0x7E,0x00,0x0F,0xFC,0xFF,0xFC,0xFE,0x00,0x0F,0xFD,0xFF},
{0xF9,0xFE,0x00,0x0F,0xF9,0xFF,0xF3,0xFE,0x00,0x0F,0xF3,0xFF,0xF7,0xFE,0x00,0x1F},
{0xF7,0xFF,0xE7,0xFE,0x00,0x1F,0xEF,0xFF,0xCF,0xFE,0x00,0x3F,0xEF,0xFF,0x9F,0xFC},
{0x00,0x7F,0xEF,0xFF,0x3F,0xFC,0x00,0xFF,0xCF,0xFF,0x3F,0xFC,0x0F,0xFF,0xCF,0xFE},
{0x7F,0xF8,0x07,0xFF,0x9F,0xF0,0xFF,0xF8,0x00,0x00,0x3F,0xE4,0xFF,0xF0,0x00,0x00},
{0xFF,0xEE,0xFF,0xF0,0x00,0x00,0xFF,0xE4,0xFF,0xE0,0x00,0x00,0x7F,0xF1,0xFF,0xC0},
{0x00,0x00,0x3F,0xFF,0xFF,0x80,0x00,0x00,0x0F,0xFF,0xFF,0x00,0x00,0x00,0x07,0xFF},
{0xFC,0x00,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00},
{0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x07,0x80,0x00,0x00},
{0x0F,0xFC,0x00,0x40,0x00,0x00,0x0C,0xCC,0x00,0x40,0x00,0x00,0x0C,0xCC,0x07,0xC0},
{0x00,0x00,0x0C,0xCC,0x00,0x40,0x00,0x00,0x0C,0xCC,0x00,0x40,0x00,0x00,0x1D,0xFE},
{0x07,0x80,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,0x1F,0xFF,0x87,0x80,0x00,0x00},
{0x0C,0xCC,0x80,0x40,0x00,0x00,0x0C,0xCC,0x80,0x40,0x00,0x00,0x0C,0xCC,0x87,0xC0},
{0x00,0x00,0x0F,0xFC,0x80,0x40,0x00,0x00,0x0F,0xFD,0x80,0x40,0x00,0x00,0x0F,0xB0},
{0x87,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x07,0x80,0x00,0x00},
{0x00,0x60,0x00,0x40,0x00,0x00,0x18,0x60,0x05,0x40,0x00,0x00,0x18,0x60,0x07,0xC0},
{0x00,0x00,0x18,0x60,0x00,0x40,0x00,0x00,0x18,0x60,0x87,0x80,0x00,0x00,0x18,0x60},
{0x80,0x00,0x00,0x00,0x18,0x61,0x80,0x40,0x00,0x00,0x18,0xFF,0x80,0x00,0x00,0x00},
{0x19,0xFF,0x03,0x80,0x00,0x00,0x1F,0xE0,0x05,0x40,0x00,0x00,0x1E,0x60,0x05,0x40},
{0x00,0x00,0x1C,0x60,0x05,0x40,0x00,0x00,0x18,0x60,0x03,0x40,0x00,0x00,0x00,0x60},
{0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x1E,0x03,0x83,0x80,0x00,0x00,0x1E,0x1F,0x85,0x40,0x00,0x00,0x07,0xFC,0x05,0x40},
{0x00,0x00,0x07,0xE0,0x85,0x40,0x00,0x00,0x1F,0xC1,0x83,0x40,0x00,0x00,0x1E,0xD9},
{0x81,0x00,0x00,0x00,0x06,0xDF,0x80,0x00,0x00,0x00,0x06,0xC7,0x02,0x00,0x00,0x00},
{0x06,0xC7,0x02,0x00,0x00,0x00,0x06,0xC7,0x0F,0xC0,0x00,0x00,0x06,0xDF,0x8A,0x00},
{0x00,0x00,0x0E,0xF9,0x8A,0x00,0x00,0x00,0x0E,0xF1,0x80,0x00,0x00,0x00,0x00,0x00},
{0x83,0x80,0x00,0x00,0x00,0x00,0x04,0x40,0x00,0x00,0x00,0x00,0x04,0x40,0x00,0x00},
{0x0F,0xE1,0x84,0xC0,0x00,0x00,0x00,0xFF,0x8F,0x40,0x00,0x00,0x1F,0xFE,0x00,0x40},
{0x00,0x00,0x0B,0xFF,0x00,0x00,0x00,0x00,0x07,0xE3,0x83,0xC0,0x00,0x00,0x0C,0x80},
{0x06,0x00,0x00,0x00,0x08,0x98,0x86,0x00,0x00,0x00,0x18,0x9F,0x83,0xC0,0x00,0x00},
{0x18,0x9E,0x00,0x00,0x00,0x00,0x1D,0x98,0x06,0x40,0x00,0x00,0x0F,0x98,0x05,0x40},
{0x00,0x00,0x0F,0x9F,0x85,0x40,0x00,0x00,0x09,0xDB,0x84,0xC0,0x00,0x00,0x09,0x99},
{0x80,0x00,0x00,0x00,0x09,0x10,0x00,0x40,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00},
{0x00,0x00,0x06,0xC0,0x00,0x00,0x0C,0x1F,0x84,0x40,0x00,0x00,0x0F,0xFF,0x84,0x40},
{0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x1D,0x81,0x83,0x80,0x00,0x00,0x0D,0xB1},
{0x84,0x40,0x00,0x00,0x0D,0xBB,0x84,0x40,0x00,0x00,0x0D,0x9F,0x03,0x80,0x00,0x00},
{0x0D,0x8F,0x00,0x00,0x00,0x00,0x0D,0x87,0x07,0xC0,0x00,0x00,0x0D,0x8F,0x04,0x00},
{0x00,0x00,0x0D,0x9F,0x85,0x40,0x00,0x00,0x0D,0xF9,0x87,0x80,0x00,0x00,0x0D,0xE1},
{0x84,0x00,0x00,0x00,0x0C,0x81,0x87,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};

5. 在bmp.h中写一个函数获取图片数据数组的大小,后边显示图片的时候会使用到

unsigned int Get_EleFans_logo_len(void)
{
    return sizeof(EleFans_logo)/sizeof(unsigned char);
}

6. 在bmp.h中声明数组与函数,用于app_oled.c中调用

extern unsigned int Get_EleFans_logo_len(void);
extern const unsigned char EleFans_logo[][16];

二、图片显示函数编辑

根据取模规则,编写图片显示函数

static void OLED_DrawBmpImg(uint8_t x,
uint8_t y,
SSD1306_COLOR color,
const uint8_t bmp[][16],
uint32_t len)
{
uint16_t t,t1;
uint8_t y0 = y;
uint8_t temp = 0u;
uint16_t len2 = (uint16_t)(len>>4u);

for(t=0; t {
temp=(White == color) ?
(bmp[(uint8_t)(t/16)][(uint8_t)(t%16)]):(~bmp[(uint8_t)(t/16)][(uint8_t)(t%16)]);;>

for(t1=0; t1<8; t1++)
{
if(temp&0x80)
ssd1306_DrawPixel(x, y, White);

temp <<= 1u;
y++;
if((y-y0) == len2)
{
y = y0;
x ++;
break;
}
}
}
}

三、对显示图片函数进行改进,可以显示不同规格的图片,其中size是图片的长度,目前支持16,24,48,64长度的图片的显示

static void OLED_DrawBmpImg2(uint8_t x,
uint8_t y,
SSD1306_COLOR color,
const uint8_t bmp[][8],
uint32_t len,
uint8_t size)
{
uint16_t t, t1;
uint8_t y_end;
uint8_t temp;
uint16_t len2 = 0u;

y_end = y;

if(size == 24)
len2 = (uint16_t)(len/3.2);
else if(size == 16)
len2 = (uint16_t)(len/2);
else if(size == 48)
len2 = (uint16_t)(len/6);
else if(size == 64)
len2 = (uint16_t)(len/16);

for(t=0; t {
temp=(White == color) ?
(bmp[(uint8_t)(t/8)][(uint8_t)(t%8)]):(~bmp[(uint8_t)(t/8)][(uint8_t)(t%8)]);;>

for(t1=0; t1<8; t1++)
{
if(temp&0x80)
ssd1306_DrawPixel(x, y, White);

temp <<= 1u;
y++;
if((y-y_end) == len2)
{
y = y_end;
x ++;
break;
}
}
}
}

四、显示电子发烧友logo

    ssd1306_Fill(Black);
    OLED_DrawBmpImg(0, 10, White, EleFans_logo, Get_EleFans_logo_len());
    ssd1306_UpdateScreen();

五、效果

1.下图是显示的电子发烧友的logo

poYBAGGrWFKANW_5AAeansUOKKw826.png

2. 显示其他尺寸的图片效果

pYYBAGGrWV2ASWxSAAie9w2taPo086.png

六、完整代码

参考https://gitee.com/hehung/ab32-vg1_-rt-thread/tree/master/OLED_test

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OLED技术
    +关注

    关注

    1

    文章

    65

    浏览量

    13168
  • OLED
    +关注

    关注

    118

    文章

    5984

    浏览量

    221424
  • 函数
    +关注

    关注

    3

    文章

    3866

    浏览量

    61308
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38866
收藏 人收藏

    评论

    相关推荐

    RTT大赛作品:AB32VG1开发板OLED显示实验

    最近在玩AB32VG1,在做OLED显示实验时,很多关于AB32VG1驱动OLED的文章,很多都是官方例程操作,在msh窗口中输入测试指令,测试驱动是否正常。很少有关于在main函数中直接实现的,本编文章直接在MAIN函数实现
    的头像 发表于 11-05 16:03 5819次阅读
    <b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b>:AB32VG1开发板<b class='flag-5'>OLED</b><b class='flag-5'>显示</b>实验

    RTT大赛作品连载】AB32VG1评估板到货控制彩灯测试

    RTT大赛作品连载】AB32VG1评估板到货控制彩灯测试篇;接下来看看在如何AB32VG1评估板控制彩灯! 在RT-ThreadStudio新建项目到对应开发配置及下载及验证测试!
    的头像 发表于 11-07 19:39 4849次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】AB32VG1评估板到货控制彩灯测试

    RTT大赛作品连载】AB32VG1评估板 音乐播放器

    RTT大赛作品连载】AB32VG1评估板 音乐播放器
    的头像 发表于 11-12 21:11 5882次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】AB32VG1评估板 音乐播放器

    RTT大赛作品连载】中科蓝讯AB32VG1开发板开箱篇

    介绍电路原理图分析接口说明,AB32VG1开发板是以中科蓝讯(Bluetrum)公司推出的基于RISC-V架构的高配置芯片AB5301A为核心所组成的。【RTT大赛作品连载】中科蓝讯A
    的头像 发表于 11-13 10:01 9698次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】中科蓝讯AB32VG1开发板开箱篇

    RTT大赛作品连载OLED显示中文

    使用AB32VG1操作OLED显示文字信息,包括汉字取模方式介绍,汉字显示函数编写.
    的头像 发表于 12-06 09:25 7904次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】 <b class='flag-5'>OLED</b><b class='flag-5'>显示</b>中文

    RTT大赛作品连载】AB32VG1开发板之OLED

    驱动OLED屏.
    的头像 发表于 01-04 08:58 4147次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】AB32VG1开发板之<b class='flag-5'>OLED</b>屏

    电子发烧友设计大赛前4届获奖作品图片

    `第一届电子设计大赛冠军作品:流水灯第1,3,5,7个灯半亮,其余的全亮第二届电子设计大赛冠军作品:摇摇棒第三届电子设计大赛冠军
    发表于 11-29 15:49

    【星核计划】上传FPGA大赛作品,领取电子发烧友专属上传福利!

    -FPGA大赛,本次大赛奖励丰厚,不仅有奖金,还有电子发烧友论坛为参赛者准备的上传福利,按照下面规则上传参赛作品即可获得,还在等什么,快来参加吧!!作品上传地址:【FPGA开发者项目
    发表于 05-21 15:01

    怎样在OLED或其他单色屏上显示图片

    OLED或其他单色屏上显示图片,为减小Flash占用,需要转换为单色的位图。对于主控是sdd1306的oled的取模方式:打开Image2Lcd。按照如图左侧进行配置,将
    发表于 07-15 08:24

    【文章连载】RT-Thread创新应用大赛文章汇总

    作者:RTT大赛学习经验分享 基于 rt-thread studio 的 sdk 开发 adc 的应用详解RTT大赛作品:AB32VG1开发
    发表于 10-11 15:13

    【有奖活动】RT-Thread创新应用大赛作品连载征文

    礼品:https://jifen.elecfans.com/index.html▷文章标题格式:【RTT大赛作品连载】+自拟内容▷文章作品
    发表于 10-21 18:49

    RTT大赛作品连载】AB32VG1开发板OLED显示实验

    最近在玩AB32VG1,在做OLED显示实验时,在csdn搜索了很多关于AB32VG1驱动OLED的文章,很多都是官方例程操作,在msh窗口中输入测试指令,测试驱动是否正常。很少有关于在main函数
    发表于 11-05 14:33

    怎么用MCU实现OLED显示图片

    怎么用MCU实现OLED 显示图片
    发表于 10-13 06:29

    利用51单片机+0.96寸iic接口oled显示图片或动图

    ~利用51单片机+0.96寸iic接口oled显示图片或动图
    发表于 11-10 17:21 33次下载
    利用51单片机+0.96寸iic接口<b class='flag-5'>oled</b><b class='flag-5'>显示</b><b class='flag-5'>图片</b>或动图

    基于51单片机的OLED显示图片文字

    基于51单片机的OLED屏幕显示,可显示图片文字字母等。
    的头像 发表于 06-12 00:43 1.3w次阅读
    基于51单片机的<b class='flag-5'>OLED</b><b class='flag-5'>显示</b><b class='flag-5'>图片</b>文字