一.Oled简介
1.Oled原理
OLED的原理是,由ITO透明电极和金属电极分别作为器件的阳极和阴极,在一定的电压驱动下,电子和空穴分别从阴极和阳极注入到电子和空穴传输层,电子和空穴分别经过电子和空穴传输层迁移到发光层,并在发光层中相遇,形成激子并使发光分子激发。后者经过辐射弛豫而发出可见光。辐射光可从ITO一侧观察到,金属电极膜同时也起到了反射层的作用。根据这种发光原理而制成的显示器被称为有机发光显示器,也叫OLED显示器。
2.点阵编码及显示
(1)汉字点阵编码
汉字点阵编码是将汉字转换为点阵图像的编码方式。每个汉字都可以由一个矩形的点阵组成,点阵中的每个点都可以表示一个汉字的一个字形。常用的点阵大小有12x12、14x14、16x16等,每个点用0或1表示,0代表没有点,1代表有点。这样,每个汉字就可以通过一个二进制数组来表示。
汉字的点阵编码通常采用区位码的方式表示。区位码将汉字分为若干区和若干位,每个区包含一定数量的汉字,每个位包含一定数量的字形。通过区号和位号的组合,可以唯一地确定一个汉字的点阵编码。例如,在GB2312编码中,每个汉字的区号范围是0x01-0x7F,位号范围是0x01-0x7F,共分为94个区和94个位,每个区包含94个汉字,每个位包含94个字形。
(2)oled点阵显示
OLED点阵显示是一种利用OLED技术制作点阵式显示屏幕的方法。这种显示屏幕可以用于显示文字、图像、视频等各种内容。其基本原理是通过将OLED材料涂层放置在一个塑料或玻璃基板上,然后在OLED材料上形成像素阵列,从而制作出显示屏幕。每个像素由一个OLED材料层和一个薄膜晶体管(TFT)组成,薄膜晶体管可以控制像素的亮度和颜色。
二.Oled显示实验
1.实验目标
显示自己的学号和姓名;
显示AHT20的温度和湿度;
上下或左右的滑动显示(使用硬件刷屏模式)
2.实验材料
(1) 硬件:
- STM32F103C8T6最小板
- AHT20温湿度传感器
- USB/TTL接口
- 4针脚使用I2C通信协议的OLED屏
- 面包板
- 杜邦线若干
(2) 软件:
- KEIL 5
- 字模软件
3.取字模
打开PCtoLCD2002开始取字模,先进行相关设置再取字模
注:此处字宽20
取字模完毕将字模复制到Oled_Font.h的10*16字模库内
4.代码实现
ATH相关代码奥送官网中寻找:点击前往
自带函数没有输出中文的方法,需要自己定义
/**
* @brief OLED初始化
* @param Line 起始行位置
* @param Column 起始列位置
* @retval 无
*/
void OLED_ShowCHINESE(uint8_t Line, uint8_t Column, uint8_t Num)
{
uint8_t i;
uint8_t wide = 20;//字宽
OLED_SetCursor(( Line - 1 ) * 2, ( Column - 1 )* wide); //参数1:把光标设置在第几页. 参数2:把光标设置在第几列
for (i = 0; i < wide; i++)
{
OLED_WriteData(OLED_F10x16[Num][i]); //显示上半部分内容
}
OLED_SetCursor(( Line - 1 ) * 2 + 1,( Column - 1) * wide);
for (i = 0; i < wide ; i++)
{
OLED_WriteData(OLED_F10x16[Num][i+wide]); //显示下半部分内容
}
}
滚动实现代码
OLED_WriteCommand(0x2E); //关闭滚动
OLED_WriteCommand(0x26); //向右滚动,27则向左
OLED_WriteCommand(0x00); //虚拟字节
OLED_WriteCommand(0x00); //起始页 这里为0
OLED_WriteCommand(0x07); //滚动速度
OLED_WriteCommand(0x03); //终止页 这里为3,也就是之后的姓名,学号
OLED_WriteCommand(0x00); //虚拟字节
OLED_WriteCommand(0xFF); //虚拟字节
OLED_WriteCommand(0x2F); //开启滚动
main.c代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AHT20-21_DEMO_V1_3.h"
#include <stdio.h>
int main(void)
{
Init_I2C_Sensor_Port();//初始化SDA,SCL的IO口的函数
uint32_t CT_data[2];
volatile int c1,t1;
Delay_1ms(500);
OLED_Init();//初始化OLED
if((AHT20_Read_Status()&0x18)!=0x18)
{
AHT20_Start_Init(); //重新初始化寄存器
Delay_1ms(10);
}
OLED_ShowCN(1,1,0);
OLED_ShowCN(1,2,1);
OLED_ShowCN(1,3,2);
OLED_ShowString(2,1,"632107060303");
OLED_ShowCN(3,1,4);
OLED_ShowCN(3,2,5);
OLED_ShowString(3,6,":");
OLED_ShowCN(4,1,3);
OLED_ShowCN(4,2,5);
OLED_ShowString(4,6,":");
滚动句,需要用时取消注释
// OLED_ShowCN(2,1,6);
// OLED_ShowCN(2,2,7);
// OLED_ShowCN(2,3,8);
// OLED_ShowCN(2,4,9);
// OLED_ShowCN(2,5,10);
// OLED_ShowCN(2,6,11);
// OLED_ShowCN(3,1,12);
// OLED_ShowCN(3,2,13);
// OLED_ShowCN(3,3,14);
while(1)
{
滚动代码,配合滚动语句时取消注释
// OLED_WriteCommand(0x2E);
// OLED_WriteCommand(0x26);
// OLED_WriteCommand(0x00);
// OLED_WriteCommand(0x00);
// OLED_WriteCommand(0x07);
// OLED_WriteCommand(0x03);
// OLED_WriteCommand(0x00);
// OLED_WriteCommand(0xFF);
// OLED_WriteCommand(0x2F);
//AHT20_Read_CTdata(CT_data);
AHT20_Read_CTdata_crc(CT_data);
while(CT_data[0]==0x00&&CT_data[1]==0x00)
{
AHT20_Read_CTdata_crc(CT_data);//crc校验后,读取AHT20的温度和湿度数据
}
c1 = CT_data[0]*100*10/1024/1024;
t1 = CT_data[1]*200*10/1024/1024-500;
下一步客户处理显示数据,我们这里用两个字符串来表示计算得到的值
char str1[5];
char str2[5];
sprintf(str1,"%.1f",c1/10.0);
sprintf(str2,"%.1f",t1/10.0);
OLED_ShowString(3,7,str1);
OLED_ShowString(4,7,str2);
Delay_1ms(2000);
}
}
5.电路连接
oled | stm |
---|---|
GND | GND |
VCC | 3V |
SCL | B8 |
SDA | B9 |
6.实验效果