一、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. 显示汉字的流程:
-
汉字编码: 将要显示的汉字使用相应的编码方式(如GB2312或GBK)转换为区位码。
-
获取点阵数据: 根据汉字的区位码,从字库中获取对应的汉字点阵数据。
-
SPI通信: 将获取到的汉字点阵数据通过SPI协议发送到OLED屏幕。
-
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屏的显示。