使用OLED屏显示字符

一、OLED屏显和汉字点阵编码原理

OLED(Organic Light-Emitting Diode)屏幕是一种采用有机发光二极管技术的显示器。在嵌入式系统中,使用OLED屏幕显示汉字通常涉及到汉字点阵编码和SPI(Serial Peripheral Interface)协议的原理。

1. 汉字点阵编码原理:

汉字是由一定数量的点阵组成的,每个点阵可以表示一个汉字的一个字形。常见的汉字点阵编码方式有GB2312、GBK等。

  • GB2312编码: 汉字在GB2312编码中被划分为若干区和若干位,每个区包含94个字符,每个位包含94个字符。一个字符的GB2312编码由区号和位号组成,通过区位码可以找到相应的汉字。

  • GBK编码: GBK是GB2312的扩展,支持更多的汉字。GBK编码同样采用区位码的方式表示汉字。

2. SPI协议原理:

SPI是一种同步串行通信协议,通常用于连接芯片之间进行数据传输。在OLED屏幕中,SPI协议用于将图像数据发送到屏幕。

  • SPI总线: SPI总线通常包含四条线:SCLK(时钟线)、MOSI(主机发送数据到从机)、MISO(从机发送数据到主机,可选)、SS(片选线,选择从机)。通信是主从模式的,主机生成时钟信号,控制数据传输。

  • OLED的SPI通信: OLED屏幕通过SPI接口接收图像数据。图像数据可以是汉字的点阵数据。主机将点阵数据通过MOSI线发送到OLED屏幕,通过时钟同步控制数据传输。OLED屏幕根据接收到的数据在屏幕上显示相应的图像。

3. 显示汉字的流程:

  1. 汉字编码: 将要显示的汉字使用相应的编码方式(如GB2312或GBK)转换为区位码。

  2. 获取点阵数据: 根据汉字的区位码,从字库中获取对应的汉字点阵数据。

  3. SPI通信: 将获取到的汉字点阵数据通过SPI协议发送到OLED屏幕。

  4. OLED显示: OLED屏幕接收到数据后,在相应的位置显示汉字。

这个过程涉及到编码转换、点阵数据获取、SPI通信等步骤,需要根据具体的硬件和软件平台进行适配和实现。在实际应用中,通常会使用现成的字库和库函数来简化这个过程,例如,通过调用OpenCV等库来方便地显示汉字。

二、使用OLED显示自己的学号和姓名

1.在文字取模软件中设置相应选项
在这里插入图片描述

2.在该软件中输入文字并获取字模
在这里插入图片描述

3.在test.c的文件中TEST_MainPage函数位置编写

在这里插入图片描述

4.在oledfont.h文件中输入,进行文字存储
例:

 "侯",0x08,0x00,0x0B,0xF8,0x08,0x08,0x10,0x08,0x17,0xFE,0x31,0x00,0x31,0x00,0x53,0xF8,
	0x94,0x40,0x10,0x40,0x1F,0xFE,0x10,0x40,0x10,0xA0,0x11,0x10,0x12,0x08,0x1C,0x06,/*"侯",10*/

5.编写main.c文件

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       
	NVIC_Configuration(); 	  	
	OLED_Init();			         
	OLED_Clear(0);            
	while(1) 
	{	
		TEST_MainPage();        
		
	}
}

6.实现效果

在这里插入图片描述

三、使用OLED显示AHT20的温度和湿度

1.编写bsp_i2c.c中的read_AHT20函数

void read_AHT20(void)
{
	uint8_t   i;
	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}

	//-------------
	I2C_Start();

	I2C_WriteByte(0x71);
	ack_status = Receive_ACK();
	readByte[0]= I2C_ReadByte();
	Send_ACK();

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();

	//--------------
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("lyy");

	}

	t=T1/10;
	t1=T1%10;
	a=(float)(t+t1*0.1);
	h=H1/10;
	h1=H1%10;
	b=(float)(h+h1*0.1);
	sprintf(strTemp,"%.1f",a);  
    sprintf(strHumi,"%.1f",b);    
	GUI_ShowCHinese(16,00,16,"温湿度",1);
	GUI_ShowCHinese(16,20,16,"温度",1);
	GUI_ShowString(53,20,strTemp,16,1);
	GUI_ShowCHinese(16,38,16,"湿度",1);
	GUI_ShowString(53,38,strHumi,16,1);
	delay_ms(1500);		
	delay_ms(1500);
}

2.编写main.c文件

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"

#include "oled.h"
#include "gui.h"
#include "test.h"

int main(void)
{	
	delay_init();	    	        	  
	uart_init(115200);	 
	IIC_Init();
		  
	NVIC_Configuration(); 	  	
	OLED_Init();			        
	OLED_Clear(0); 
	while(1)
	{
		
		read_AHT20_once();
		OLED_Clear(0); 
		delay_ms(1500);
  }
}

3.在oledfont.h文件中输入
在这里插入图片描述

4.实物链接

在这里插入图片描述

SCL连接PB6,SDA连接PB7

5.实现效果

温湿度

四、使用OLED上下或左右的滑动显示长字符

1.编写mainc.文件

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       
	NVIC_Configuration(); 	   
	OLED_Init();			        
	OLED_Clear(0);             
	OLED_WR_Byte(0x2E,OLED_CMD);      
  OLED_WR_Byte(0x27,OLED_CMD);        
  OLED_WR_Byte(0x00,OLED_CMD);        
	OLED_WR_Byte(0x00,OLED_CMD);      
	OLED_WR_Byte(0x07,OLED_CMD);       
	OLED_WR_Byte(0x07,OLED_CMD);        
	OLED_WR_Byte(0x00,OLED_CMD);        
	OLED_WR_Byte(0xFF,OLED_CMD);        
	TEST_MainPage();
	OLED_WR_Byte(0x2F,OLED_CMD);        
	while(1) 
	{	
		
	}
}

2.在oledfont.h文件中输入
在这里插入图片描述
3.编辑test.c

void TEST_MainPage(void)
{	

	GUI_ShowCHinese(10,20,16,"为世界上所有的美好而战",1);
	
	//GUI_ShowString(40,32,"64X128",16,1);
	//GUI_ShowString(4,48,"www.lcdwiki.com",16,1);*/
	delay_ms(500);		
	delay_ms(500);
}

3.实现效果

滚动

五、总结

本次实验的内容为使用OLED屏显示字符

在嵌入式系统中,OLED屏幕作为一种新型的显示技术,具有自发光、高对比度、快速响应等特点。本次实验的目的是通过编程控制OLED屏,实现字符的显示,为深入了解嵌入式系统图形显示技术打下基础。

通过查阅手册和编写实际的程序,深入理解了OLED屏的工作原理,包括通信协议、控制命令、显示像素等方面的知识。学到了如何在嵌入式系统中进行硬件编程,包括使用特定的库函数和调用底层接口来控制OLED屏的显示。

六、参考

【嵌入式16】STM32+OLED屏显应用实例

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值