本文使用SPI 通信的OLED屏幕,芯片使用的是STM32F103ZET6。OLED模块整体来说比较简单,就是加字模,调函数的过程。初学者可以好好看看里面包含的函数,还是很有趣的。
OLED,即有机发光二极管。OLED由于同时具备自发光,不需要光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示技术。
LCD都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示, OLED 效果要
来得好一些。 以目前的技术, OLED 的尺寸 还难以大型化,但是分辨率确可以做 到很高。在本章中 ,我们使用的是 ALINETEK 的 OLED 显示模块;
该模块有以下特点:
OLED | STM32 |
---|---|
VCC | 3V3 或 5V |
D0 | PD6(SCL) |
D1 | PD7(SDA) |
RES | PD4 |
DC | PD5 |
CS | PD3 |
其中,CS 可以不用连接。
需要找一个OLED的例程,在例程里进行修改。(一般商家会提供例程)
学号显示可以使用显示字符串的函数,姓名则需要显示汉字的函数。
注意:显示汉字时,需要将汉字的点阵(利用软件生成点阵)放到存放点阵的文件中。
显示字符串函数 |
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
unsigned char j=0;
while (chr[j]!='\0')
{ OLED_ShowChar(x,y,chr[j]);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
例:OLED_ShowString(32,0,"********");
其中x,y是定义显示的位置,chr代表字符串。将收到的字符串存入字符数组中,按字符的方式输出。
显示汉字函数 |
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{
u8 t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
例:OLED_ShowCHinese(16,0,1);
其中的x,y依然定义显示的位置,后面的no表示你存入字模的数组下标。
用OLED 显示AHT20 测试的温湿度,就需要将AHT20 的模块加入到工程中。详细步骤参见链接。
然后,将AHT20中的主函数也移植到工程的主函数中,注意重定义问题。
由于显示温湿度是使用的数字显示,所以就需要使用到显示数字的函数。
显示数字函数 |
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+(size/2)*t,y,' ');
continue;
}else enshow=1;
}
OLED_ShowChar(x+(size/2)*t,y,temp+'0');
}
}
例:OLED_ShowNum(48,2,c1,2,16);
其中x,y的含义和上面是相同的,num表示数字或者变量的值,len表示显示数字的位数,size表示显示数字的字体大小。
从函数中可以看出来,显示数字也是按照显示字符的方式来显示的。
添加所需要用到的字模到字模文件中去,依次调用其中的文字,然后利用编程进行循环显示即可。
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "led.h"
#include "AHT20.h"
#include "myiic.h"
#include "usart.h"
int32_t main(void)
{
uint32_t CT_data[2];
volatile int c1,t1;
int i,j;
SensorDelay_us(40000);//刚上电,延时40ms才可以读取状态
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
delay_ms(40);//刚上电,延时40ms才可以读取状态
if(!((AHT20_Read_Status()&0x08)==0x08))//首先发0x71读取状态字bit[3],如果=1,为校准输出,无须初始化!!! 正常情况下读回来的状态是0x1C或者是0x18,读回来是0x80表示忙状态;
{
AHT20_Init(); //初始化AHT20
}
OLED_Init(); //初始化OLED
OLED_Clear();
while(1)
{
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(16,0,1);
OLED_ShowString(32,0,"********");
delay_ms(5000);
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次
c1 = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
c1=c1/10;
t1=t1/10;
printf("湿度:%d",c1);
printf("温度:%d\n",t1);
delay_ms(5000);
OLED_ShowCHinese(0,2,3);//湿
OLED_ShowCHinese(16,2,4);//度
OLED_ShowCHinese(32,2,5);//:
OLED_ShowNum(48,2,c1,2,16);//温度显示
OLED_ShowChar(62,2,'%');
OLED_ShowCHinese(0,4,2);//温
OLED_ShowCHinese(16,4,4);//度
OLED_ShowCHinese(32,4,5);//:
OLED_ShowNum(48,4,t1,2,16);//湿度显示
OLED_ShowChar(62,4,'C');
//你好,欢迎来到重庆交通大学物联网实验室
for(i=0;i<12;i++)
{
OLED_ShowCHinese(0,6,6+i);//你
OLED_ShowCHinese(16,6,7+i);//好
OLED_ShowCHinese(32,6,8+i);//,
OLED_ShowCHinese(48,6,9+i);//欢
OLED_ShowCHinese(64,6,10+i);//迎
OLED_ShowCHinese(80,6,11+i);//来
OLED_ShowCHinese(96,6,12+i);//到
OLED_ShowCHinese(112,6,13+i);//重
if(i==11)
{
i=0;
delay_ms(5000);
for(j=0;j<8;j++)
{
OLED_ShowCHinese(112,6,6+j);
OLED_ShowCHinese(112,6,7+j);
OLED_ShowCHinese(112,6,8+j);
OLED_ShowCHinese(112,6,9+j);
OLED_ShowCHinese(112,6,10+j);
OLED_ShowCHinese(112,6,11+j);
OLED_ShowCHinese(112,6,12+j);
OLED_ShowCHinese(112,6,13+j);
}
}
delay_ms(5000);
}
}
}
OLED显示就是调用OLED里面的函数,然后在屏幕中进行显示的过程。一般用来显示字符、字符串、汉字以及一些小一点的图片也是能显示的。文字的显示都是有对应的点阵的,才能够进行显示。
了解OLED的使用就是对OLED调用函数的了解,请大佬指导纠错。