STM32之在oled上实现文字滚动

本文内容:本文主要介绍怎么通过单片机控制7针的oled上实现文字滚动。

一、oled与SPI简介

(一)oled简介

有机发光二极管(OrganicLight-Emitting Diode,OLED),又称为有机电激光显示、有机发光半导体(OrganicElectroluminescence Display,OLED),是指有机半导体材料和发光材料在电场驱动下,通过载流子注入和复合导致发光的现象。

(二)SPI协议

7针oled需要用到SPI协议

SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,
要求通讯速率较高的场合。
SPI物理层
SPI通讯使用 3 条总线及片选线,3条总线分别为 SCK、MOSI、MISO
在这里插入图片描述

SPI协议层

与 I2C的类似,SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
SPI通信时序
在这里插入图片描述

二、获取自模

下载字模软件PCtoLCD
字模软件PCtoLCD
打开后先进行设置,如下图:
在这里插入图片描述
输入想要获取的文字,点击生成字模,下面会出现字码
在这里插入图片描述

三、oled主要代码

主函数

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
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(0x27,OLED_CMD);        //水平向左或者右滚动 26/27
  	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
	OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
	OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
	while(1) 
	{
		
	}
}

输出文字代码

void TEST_MainPage(void)
{	
	GUI_ShowCHinese(10,20,16,"小张从未入门",1);
	GUI_ShowString(4,48,"631904110130",16,1);
	delay_ms(1500);		
	delay_ms(1500);
}

添加的字模代码

字模在oledfont.c文件中

"小",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x11,0x04,
	0x21,0x04,0x21,0x02,0x41,0x02,0x81,0x02,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"小",0*/
	"张",0x01,0x00,0xF9,0x08,0x09,0x08,0x09,0x10,0x09,0x20,0x79,0x40,0x41,0x00,0x47,0xFE,
	0x41,0x40,0x79,0x20,0x09,0x20,0x09,0x10,0x09,0x08,0x09,0x44,0x51,0x82,0x21,0x00,/*"张",1*/
	"从",0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,
	0x08,0x50,0x14,0x50,0x12,0x50,0x12,0x88,0x20,0x88,0x21,0x04,0x42,0x04,0x84,0x02,/*"从",2*/
	"未",0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,
	0x03,0x80,0x05,0x40,0x09,0x20,0x11,0x10,0x21,0x08,0xC1,0x06,0x01,0x00,0x01,0x00,/*"未",3*/
	"入",0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x02,0x80,
	0x04,0x40,0x04,0x40,0x08,0x20,0x08,0x20,0x10,0x10,0x20,0x10,0x40,0x08,0x80,0x06,/*"入",4*/
	"门",0x20,0x00,0x13,0xFC,0x10,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,
	0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x14,0x40,0x08,/*"门",5*/

四、运行效果

连线如下

// OLED模块               STM32单片机
//   VCC         接       DC 5V/3.3V      //OLED屏电源正
//   GND         接          GND          //OLED屏电源地
//=======================================液晶屏数据线接线==========================================//
//本模块默认数据总线类型为4线制SPI
// OLED模块               STM32单片机
//   D1          接          PB15        //OLED屏SPI写信号
//=======================================液晶屏控制线接线==========================================//
// OLED模块               STM32单片机
//   CS          接          PB11        //OLED屏片选控制信号
//   RES         接          PB12        //OLED屏复位控制信号
//   DC          接          PB10        //OLED屏数据/命令选择控制信号
//   D0          接          PB13        //OLED屏SPI时钟信号

运行效果如图在这里插入图片描述

五、总结

本文的代码使用的其他大佬的代码改的,主要加了一些自己用到的字模,这次用到的是7针的oled的SPI协议,与4针的oled有所不同,4针为I2C的协议。oled里面的函数需要根据用到的字长和想要的位置进行相应的参数更改,否则可能达不到想要的效果。

六、参考文章

0.96寸OLED在STM32f103上实现滚动显示长字符
基于SPI通信方式的OLED显示
完整代码

要在STM32上的OLED屏幕上实现文字滚动效果,你可以按照以下步骤进行操作: 1. 首先,确保你已经连接好了OLED屏幕并正确配置了STM32的外设。 2. 创建一个字符数组,用于存储你想要滚动显示文字内容。 3. 在主循环中,使用一个变量来控制滚动的位置。可以使用一个循环计数器来逐步改变滚动位置。 4. 在每次循环迭代中,将字符数组中的内容根据滚动位置写入OLED屏幕。 5. 使用延时函数来控制滚动速度,并在每次迭代结束后更新滚动位置。 下面是一个示例代码,演示如何在STM32上的OLED屏幕上实现文字滚动效果: ```c #include "stm32f4xx_hal.h" #include "ssd1306.h" #define MAX_SCROLL_SIZE 128 // 最大滚动字符数 uint8_t scrollText[] = "Hello, World! This is a scrolling text example."; int main(void) { HAL_Init(); // 初始化OLED屏幕 ssd1306_Init(); int scrollPos = 0; int textLen = strlen((char*)scrollText); while (1) { // 清空屏幕 ssd1306_Fill(Black); // 将滚动文字绘制到屏幕上 for (int i = 0; i < ssd1306_GetWidth(); i++) { int charIndex = (i + scrollPos) % textLen; char c = scrollText[charIndex]; ssd1306_WriteChar(c, Font_7x10, White, i, 0); } // 刷新屏幕 ssd1306_UpdateScreen(); // 延时控制滚动速度 HAL_Delay(100); // 更新滚动位置 scrollPos++; if (scrollPos >= textLen) { scrollPos = 0; } } } ``` 这段示例代码假设你已经使用了名为ssd1306的库来控制OLED屏幕。你需要根据你使用的具体硬件和库进行适当的调整。 希望这能帮助到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张从未入门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值