OLED滚动显示汉字

一、实验任务

理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

  1. 显示自己的学号和姓名;

  2. 显示AHT20的温度和湿度;

  3. 上下或左右的滑动显示长字符,比如“Hello,欢迎来到******物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

功能(1)(2)见前面的文章,本篇文章实现功能(3)

二、OLED滚动指令

参考文章:
http://www.51hei.com/bbs/dpj-180145-1.html

1、水平左右移动

 OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
        OLED_WR_Byte(0x26,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);        //虚拟字节
        OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

2、设置垂直和水平滚动

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
        OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
        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);        //终止页 1
        OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
        OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

垂直滚动偏移量=0时,就只有水平左右移了。
通过设置起始页 终止页 被设置的区域就垂直和水平滚动,,其余的区域就只有垂直滚动

3、设置滚动区域

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
        OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
        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);        //终止页 1
        OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量

三、程序编写

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);        //终止页 8
	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
	while(1) 
	{	
		
	}
}

其中OLED_WR_Byte(0x2F,OLED_CMD) 的内容:

void TEST_MainPage(void)
{	

	GUI_ShowCHinese(10,20,16,"好好学习嵌入式",1);
	delay_ms(500);		
	delay_ms(500);
}

GUI_ShowCHinese()函数中的内容:

void GUI_ShowCHinese(u8 x,u8 y,u8 hsize,u8 *str,u8 mode)
{ 
	while(*str!='\0')
	{
		if(hsize == 16)
		{
			GUI_ShowFont16(x,y,str,mode);
		}
		else if(hsize == 24)
		{
			GUI_ShowFont24(x,y,str,mode);
		}
		else if(hsize == 32)
		{
			GUI_ShowFont32(x,y,str,mode);
		}
		else
		{
			return;
		}
		x+=hsize;
		if(x>WIDTH-hsize)
		{
			x=0;
			y+=hsize;
		}
		str+=2;
	}			
}

查找GUI_ShowFont16->typFNT_GB16得到

typedef struct 
{
	unsigned char Index[2];	
	char Msk[32];
}typFNT_GB16; 

在文字取模软件中提取“好好学习嵌入式”的模(具体操作方法见“OLED屏显示自己的名字和学号(1)文章中”)
在这里插入图片描述
将字模复制粘贴到cfont16中:

const typFNT_GB16 cfont16[] = 
{
   "好",0x10,0x00,0x10,0xFC,0x10,0x04,0x10,0x08,0xFC,0x10,0x24,0x20,0x24,0x20,0x25,0xFE,
	0x24,0x20,0x48,0x20,0x28,0x20,0x10,0x20,0x28,0x20,0x44,0x20,0x84,0xA0,0x00,0x40,
	"学",0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
	0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
	"习",0x00,0x00,0x7F,0xF8,0x00,0x08,0x00,0x08,0x08,0x08,0x04,0x08,0x02,0x08,0x02,0x08,
	0x00,0x68,0x01,0x88,0x0E,0x08,0x70,0x08,0x20,0x08,0x00,0x08,0x00,0x50,0x00,0x20,
	"天",0x00,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,
	0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x08,0xC0,0x06,
	"向",0x02,0x00,0x04,0x00,0x08,0x00,0x7F,0xFC,0x40,0x04,0x40,0x04,0x47,0xC4,0x44,0x44,
	0x44,0x44,0x44,0x44,0x44,0x44,0x47,0xC4,0x44,0x44,0x40,0x04,0x40,0x14,0x40,0x08,
	"上",0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xF8,0x02,0x00,
	0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xFE,0x00,0x00,
    "嵌",0x01,0x00,0x21,0x08,0x21,0x08,0x3F,0xF8,0x00,0x20,0x22,0x20,0x22,0x3E,0xFF,0x42,
    0x22,0x94,0x22,0x10,0x3E,0x10,0x22,0x10,0x22,0x28,0x3E,0x28,0x22,0x44,0x00,0x82,
	"入",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,
    "式",0x00,0x48,0x00,0x44,0x00,0x44,0x00,0x40,0xFF,0xFE,0x00,0x40,0x00,0x40,0x3E,0x40,
    0x08,0x40,0x08,0x40,0x08,0x20,0x08,0x22,0x0F,0x12,0x78,0x0A,0x20,0x06,0x00,0x02,

};

编译程序无报错,烧录之后显示(由于CSDN 的视频一直审核没有通过,所以只能放两张滚动的图片):
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在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屏幕。你需要根据你使用的具体硬件和库进行适当的调整。 希望这能帮助到你!如果有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值