转动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中的内容将会出错
对想要显示的字体进行取模
取模选项
修改相应的格式如下并添加到对应程序中去
显示数据函数
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协议详解(图文并茂+超详细)