文章目录
前言
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)协议的原理。
- 汉字点阵编码原理:
汉字是由一定数量的点阵组成的,每个点阵可以表示一个汉字的一个字形。常见的汉字点阵编码方式有GB2312、GBK等。
GB2312编码: 汉字在GB2312编码中被划分为若干区和若干位,每个区包含94个字符,每个位包含94个字符。一个字符的GB2312编码由区号和位号组成,通过区位码可以找到相应的汉字。
GBK编码: GBK是GB2312的扩展,支持更多的汉字。GBK编码同样采用区位码的方式表示汉字。
- SPI协议原理:
SPI是一种同步串行通信协议,通常用于连接芯片之间进行数据传输。在OLED屏幕中,SPI协议用于将图像数据发送到屏幕。
SPI总线: SPI总线通常包含四条线:SCLK(时钟线)、MOSI(主机发送数据到从机)、MISO(从机发送数据到主机,可选)、SS(片选线,选择从机)。通信是主从模式的,主机生成时钟信号,控制数据传输。
OLED的SPI通信: OLED屏幕通过SPI接口接收图像数据。图像数据可以是汉字的点阵数据。主机将点阵数据通过MOSI线发送到OLED屏幕,通过时钟同步控制数据传输。OLED屏幕根据接收到的数据在屏幕上显示相应的图像。
- 显示汉字的流程:
汉字编码: 将要显示的汉字使用相应的编码方式(如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屏显的结合是一种先进的汉字显示技术,它可以实现高清晰度、广视角、颜色丰富以及节能环保的汉字显示效果。这种技术被广泛应用于各种电子设备中,为我们的生活和工作带来了很多便利。在未来的发展中,我们相信这种技术将继续得到优化和完善,为人们带来更加美好的视觉体验。