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

news/2025/2/14 7:31:24/

文章目录

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


前言

因为stm32学的是b站老师江科自化协的教程,找了很多资料都是基于原子哥的例程,后来借鉴了许多博客,自己写出了这种方法,之后只要取字模就可以显示自己想要的图片了。写这篇博客纯粹是因为学mpu6050的时候被它初始化的蝴蝶图片给搞的开小差了。。。


先上效果图

在这里插入图片描述
原图
在这里插入图片描述

一、oled?转成想要的分辨率

oled是0.96寸的小显示屏,分辨率为12864,为了使Image2Lcd软件能输出12864的图片,我先下载图片,打开ps,原图是1080*1080的像素
在这里插入图片描述
我将缩放比例调成50%,再将画布的宽高设置成1080和540,导出还是jpg格式

二、Image2Lcd(破解版)

然后利用原子哥提供的软件Image2Lcd
在这里插入图片描述
输出数据设为bmp,扫描为水平扫描,单色,最大宽度和高度设为128*64,调节亮度为自己想要的,导出图片即可。

三、PCtoLCD2002(完美版)

设置成如下,记住一定是列行式,否则显示图片乱码。
在这里插入图片描述
然后将生成的字模复制
在这里插入图片描述

四、oled代码

c8t6芯片,
接线
D0 - B12
D1 - B13
RES - B14
DC - B15
A8 - CS

OLED.c

#include "stm32f10x.h"
#include "OLED_Font.h"/*引脚配置*/
#define OLED_W_D0(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)(x))
#define OLED_W_D1(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_13, (BitAction)(x))
#define OLED_W_RES(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_14, (BitAction)(x))
#define OLED_W_DC(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(x))
#define OLED_W_CS(x)		GPIO_WriteBit(GPIOA, GPIO_Pin_8, (BitAction)(x))/*引脚初始化*/
void OLED_SPI_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOA, &GPIO_InitStructure);OLED_W_D0(1);OLED_W_D1(1);OLED_W_RES(1);OLED_W_DC(1);OLED_W_CS(1);
}/*** @brief  SPI发送一个字节* @param  Byte 要发送的一个字节* @retval 无*/
void OLED_SPI_SendByte(uint8_t Byte)
{uint8_t i;for (i = 0; i < 8; i++){OLED_W_D0(0);OLED_W_D1(Byte & (0x80 >> i));OLED_W_D0(1);}
}/*** @brief  OLED写命令* @param  Command 要写入的命令* @retval 无*/
void OLED_WriteCommand(uint8_t Command)
{OLED_W_CS(0);OLED_W_DC(0);OLED_SPI_SendByte(Command);OLED_W_CS(1);
}/*** @brief  OLED写数据* @param  Data 要写入的数据* @retval 无*/
void OLED_WriteData(uint8_t Data)
{OLED_W_CS(0);  //拉低片选OLED_W_DC(1);  //锁存控制器 //WR 拉低再拉高产生一个上升沿 OLED_SPI_SendByte(Data);  //数据写入OLED_W_CS(1);  //拉高片选 等待后面操作
}/*** @brief  OLED设置光标位置* @param  Y 以左上角为原点,向下方向的坐标,范围:0~7* @param  X 以左上角为原点,向右方向的坐标,范围:0~127* @retval 无*/
void OLED_SetCursor(uint8_t Y, uint8_t X)
{OLED_WriteCommand(0xB0 | Y);					//设置Y位置OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置低4位OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置高4位
}/*** @brief  OLED清屏* @param  无* @retval 无*/
void OLED_Clear(void)
{  uint8_t i, j;for (j = 0; j < 8; j++){OLED_SetCursor(j, 0);for(i = 0; i < 128; i++){OLED_WriteData(0x00);}}
}/*** @brief  OLED显示一个字符* @param  Line 行位置,范围:1~4* @param  Column 列位置,范围:1~16* @param  Char 要显示的一个字符,范围:ASCII可见字符* @retval 无*/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	uint8_t i;OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容}OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容}
}/*** @brief  OLED显示字符串* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串,范围:ASCII可见字符* @retval 无*/
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i++){OLED_ShowChar(Line, Column + i, String[i]);}
}/*** @brief  OLED次方函数* @retval 返回值等于X的Y次方*/
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y--){Result *= X;}return Result;
}/*** @brief  OLED显示数字(十进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~4294967295* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十进制,带符号数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-2147483648~2147483647* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十六进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFFFFFF* @param  Length 要显示数字的长度,范围:1~8* @retval 无*/
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i, SingleNumber;for (i = 0; i < Length; i++)							{SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;if (SingleNumber < 10){OLED_ShowChar(Line, Column + i, SingleNumber + '0');}else{OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');}}
}/*** @brief  OLED显示数字(二进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');}
}/*** @brief  OLED初始化* @param  无* @retval 无*/
void OLED_Init(void)
{uint32_t i, j;for (i = 0; i < 1000; i++)			//上电延时{for (j = 0; j < 1000; j++);}OLED_SPI_Init();			//端口初始化OLED_WriteCommand(0xAE);	//关闭显示OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率OLED_WriteCommand(0x80);OLED_WriteCommand(0xA8);	//设置多路复用率OLED_WriteCommand(0x3F);OLED_WriteCommand(0xD3);	//设置显示偏移OLED_WriteCommand(0x00);OLED_WriteCommand(0x40);	//设置显示开始行OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置OLED_WriteCommand(0x12);OLED_WriteCommand(0x81);	//设置对比度控制OLED_WriteCommand(0xCF);OLED_WriteCommand(0xD9);	//设置预充电周期OLED_WriteCommand(0xF1);OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别OLED_WriteCommand(0x30);OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭OLED_WriteCommand(0xA6);	//设置正常/倒转显示OLED_WriteCommand(0x8D);	//设置充电泵OLED_WriteCommand(0x14);OLED_WriteCommand(0xAF);	//开启显示OLED_Clear();				//OLED清屏
}/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char PI[])
{ 	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_SetCursor(y,x0);  //第一个设置y,第二个设置x//设置光标位置左上角(0,0) 往下0-7 , 往右0-127for(x=x0;x<x1;x++){      OLED_WriteData(PI[j++]);	    	//写数据}}
} void OLED_BMP(int i)
{	OLED_Clear();OLED_DrawBMP(0,0,127,0,PI[i]);OLED_DrawBMP(0,0,127,1,PI[i]);OLED_DrawBMP(0,0,127,2,PI[i]);OLED_DrawBMP(0,0,127,3,PI[i]);OLED_DrawBMP(0,0,127,4,PI[i]);OLED_DrawBMP(0,0,127,5,PI[i]);OLED_DrawBMP(0,0,127,6,PI[i]);OLED_DrawBMP(0,0,127,7,PI[i]);
}

OLED.h

#ifndef __OLED_H
#define __OLED_Hvoid OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);void OLED_BMP(int i);#endif

OLED_Front.h

因为太长了分享这个的链接

链接:https://pan.baidu.com/s/1Er8OAEL1WKFYcIfvhfVADg
提取码:yuks

五 、实现

将先前的字模复制到
在这里插入图片描述
从0开始,这是数组的第16个,所以我标一下15,在主函数中
在这里插入图片描述
就能显示,7是蝴蝶
在这里插入图片描述


http://www.ppmy.cn/news/628170.html

相关文章

尝试新增特殊分辨率(800x480)HDMI屏到RK3328(记录)

参考链接 https://www.cnblogs.com/lialong1st/p/9174475.html https://www.forlinx.com/article-new-c22/341.html https://www.cnblogs.com/zlh840/archive/2012/08/01/2618819.html https://blog.csdn.net/weixin_42569429/article/details/112950569 https://www.cnbl…

【PCtoLCD】OLED显示汉字和图片

文章目录 前言一、取模汉字1.设置2.显示汉字 二、显示图片1.照片格式转换2.图片取模 总结 前言 PCtoLCD工具链接下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1KxyWcgbkp3vRlvovru3gGw 提取码&#xff1a;bl3e 一、取模汉字 1.设置 (1)选择字符模式 (2)字符设…

随机点餐小程序开发 让你轻松挑选美食

不知道大家有没有跟小编一样的困扰&#xff0c;一到饭点就为吃什么而发愁&#xff0c;选来选去不知道点什么&#xff0c;浪费了不少时间精力。随着互联网的深入发展&#xff0c;随机点餐随机吃饭小程序系统的开发&#xff0c;帮助“选择困难症”患者解决了这个难题&#xff0c;…

[TI TDA4 J721E]TIOVX 单屏显示多路摄像头数据(Mosaic节点使用)

首先感谢阅读&#xff0c;如果您也对TDA4相关的开发感兴趣&#xff0c;我们这边有个学习交流微信群&#xff0c;可以入群和大家一起交流学习。 资历较浅&#xff0c;水平有限&#xff0c;如遇错误&#xff0c;请大家多指正&#xff01; 保持开源精神&#xff0c;共同分享、进…

Valens VS2000 系列HDBaseT2.0延长芯片

Valens Colligo VS2000 IC系列通过单个标准类别电缆汇聚和扩展A/V信号。Colligo芯片组支持扩展未压缩HDMI 1.4(4K604:2:0&#xff09;、高保真音频、100Mbps以太网、USB2.0、控制和电源&#xff0c;通过CAT电缆传输长达100米&#xff08;328英尺&#xff09;&#xff0c;无延迟…

KTM5000 KTM5010 KTM5020 KTM5030 MST扩展坞 多屏幕显示 多屏异显

支持多屏幕显示&#xff0c;支持单显8K&#xff0c;支持多屏异显 • USB Type-C DisplayPort Alt-mode de-mux  Simultaneous USB3.2 Gen2 and 2 lanes DP1.4a input OR 4 lanes DP1.4a input  Flip option for connector plug orientation  DP lane swap and polarity …

【01Studio MaixPy AI K210】7.IIC+OLED

目录 硬件准备&#xff1a; 引脚图&#xff1a; 01Studio K210核心板引脚 OLED引脚 电路连接 烧录驱动文件&#xff1a; 驱动文件 导包&#xff1a; I2C库 OLED库 配置I2C&#xff1a; 配置OLED&#xff1a; 例程&#xff1a; &#xff08;以下内容均为个人所学总结&am…

Markdown 入门基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…