首页 > 编程知识 正文

oled,oled像素电路7t1c原理

时间:2023-05-05 01:16:11 阅读:51358 作者:1336

转动OLED屏幕一、概要(一) SPI协议概要)二) OLED屏幕概要)二、OLED屏幕滚动显示长字符)一)常用的OLED屏幕滚动命令1 .水平向左/向右移动2 .垂直和水平移动2 )取字

一、个人资料(一) SPI协议个人资料通讯开始/停止

顺便说一下,NSS信号线从高变为低,是SPI通信的启动信号。 NSS是各从站各自独占的信号线,从站在自己的NSS线上检测到开始信号后,知道自己被选为主机,开始准备与主机通信。

图中的符号显示,NSS信号从低变为高,是SPI通信的停止信号,表示本次通信结束,从站的选择状态被解除。

数据有效传输

SPI使用MOSI和MISO信号线传输数据,使用SCK信号线同步数据。

MOSI和MISO数据线在SCK的每个时钟周期传输1位数据,数据输入输出同时进行。

图片来源: SPI协议详情(文字和文章)超详细)

从上图可以看出,传输数据0X53时,数据开始逐位传输,在时钟的上升沿收集数据。

时钟极性与时钟周期

时钟极性CPOL是指SPI通信设备空闲时SCK信号线的电平信号,即SPI通信开始前、NSS线为高电平时的SCK的状态。 CPOL=0时,SCK空闲时为低电平,CPOL=1时相反。

时钟相位CPHA是对数据进行采样的定时,如果CPHA=0,则MOSI或MISO数据线上的信号在SCK时钟线的“奇数沿”被采样。 如果CPHA=1,则在SCK的“偶数边缘”对数据线进行采样。

(二) OLED的概述OLED (有机发光二极管)也被称为有机El显示器、有机发光半导体(organicelectroluminesencedisplay、OLED )。 OLED是电流型有机发光器件,是载流子注入和复合发光的现象,发光强度与注入的电流成正比。 OLED在电场的作用下,阳极产生的空穴和阴极产生的电子移动,分别注入空穴传输层和电子传输层,移动到发光层。 两者在发光层相遇时,产生能量激子,从而激发发光分子,最终产生可见光。

http://www.Sina.com/http://www.Sina.com /

有关0.96英寸OLED显示器的详细说明,请参阅以下链接

33558 www.LCD wiki.com/zh/0.96 inch _ SPI _ OLED _ module

实物图

二、OLED滚动显示长字符(一)常用OLED滚动命令1 .水平左/右移动

OLED_wr_byte(0x2e,OLED_CMD ); //关闭滚动OLED_wr_byte(0x27,OLED_CMD ); //水平滚动26 (从左向右滑动(/27 )从右向左滑动) OLED_wr_byte(0x00,OLED_CMD ); //虚拟字节OLED_wr_byte(0x00,OLED_CMD ); //起始页0OLED_wr_byte(0x07,OLED_CMD ); //滚动时间间隔OLED_wr_byte(0x07,OLED_CMD ); //结束页7OLED_wr_byte(0x00,OLED_CMD ); //虚拟字节OLED_wr_byte(0xff,OLED_CMD ); //虚拟字节OLED_wr_byte(0x2f,OLED_CMD ); 打开//滚动注意事项:此命令设置水平滚动参数,以确定滚动的开始页、结束页和滚动速度

在调用此命令之前,必须禁用水平滚动(2Eh )。 如果不禁用,RAM的内容会发生错误。

2 .垂直和水平移动

OLED_wr_byte(0x2e,OLED_CMD ); //关闭滚动OLED_wr_byte(0x2a,OLED_CMD ); //垂直和水平滚动29 (垂直向上、水平向右(/2a )垂直向上、水平向左) OLED_wr_byte(0x00,OLED_CMD ); //虚拟字节OLED_wr_byte(0x00,OLED_CMD ); //起始页0OLED_wr_byte(0x07,OLED_CMD ); //滚动时间间隔OLED_wr_byte(0x07,OLED_CMD ); //结束页1OLED_wr_byte(0x01,OLED_CMD ); //垂直滚动偏移OLED_wr_byte(0x2f,OLED_CMD ); 打开//滚动此命令设置垂直滚动和水平滚动参数,并确定滚动的开始页、结束页、滚动速度和垂直滚动的偏移。

OLED_WR_B

yte(0x01,OLED_CMD); //垂直滚动偏移量

注意:如果垂直滚动偏移为0, 那么只将发生水平滚动(和命令26/27h一样)
滚动需要在调用此命令前禁用(2Eh), 否则RAM中的内容将会出错

(二)取字模

对想要显示的字体进行取模

取模选项

修改相应的格式如下并添加到对应程序中去

"山",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x080x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x00,0x08,0x00,0x00/*"山",0*/"有",0x02,0x00,0x02,0x00,0xFF,0xFE,0x04,0x00,0x04,0x00,0x0F,0xF0,0x08,0x10,0x18,0x100x2F,0xF0,0x48,0x10,0x88,0x10,0x0F,0xF0,0x08,0x10,0x08,0x10,0x08,0x50,0x08,0x20/*"有",1*/"木",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x03,0x80,0x05,0x40,0x05,0x400x09,0x20,0x11,0x10,0x21,0x08,0x41,0x04,0x81,0x02,0x01,0x00,0x01,0x00,0x01,0x00/*"木",2*/"兮",0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,0x10,0x10,0x20,0x08,0xDF,0xF6,0x04,0x000x08,0x00,0x0F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x01,0x40,0x00,0x80/*"兮",3*/ (三)OLED屏滑动演示

显示数据函数

void TEST_MainPage(void){GUI_ShowCHinese(28,20,16,"山有木兮",1);GUI_ShowString(4,38,"631904110219",16,1);delay_ms(1500);delay_ms(1500);}

垂直和水平滚动

int main(void){delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑)OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动OLED_WR_Byte(0x2a,OLED_CMD); //垂直和水平滚动 29(垂直向上,水平向右)/2a(垂直向上,水平向左)OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节OLED_WR_Byte(0x00,OLED_CMD); //起始页 0OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔OLED_WR_Byte(0x07,OLED_CMD); //终止页 1OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量TEST_MainPage(); //测试函数OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动while(1){}

演示效果

水平滑动显示歌词

参考以上方式,修改代码,水平滑动显示歌词

三、OLED显示温湿度 main函数 int main(void){delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑)while(1) { TEST_MainPage(); //学号、姓名显示OLED_Clear(0); for(i=0;i<5;i++) { TEST_Menu2(); //AHT20温湿度显示 delay_ms(1000); } OLED_Clear(0); }} TEST_Menu2()函数 void TEST_Menu2(void){u32 CT_data[2]; volatile int c1=0,t1=0; srand(123456);delay_ms(40);AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次c1 = CT_data[0]*100*10/1024/1024; //湿度 t1 = CT_data[1]*200*10/1024/1024-500; //温度GUI_DrawLine(0, 10, WIDTH-1, 10,1);GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1);GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1);GUI_ShowString(0,1,"2021-11-21",8,1);GUI_ShowString(74,1,"Sunday",8,1);GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1);GUI_ShowString(WIDTH/2+1,13,"TEMP",8,1);//显示温度GUI_DrawCircle(WIDTH-20, 25, 1,2);GUI_ShowString(WIDTH-15,20,"C",16,1);GUI_ShowNum(WIDTH/2+8,20,t1/10,2,16,1);GUI_ShowString(WIDTH-41,26,".",8,1);GUI_ShowNum(WIDTH-35,20,t1%10,1,16,1);GUI_ShowString(WIDTH/2+1,39,"HUM",8,1);//显示湿度GUI_ShowNum(WIDTH/2+8,46,c1/10,2,16,1);GUI_ShowString(WIDTH-41,52,".",8,1);GUI_ShowNum(WIDTH-35,46,c1%10,1,16,1);GUI_ShowString(WIDTH-21,46,"%",16,1);GUI_DrawBMP(6,16,51,32, BMP5, 1);delay_ms(1000);}

其中AHT20温湿度采集的部分,可参考小编的另一篇博客

AHT20温湿度采集(I2C协议)

演示效果


总结

对比分析I2C与SPI协议,两者都有其优缺点。SPI协议支持全双工、传输速率较高、有很好的扩展性;但是SPI只支持一个主机模式,并且设备越多,所要占用主机的接口就越多。相比而言,I2C用很轻盈的架构实现了多主设备仲裁和设备路由,没有固定的主机,便于转换;但是数据大小限制在8位、传输速度低于SPI。
总的来说,I2C、SPI协议是用于系统内各设备芯片的主流协议,这些协议是如此的优美,以至于我们从系统内的“小协议”到理解系统间的“大协议”是很有帮助的。

以上若有不当之处,敬请指教。

参考

《零死角玩转STM32-基于野火指南者开发板PDF》及系列资料

SSD1306(OLED驱动芯片)指令详解

基于SPI通信方式的OLED显示

SSD1306-0.96寸oled屏-滚动指令介绍

基于STM32的0.96寸OLED屏滚动显示长字符

SPI协议详解(图文并茂+超详细)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。