SPI驱动OLED

OLED像素发光原理

OLED-有机发光半导体,在有机高分子聚合物的两端施加电压可发光,LED基于金属硅片发光,而OLED可以附于玻璃、塑料,可以用OLED做出曲面屏折叠屏,不同于LCD,OLED没有背光板,每个像素可以独立发光,基于这个特点,OLED可以做息屏提醒

既然每个像素都独立发光,如何控制像素显示需要的图像

 如果使每个像素都独立引出正负极,可以但是需要连接的导线太多,显然是不行的。简化成每行每列引出正负级,采用逐行显示的方法,直到最后一行,依次循环,要求循环频率>24次/s肉眼才能看到完整的画面,OLED所有像素的阴极连接一起接地,OLED共阴

控制芯片控制OLED不断的逐行扫描,单片机连接控制芯片,向控制芯片发送要显示的内容

那么如何显示字符或者一个图画

解读数据手册这一段:GOODRAM是静态的RAM,大小128 x 64位,RAM被分为8个页面。从PAGE0 - PAGE7,也就是将64行分为8个部分,每页对应128个字节,低位在上,高位在下,每页的每列表示一个字节

那么可以定义二维数组GDDRAM[128][8]缓存在GDDRAM中,控制每个像素的阳极,这就需要依赖取模软件对字符或图片生成相应的数组

驱动SPI与OLED进行通讯

OLED显示字符

1.驱动STM32的spi,根据数据手册配置相应的GPIO ,需要注意的是OLED只需要两根线就能完成通讯,配置SPI时只需要SCK和MOSI对应的引脚

static void hal_OledConfig(void)
{SPI_InitTypeDef  SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* Enable SPI1 and GPIOA clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);/* Configure SPI1 pins: SCK, MOSI */GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//OLED¸´Î»Òý½ÅGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_4);//OLEDÃüÁî/Êý¾Ý¿ØÖÆÒý½ÅGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_6);/* SPI1 configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; //SPI1ÉèÖÃΪÁ½ÏßÈ«Ë«¹¤SPI_InitStructure.SPI_Mode = SPI_Mode_Master;	                     //ÉèÖÃSPI1ΪÖ÷ģʽSPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI·¢ËͽÓÊÕ8λ֡½á¹¹SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;	 		                   //´®ÐÐʱÖÓÔÚ²»²Ù×÷ʱ£¬Ê±ÖÓΪ¸ßµçƽSPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;		                   //µÚ¶þ¸öʱÖÓÑØ¿ªÊ¼²ÉÑùÊý¾ÝSPI_InitStructure.SPI_NSS = SPI_NSS_Soft;			                     //NSSÐźÅÓÉÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀíSPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //¶¨Ò岨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ8SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;				         //Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼SPI_InitStructure.SPI_CRCPolynomial = 7;						               //CRCÖµ¼ÆËãµÄ¶àÏîʽSPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1  */SPI_Cmd(SPI1, ENABLE); 											  //ʹÄÜSPI2ÍâÉè}

2.确定OLED选择SPI进行通讯时支持哪种工作模式。查看数据手册,空闲状态时,SCLK为高电平,CPOL=1;在第二个跳变沿采样,CPHA=1,说明3线的SPI支持工作模式三,配置主机是需要与从机保持一致

分析通讯的数据格式:每九个时钟周期,总共有9位将被顺序移入移位寄存器:D/C#位,D7到D0位。D/C#位(顺序数据的第一个位)将确定移位寄存器中的后续数据字节是写入显示数据RAM(D/C#位=1)还是命令寄存器(D/C#位=0)

3.OLED引脚解读

复位引脚:拉低是,芯片的初始化被执行,在正常操作期间,保持这个引脚高电平

数据命令控制引脚:拉高时,SDA引脚上传送的数据被视为数据;拉低是。SDA传送的数据被视为命令传送到寄存器

4.修改OLED驱动的部分代码。

烧录程序时发现并不显示效果,官方提供的代码, 使用软件模拟spi,但是配置的GPIO信号来源于SPI外设,修改方式,要么不复用GPIO,要么将代码修改成硬件实现SPI通讯。

void OLED_WR_Byte(u8 dat,u8 cmd)
{	u8 i;			  if(cmd)OLED_DC_Set();else OLED_DC_Clr();		  OLED_CS_Clr();for(i=0;i<8;i++){			  OLED_SCL_Clr();if(dat&0x80)OLED_SDA_Set();else OLED_SDA_Clr();OLED_SCL_Set();dat<<=1;   }				 		  OLED_CS_Set();OLED_DC_Set();   	  
}

修改后的结果:

static void hal_Oled_WR_Byte(unsigned char dat,unsigned char cmd)
{	unsigned char retry=0;		if(cmd){OLED_DC_Set();}else {OLED_DC_Clr();		  }SPI1->DR=dat;	 	  //·¢ËÍÒ»¸öbyte retry=0;while((SPI1->SR & SPI_I2S_FLAG_BSY) != RESET){retry++;if(retry>200)return;}	  						    OLED_DC_Set();   }
OLED显示汉字

首先分析取模软件生成的数组。以16X16的汉字为例,按照取模方式判断数组对应的每一列,以列行式为例。取模方式如下:

  中(0) 景(1) 园(2) 电(3) 子(4)DB 00H 00H F0H 10H 10H 10H 10H FFH 10H 10H 10H 10H F0H 00H 00H 00H 00H 00H 0FH 04H 04H 04H 04H FFH 04H 04H 04H 04H 0FH 00H 00H 00H;"中",0
DB 40H 40H 40H 5FH 55H 55H 55H 75H 55H 55H 55H 5FH 40H 40H 40H 00H 00H 40H 20H 0FH 09H 49H 89H 79H 09H 09H 09H 0FH 20H 40H 00H 00H;"景",1
DB 00H FEH 02H 42H 4AH CAH 4AH 4AH CAH 4AH 4AH 42H 02H FEH 00H 00H 00H FFH 40H 50H 4CH 43H 40H 40H 4FH 50H 50H 5CH 40H FFH 00H 00H;"园",2
DB 00H 00H F8H 88H 88H 88H 88H FFH 88H 88H 88H 88H F8H 00H 00H 00H 00H 00H 1FH 08H 08H 08H 08H 7FH 88H 88H 88H 88H 9FH 80H F0H 00H;"电",3
DB 80H 82H 82H 82H 82H 82H 82H E2H A2H 92H 8AH 86H 82H 80H 80H 00H 00H 00H 00H 00H 00H 40H 80H 7FH 00H 00H 00H 00H 00H 00H 00H 00H;"子",4

额,显示汉字的话有一定的针对性,不好写,不如使用源代码,需要手动改变汉字数组,不如字符灵活 

void hal_Oled_ShowChinese(unsigned char x,unsigned char y,unsigned char num,unsigned char size1,unsigned char mode,unsigned char **Hzk1 )
{
u8 m,temp;u8 x0=x,y0=y;u16 i,size3=(size1/8+((size1%8)?1:0))*size1;  //得到字体一个字符对应点阵集所占的字节数for(i=0;i<size3;i++){if(size1==16){temp=Hzk1[num][i];}//调用16*16字体else if(size1==24){temp=Hzk2[num][i];}//调用24*24字体else if(size1==32)       {temp=Hzk3[num][i];}//调用32*32字体else if(size1==64){temp=Hzk4[num][i];}//调用64*64字体else return;for(m=0;m<8;m++){if(temp&0x01)hal_Oled_DrawPoint(x,y,mode);else hal_Oled_DrawPoint(x,y,!mode);temp>>=1;y++;}x++;if((x-x0)==size1){x=x0;y0=y0+8;}y=y0;}}
OLED显示图片

  1. 使用Img2Lcd将JPG格式改成BMP格式,并且分辨率为128X64
  2. 使用取模软件将图片转为代码

但是显示的图片是乱码,什么原因

    hal_Oled_ShowPicture(0,0,63,64,BMP1,1);显示图片函数显示图片的大小为BMP图片像素的大小,通过观察Img2Lcd软件可以得出63,64,显示正常,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551297.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

墙绘产品展示:基于SpringBoot的解决方案

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

scrapy 爬取微博(五)【最新超详细解析】: 爬取微博文章

1 读取配置参数 爬取微博文章首先需要读取settings.py中的设置的配置变量&#xff0c;然后编写爬虫&#xff0c;读取的配置变量主要有爬取的关键词、时间范围、爬取区域等。 class WeiboSearchSpider(scrapy.Spider):name weibo_searchallowed_domains [weibo.com]settings…

记一次J1900主板短路报废

记一次J1900主板短路报废 一、主板样貌 J1900的CPU&#xff0c;板载4GB内存&#xff0c;64GB固态&#xff0c;双千M&#xff0c;又HDMI。就是这个电源线&#xff0c;右上角是用线连接的。 二、缘由 前两天接了一个转接板&#xff0c;为了给新增的机械硬盘供电。上午刚测试…

演讲干货整理:泛能网能碳产业智能平台基于 TDengine 的升级之路

在 7 月 26 日的 TDengine 用户大会上&#xff0c;新奥数能 / 物联和数据技术召集人袁文科进行了题为《基于新一代时序数据库 TDengine 助力泛能网能碳产业智能平台底座升级》的主题演讲。他从泛能网能碳产业智能平台的业务及架构痛点出发&#xff0c;详细分享了在数据库选型、…

【最新华为OD机试E卷-支持在线评测】字符串分割转换(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

Flux 最新最快ControlNet模型现身:法线贴图详细测评

原文链接&#xff1a;Flux目前最快ControlNet模型现身&#xff01;法线贴图详细测评 (chinaz.com) Flux目前最快ControlNet模型现身&#xff01; 上周一个名叫JasperAI的团队开源了他们的 3 款Flux ControlNet&#xff0c;分别是法线贴图&#xff0c;深度&#xff0c;和升频器…

8608 实现二叉排序树的各种算法(2)

### 思路 1. **插入新结点**&#xff1a;在二叉排序树中插入新结点。 2. **遍历二叉树**&#xff1a;实现前序、中序、后序遍历。 3. **中序遍历的非递归算法**&#xff1a;使用栈实现中序遍历。 4. **层次遍历二叉树**&#xff1a;使用队列实现层次遍历。 5. **查找给定关键字…

【U8+】安装用友U8+16.5后,应用服务管理中缺少加密服务。

【问题描述】 安装用友U8+后,应用服务管理中,没有加密服务。 导致软件无法登录到加密服务器。 【解决方法】 此问题多为CPU所影响: 1、深信服和霆智虚拟机需要开启HOST CPU选项。不开启此选项无法发挥CPU的全部功能,对U8和SQL Server的性能影响很大,所以在U8V16.5中要求开…

排序算法之——归并排序,计数排序

文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1&#xff09;递归版本2&#xff09;非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结&#xff08;排序算法稳定性&am…

荣耀问鼎!宏山激光斩获2024年度行业创新大奖

8月28日&#xff0c;由高科技行业门户OFweek维科网主办的“维科杯OFweek2024激光行业年度评选”于中国深圳成功举办。宏山激光凭借出类拔萃的技术创新实力与卓越品质&#xff0c;成功斩获“维科杯OFweek2024年度激光行业最佳智能装备/自动化产线技术创新奖”。 这一殊荣绝非偶然…

RabbitMQ的应用问题

一、幂等性保障 幂等性是数学和计算机科学中某些运算的性质, 它们可以被多次应⽤, ⽽不会改变初始应⽤的结果 数学上的幂等性&#xff1a; f(x)f(f(x)) |x| 数据库操作幂等性&#xff1a; 数据库的 select 操作. 不同时间两次查询的结果可能不同, 但是这个操作是符合幂等性…

profinet转Ethernet网关在工业现场如何应用

一、项目背景 在某工业自动化系统中&#xff0c;现有的设备采用Profinet通信协议&#xff0c;而新引入的一些智能设备只支持Ethernet通信。为了实现不同协议设备之间的互联互通&#xff0c;决定采用开疆智能Profinet转Ethernet网关来解决通信兼容性问题。 二、硬件准备 1.支持P…

《C++》解密--单链表

目录 一、概念与结构 二、实现单链表 三、链表的分类 四、单链表算法题 一、概念与结构 1、节点 结点的组成主要有&#xff1a;当前结点要保存的数据和保存下一个节点的地址&#xff08;指针变量&#xff09; 图中指针变量plist保存的是第一个结点的地址&#xff0c;我们称p…

极限电流型氧传感器的工作原理以及有哪些应用场景?

极限电流型氧传感器的工作原理&#xff1a; 极限电流型氧传感器的工作原理基于稳定ZrO2固体电解质的氧泵作用。在已稳定化ZrO2两侧被覆铂电极&#xff0c;阴极侧用有气体扩散孔的罩接合&#xff0c;形成阴极空腔。在一定的温度下&#xff0c;当ZrO2电极两侧加一定电压时&#…

【渗透实战系列】|App渗透 ,由sql注入、绕过人脸识别、成功登录APP

涉及知识点 1、APP抓包和逆向破解加密算法&#xff1b; 2、解密参数&#xff0c;寻找注入点&#xff1b; 3、Union注入构造万能密码&#xff1b; 4、利用忘记密码功能&#xff0c;burpsuite爆破用户名&#xff1b; 5、解密短信验证数据包&#xff0c;绕过验证码&#xff0c;成功…

Docker笔记-Docker磁盘空间清理

无用的容器指的是已经停止运行且处于非活跃状态的容器。无用的镜像包括没有被任何容器使用的镜像&#xff0c;或者是被标记为"<none>"的镜像&#xff0c;通常是构建过程中产生的无标签镜像。 通过执行 docker container ls -a 和 docker image ls -a 命令&…

2024年软考——系统规划与管理师30天冲刺学习指南!!!

距离2024下半年软考系统规划与管理师考试已经只剩一个多月了&#xff0c;还没有开始备考的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前30天学习指南。本指南包括考情分析、学习规划、冲刺攻略三个部分&#xff0c;可以参考此指南进行最后的复…

墙绘艺术在线交易平台:SpringBoot技术详解

4 系统设计 墙绘产品展示交易平台的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没…

【视频目标分割-2024CVPR】Putting the Object Back into Video Object Segmentation

Cutie 系列文章目录1 摘要2 引言2.1背景和难点2.2 解决方案2.3 成果 3 相关方法3.1 基于记忆的VOS3.2对象级推理3.3 自动视频分割 4 工作方法4.1 overview4.2 对象变换器4.2.1 overview4.2.2 Foreground-Background Masked Attention4.2.3 Positional Embeddings 4.3 Object Me…

RabbitMQ的高级特性-死信队列

死信(dead message) 简单理解就是因为种种原因, ⽆法被消费的信息, 就是死信. 有死信, ⾃然就有死信队列. 当消息在⼀个队列中变成死信之后&#xff0c;它能被重新被发送到另⼀个交换器 中&#xff0c;这个交换器就是DLX( Dead Letter Exchange ), 绑定DLX的队列, 就称为死信队…