汉字点阵与OLED屏显

本文介绍了OLED屏显技术与汉字点阵编码原理,展示了如何在嵌入式系统中通过SPI接口和GB2312/GBK编码显示汉字,以及如何在OpenCV和OLED屏幕上显示文本和实时数据,如AHT20传感器的温度和湿度。还涵盖了滑动显示长字符的方法。
摘要由CSDN通过智能技术生成


前言

OLED屏显和汉字点阵编码原理是相互关联的。汉字点阵编码是一种将汉字转化为机器可读的形式,而OLED屏显则是将这种编码以图像的形式呈现在屏幕上。以下是对这两个原理的详细解释:

汉字点阵编码原理:
汉字点阵编码是将汉字拆分成一系列的点,每个点用二进制表示,通过控制每个点的亮灭,形成完整的汉字图像。这种编码方式使得每个汉字都可以被精确地显示,无论在何种分辨率下,都能保持清晰。

常见的汉字点阵编码方式有GB2312、GBK等。GB2312编码将汉字划分为若干区和若干位,每个区包含94个字符,每个位包含94个字符。一个字符的GB2312编码由区号和位号组成,通过区位码可以找到相应的汉字。GBK编码是GB2312的扩展,支持更多的汉字。GBK编码同样采用区位码的方式表示汉字。

OLED屏显原理:
OLED屏显是一种屏幕显示技术,它具有自发光的特性,可以呈现出鲜艳、细腻的图像。在OLED屏幕上显示汉字时,每个汉字的每个笔划都可以被独立控制,从而使得汉字的显示更加细腻、自然。

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


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

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

  1. 汉字点阵编码原理:

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

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

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

  1. SPI协议原理:

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

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

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

  1. 显示汉字的流程:

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

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

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

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

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

二、传输文件

一、实验内容
本次实验是串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。

连接电路

准备两个USB TO TTL和四根杜邦线,将两个USB TO TTL的RXD,TXD引脚交叉连接,并将两个USB接口接上两台笔记本电脑,发送端TXD灯亮,接收端RXD灯亮
在这里插入图片描述
三、传输文件
启动串口调试助手并打开串口,将两台电脑设置成相同的波特率,本例使用115200波特率
在这里插入图片描述
发送完成
在这里插入图片描述
接收端勾选以下选项
在这里插入图片描述
接收端情况如下:
在这里插入图片描述
在这里插入图片描述
接收成功!

三、OpenCV下的文字与图片的叠加

下载opencv
下载地址:https://opencv.org/releases/
点击Sources进行下载自己需要的版本
安装opencv参考:https://blog.csdn.net/public669/article/details/99044895
准备文件:
一张需要显示的图片

24x24的点阵hz文件

ASCII码.zf文件

需要显示的文本文件
在这里插入图片描述
运行:
在这里插入图片描述
运行结果:
在这里插入图片描述

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

1.在文字取模软件中设置相应选项

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

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

void TEST_MainPage(void)
{	

	GUI_ShowCHinese(28,20,16,"ʯÑâ·å",1);
	GUI_ShowString(4,48,"12345678910",16,1);
	delay_ms(1500);		
	delay_ms(1500);
}

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

0x00,0x10,0x18,0x10,0x10,0x10,0x11,0x17,0x1F,0x1C,0x10,0x10,0x10,0x10,0x10,0x10,
0x30,0x30,0x30,0x00,0x02,0x06,0x0C,0x1C,0x38,0xF0,0xFF,0xFF,0x41,0x41,0x41,0x41,
0x41,0x41,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x07,0x07,0x00,0x01,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*ʯ*/


  0x98,0x98,0xF8,0xF6,0xFE,0xFE,0xF0,0xF8,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x07,0x07,0x00,0x01,0x01,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0xF8,0xF6,0xFE,0xFE,0xF0,0xF8,
0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*Ñâ*/


  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*·å*/

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.实现效果

在这里插入图片描述

六、上下或左右的滑动显示长字符

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);        //开启滚动

垂直和水平滚动

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);        //开启滚动

2、代码撰写
在添加文字字模代码->oledfont.h文件

OLED显示函数test.c

void TEST_MainPage(void)
{	
	GUI_ShowCHinese(10,20,16,"欢迎",1);
	GUI_showString(10,20,"hello",10)
	delay_ms(1500);		
	delay_ms(1500);
}


主函数main.c文件

#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);        //开启滚动
}


3、效果展示
在这里插入图片描述

总结

在这篇博客中,我们探讨了汉字点阵与OLED屏显的相关原理和应用。汉字点阵编码技术将每个汉字拆分成一系列的点,通过控制每个点的亮灭,形成完整的汉字图像。这种编码方式使得每个汉字都能被精确地显示,无论在何种分辨率下,都能保持清晰。而OLED屏显技术则是一种自发光的屏幕显示技术,它具有色彩鲜艳、视角广等优点,可以呈现出细腻、自然的图像。

通过将汉字点阵编码技术与OLED屏显技术相结合,我们可以实现高清晰度、广视角、颜色丰富以及节能环保的汉字显示效果。这种结合的优势在于,它可以在各种大小和分辨率的屏幕上显示清晰的汉字,同时还能保持OLED屏幕的自发光特性和广视角特性。

在实际应用中,汉字点阵编码技术和OLED屏显技术被广泛应用于各种电子设备中,如手机、平板电脑、电子书阅读器等。在这些设备中,汉字点阵编码技术可以将文字信息转化为图像信息,而OLED屏显技术则可以将这些图像信息呈现在屏幕上。通过这种结合,我们可以实现高效、便捷的文字信息传递和展示。

总之,汉字点阵与OLED屏显的结合是一种先进的汉字显示技术,它可以实现高清晰度、广视角、颜色丰富以及节能环保的汉字显示效果。这种技术被广泛应用于各种电子设备中,为我们的生活和工作带来了很多便利。在未来的发展中,我们相信这种技术将继续得到优化和完善,为人们带来更加美好的视觉体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值