OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。
OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。 常用的OLED屏幕有蓝色、黄色、白色等几种。屏的大小为0.96寸,像素点为 128*64,所以我们称为0.96oled屏或者12864屏。
------------------------------------------------------------------------------------
如何让字符显示在OLED屏幕上:
由于我们实际上是在和OLED的驱动IC通信,所以我们要选择驱动的相应时序8080时序。然后利用厂家给的初始化序列进行屏幕初始化。然后再进行画点读点的操作。
接下来介绍8080并行通信的读/写操作过程。
1、设置DC电平,选择写入类型(高电平为读写数据,低电平为读写命令);
2、拉低片选,选中我们的操作设备;
3、设置RD(读)/WD(写)为低电平,选择操作方式,再拉高选择的操作位,使之产生一个上升沿触发信号,会将数据锁存/写入,等于是在这个上升沿之后命令有效。
接下来以写入为例进行示范:根据需求自行选择DC电平,比如说读写数据的时候我们选择高电平;接下来拉低CS选中相应OLED屏设备;然后拉低WR线,准备进行写入数据;接下来在数据线上进行数据准备;然后我们再拉高WR线,产生一个上升沿触发信号,此时我们的数据线上的数据会被读取;然后再分别释放CS和DC线。
接下来进行代码示范:
void oled_wr_byte(uint8_t data, uint_8 cmd){
OLED_RS(cmd); //数据类型,有传参决定
OLED_CS(0);
OLED_WR(0);
oled_data_out(data); //数据线准备
OLED_WR(1);
OLED_CS(0);
OLED_RS(cmd); //释放,恢复默认
}
void oled_data_out(uint8_t data){
GPIOC->ODR = (GPIOC->ODR & 0xFF00) | (data & 0x00FF); //D[7:0]使用的是PC0~7,前一段清空后8位的数据,,后一段传入数据
}
整个OLED屏幕分成了八页,说白了就是把OLED的屏幕把宽平均分成了八份。比如想要在第0列第三行的开头显示一个点那就是按位来配置,0000 0100(0x08)。在对GRAM进行操作的时候,列地址指针自动递增,当列地址指针达到列结束地址的时候,重置开始地址,但页指针不变。用户必须设置新的页和列地址,才能访问下一页GRAM内容。
STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM。
代码实现如下:
static uint8_t g_oled_gram[128][8]; //OLED的显存,前面是列数,后面是页数
void oled_refresh_gram(void){
unit8_t i,n;
for(i=0;i<8;i++){
oled_wr_byte(0xB0 + i, OLED_CMD); //设置页地址
oled_wr_byte(0x00, OLED_CMD); //设置列低地址
oled_wr_byte(0x10, OLED_CMD); //设置列高地址
for(n=0;n<128;n++){
oled_wr_byte(g_oled_gram[n][i], OLED_DATA);
}
}
}
一个通用的置1表达式为OLED_GRAM[x][y/8] |= 1<< y%8;
然后给出标准画点的代码:
void oled_draw_point(uint8_t x, uint8_t y, uint8_t dot){
uint8_t pos, bx, temp = 0;
if(x > 127 || y > 63) return;
pos = y / 8; //页地址
bx = y % 8; //在页中纵坐标的位置
temp = 1 << bx; //转换后y对应的bit位置
if(dot)
g_oled_gram[x][pos] |= temp;
else
g_oled_gram[x][pos] |= ~temp;
}
接下来介绍字符显示原理:
1、显示字符必须有相应的点阵数据,点阵数据的集合叫做字库;
2、单片机根据点阵数据按取模放进行描点还原,从而显示字符;
3、ASCII字符宽度 = 汉字宽度的一半。
画点遵循原则:从上到下,从左到右,高位在前。