大家好,我是程序员小哈。

我们经常能看到利用OLED来显示一些图案,那这些图片素材是怎么实现的呢?今天我们就来分享一下相关内容。

实现目标

  • 修改原Demo工程的主芯片为STM32F103RET6
  • 按实际连接修改源码
  • 制作一个图片素材并显示

获取Demo源码

之前我们分享过这个0.96寸OLED的相关文章(见文末的相关阅读),我们今天就在之前的源码基础上完成本文的实例,源码的获取方式如下图所示:

修改源码

修改主芯片

之前分享的这个源码,由于使用的是 STM32F103C8T6 为主芯片的最小系统板分享的,所以首先我们要把这个工程修改一下:

(1) 因为STM32F103C8T6和STM32F103F103RET6的闪存容量不同,前者8=64K,后者E=512K,所以需要将工程中原有的启动文件 startup_stm32f10x_md.s 修改为: startup_stm32f10x_hd.s

(2)设置工程。

  • Options 中 Device修改为 STM32F103RET6
  • OptionsC/C++ 标签下的宏定义修改为: STM32F10X_HD,USE_STDPERIPH_DRIVER

修改实际连接的硬件引脚

这次板子的硬件连接如下:

OLED 实际连接
GND 接地
VCC 3.3V
D0 PC13
D1 PC0
RES PC1
DC PC2
CS PC3

因为跟之前网文分享的Demo连接的硬件引脚已经变换,所以我们要对工程中,对GPIO初始化部分的代码进行改写:

void OLED_Init(void)
{    GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_13;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;            //速度50MHzGPIO_Init(GPIOC, &GPIO_InitStructure);                     //初始化GPIOGPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_13);   OLED_RST_Set(); delay_ms(100);OLED_RST_Clr();   delay_ms(200);OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);  //--turn off oled panelOLED_WR_Byte(0x00,OLED_CMD); //---set low column addressOLED_WR_Byte(0x10,OLED_CMD); //---set high column addressOLED_WR_Byte(0x40,OLED_CMD);    //--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);  //--set contrast control registerOLED_WR_Byte(0xCF,OLED_CMD);   // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1,OLED_CMD);    //--Set SEG/Column Mapping     0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);  //Set COM/Row Scan Direction   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);  //--set normal displayOLED_WR_Byte(0xA8,OLED_CMD);  //--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f,OLED_CMD);    //--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);   //-set display offset   Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);   //-not offsetOLED_WR_Byte(0xd5,OLED_CMD);   //--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80,OLED_CMD); //--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9,OLED_CMD);   //--set pre-charge periodOLED_WR_Byte(0xF1,OLED_CMD);   //Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA,OLED_CMD);    //--set com pins hardware configurationOLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD); //--set vcomhOLED_WR_Byte(0x40,OLED_CMD);   //Set VCOM Deselect LevelOLED_WR_Byte(0x20,OLED_CMD);   //-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);    //OLED_WR_Byte(0x8D,OLED_CMD);  //--set Charge Pump enable/disableOLED_WR_Byte(0x14,OLED_CMD);  //--set(0x10) disableOLED_WR_Byte(0xA4,OLED_CMD);   // Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);    // Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);    //--turn on oled panelOLED_WR_Byte(0xAF,OLED_CMD);  /*display ON*/ OLED_Clear();OLED_Set_Pos(0,0);
}

修改GPIO操作的宏定义为:

#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_13)            //CLK   PC13 SCK D0
#define OLED_SCLK_Set() GPIO_SetBits(GPIOC,GPIO_Pin_13)#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_0)         //DIN   PC0 MISO D1
#define OLED_SDIN_Set() GPIO_SetBits(GPIOC,GPIO_Pin_0)#define OLED_RST_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_1)               //RES   PC1
#define OLED_RST_Set() GPIO_SetBits(GPIOC,GPIO_Pin_1)#define OLED_DC_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_2)             //DC    PC2
#define OLED_DC_Set() GPIO_SetBits(GPIOC,GPIO_Pin_2)#define OLED_CS_Clr()  GPIO_ResetBits(GPIOC,GPIO_Pin_3)             //CS    PC3
#define OLED_CS_Set()  GPIO_SetBits(GPIOC,GPIO_Pin_3)

修改下载工具为JLINK(根据个人实际修改)。

注意Flash Download 要修改为 512k的 STM32F10x High-density Flash

下载程序之后,OLED上成功显示文字,达到预期效果,Demo修改完成。

制作图片素材

制作位图

利用PS制作一个 128*64 分辨率的bmp格式的位图。

取模

使用 PCTOLCD2002 软件生成字模。

显示位图

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{   unsigned int j=0;unsigned char x,y;if(y1%8==0) y=y1/8;      else y=y1/8+1;for(y=y0;y<y1;y++){OLED_Set_Pos(x0,y);for(x=x0;x<x1;x++){      OLED_WR_Byte(BMP[j++],OLED_DATA);          }}
}

函数调用:

OLED_DrawBMP(0,0,128,8, BMP3);

其中数组BMP3中存放的就是位图的字模数据。

结果展示

源码获取

公众号后台回复:位图显示 ,获取本文字模软件及测试工程源码。

总结

今天的内容比较简单,学起来,说不定哪天就能用上了。

每天进步一点点,,每天朝梦想近一点。

每天进步一点点,成长足迹看得见。

今天的文章内容到这里就结束了,希望对你有帮助,我们下一期见。

参考阅读

STM32驱动0.96寸OLED液晶屏

OLED液晶屏如何显示中文呢?

那位同学需要的:STM32驱动四针OLED,来了

欢迎关注

点击名片,发送加群,加入作者优质技术交流群。

如果想了解小哈哥的知识星球,可以点击下方链接,查看球友的福利,我们可以一起交流、一起玩耍。

知识星球简介链接:
https://mp.weixin.qq.com/s/LIZlGiqExmSVohLgkUbkoA

声明:文中软件仅供学习使用,请支持正版。

OLED显示图片的技能,你Get了吗?相关推荐

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

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

  2. 如何使用OLED显示图片

    以下文章来源于:公_众_号开源电子网 读取更多技术文章,请扫码关注 如何使用OLED显示图片 前言 这篇文章不过多描述OLED工作原理及驱动过程,仅从实用性出发,如何使用OLED显示图片.这里我们以正 ...

  3. 0.96寸OLED显示 图片

    今天来讲解一下STM32驱动OLED显示图片,本次教程分为两部分: 1.BMP图片制作 2.程序讲解与调用 1.BMP图片制作(取模) BMP图片取模讲解两种方式:自己画图.普通图片制作. 1)自己画 ...

  4. C51——oled显示图片(128x64,图片可自己创建)

    oled显示图片,128x64(图片可自己创建) #include "reg52.h" #include "intrins.h"sbit SCL=P0^1; s ...

  5. stm32单片机OLED显示图片 位图转换 Image2Lcd使用

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

  6. 【Image2Lcd与PCtoLCD2002】实现stm32 上 接oled 显示图片

    文章目录 前言 先上效果图 一.oled?转成想要的分辨率 二.Image2Lcd(破解版) 三.PCtoLCD2002(完美版) 四.oled代码 OLED.c OLED.h OLED_Front. ...

  7. 0.96寸OLED显示图片

    先看效果 因为之前在项目中OLED一般只显示字符,今天闲来无事了解了一下取模功能,话不多说,直接开始教学. 首先寻找一张你想显示的图片 使用画图打开(重新调整大小,128乘以64) 接着保存,注意是以 ...

  8. STM32F103xx OLED旋转显示图片

    STM32F103xx OLED旋转显示图片 编译器平台及例程说明 编译器说明 例程说明 一.图片旋转显示样式 二.图片旋转显示原理简述 三.两种不同的取模方式 第一种取模方式 第二种取模方式 四.不 ...

  9. 0.96寸OLED显示汉字,数字,英文,图片,GIF动画+取模软件使用+代码解析

    前言 本次我们学习一下STM32F103关于OLED显示汉字,数字,英文,图片,GIF动画,和介绍各种取模软件的使用,主要教会大家使用和修改OLED驱动的代码,对汉字大小,图片分辨率进行代码修改并显示 ...

最新文章

  1. C语言之分支结构 if(一)
  2. 结构型模式:外观模式(门面模式)
  3. 使用zlib库进行数据压缩
  4. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
  5. Pyqt5 多标签_ESL电子货架标签方案
  6. OpenCV学习笔记(五十四)——概述FaceRecognizer人脸识别类contrib
  7. [Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]
  8. java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...
  9. 微信小程序入门二:底部导航tabBar
  10. FATE框架安装后测试报错:ModuleNotFoundError: No module named ‘arch‘
  11. php 命令行 循环,Linux_批处理的循环效果脚本,第一次运行 执行命令工A 第 - phpStudy...
  12. 免费python课程排行榜-用python爬取2017年中国最好大学排名
  13. bat脚本 拷贝文件/文件夹到目标目录
  14. 关于微信小程序的相关接口以及问题
  15. Java游戏开发 —— 俄罗斯方块
  16. 把U盘变成超级工具箱
  17. 【电脑小白】提高ppt矢量图导出分辨率
  18. NPN和PNP三极管收录笔记
  19. 自制APP连接远程服务器
  20. 面试题汇总-大牛的Java170

热门文章

  1. 复杂环境下的高精度定位「自动驾驶」「AI工程落地」
  2. 职称计算机和外语评职称各加多少分,评职称 外语和计算机不再是门槛
  3. 通过抖音接口获取账号视频的播放量,点赞,评论,转发数据
  4. 实战四十一:常见的机器学习数据集分享
  5. qemu 编译 qemu-system-arm 和 qemu-system-aarch64
  6. 关于词云绘制你应该知道什么?
  7. markdown表格代码
  8. Sep 15th 2018
  9. 三十七、L1,L2,L3 Cache究竟在哪里
  10. 基于声表面滤波器(SAWF)实现2ps分辨率TDC设计