文章目录
OLED
Organic Light-Emitting Diode 有机发光二极管,又叫有机电机光显示。
OLED特点
自发光、对比度高、厚度薄、视角广、使用温度范围广、构造及制程简单
自发光,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,有机材料就会发光
OLED模块
一:模块有单色(纯蓝色)和双色(黄蓝双色
二:尺寸小显示尺寸为0.96 寸
三:高分辨率,模块分辨率为128*64
四:四种接口方式:6800/8080两种并行接口方式、四线的穿行SPI接口方式、IIC接口方式
五:不需高压,接3.3V就可工作
工作模式选择
通过模块的BS1/BS2设置
OLED 8080并行接口信号线
CS:OLED片选信号
WR:向OLED写入数据
RD:从OLED读取数据
D[7:0]:8位双向数据线
RST(RES):硬复位OLED
DC:命令/数据标志(0,读写命令;1,读写数据)
SSD1306:OLED控制器
OLED 8080 并口读写过程
根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),而后拉低片段
选中SSD1306
读数据:在RD的上升沿,使数据锁存到数据线(D[7:0])上
写数据:在WR的上升沿,使数据写入到SSD1306里面
并口写时序图
并口读时序图
OLED 模块显存
SSD1306 的显存总共为128*64 bit大小,SSD1306将这些显存分为8页,每页包含了128个字节总共八页。
显示原理
内部建立一个缓存(共128*8个字节) ,在每次修改的时候,只是修改STM32 上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。
SSD1306 的命令
如图:
命令0X81:设置对比度,两个字节,第一个0X81为命令,随后的字节为要设置的对比度,越大越亮
命令0XAE/0XAF:0XAE为关闭显示命令,0XAF为开启显示命令
命令0X8D:两个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2 表示电荷泵的开关状态,该位为一开启电荷泵,为0关闭。模块初始化一定要开启
命令0XB0~B7:用于设置页地址,其第三位的值对应GRAM的页地址
命令0X00~0X0F:用于设置显示时的起始列地址低四位
命令0X10~0X1F:用于设置显示时的起始列地址高四位
OLED初始化
复位SSD1306
驱动IC初始化代码
开启显示
清0显存
开始显示
OLED写字节代码实现
void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);
if(cmd)
OLED_RS_Set();
else
OLED_RS_Clr();
OLED_CS_Clr();
OLED_WR_Clr();
OLED_WR_Set();
OLED_CS_Set();
OLED_RS_Set();
}
OLED更新缓存显示内容
u8 OLED_GRAM[128][8];
void OLED_Refresh_Gram(void)
{
u8 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(OLED_GRAM[n][i],OLED_DATA);
}
}
OLED 画点函数
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
u8 pos,bx,temp=0;
if(x>127||y>63)return ;
pos=7-y/8;
bx=y%8;
temp=1<<(7-bx);
if(t)OLED_GRAM[x][pos]=temp;
else OLED_GRAM[x][pos]&=~temp;
}
OLED字符显示函数
//在指定位置显示一个字符,包括部分字符
//x:0~127 y:0~63
//mode:0,反白显示
//size:选择字体 12/16/24
{
u8 temp,t,11;u8 y0=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2);
chr=chr-'-';
for(t=0;t<csize;t++)
{
if(size==2)temp=asc2_1206[chr][t];
else if(size==16)temp=asc2_1608[chr][t];
else if(size==24)temp=asc2_2412[chr][t];
else return;
for(t1=0;t1<8;t1++)
{
if(temp&0x80)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;break;
}
}
}
}
实验代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "oled.h"
int main(void)
{
u8 t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
LED_Init();
OLED_Init();
OLED_ShowString(0,0,"ALIENTEK",24);
OLED_ShowString(0,24, "0.96' OLED TEST",16);
OLED_ShowString(0,40,"ATOM 2014/5/4",12);
OLED_ShowString(0,52,"ASCII:",12);
OLED_ShowString(64,52,"CODE:",12);
OLED_Refresh_Gram();
t=' ';
while(1)
{
OLED_ShowChar(36,52,t,12,1);
OLED_ShowNum(94,52,t,3,12);
OLED_Refresh_Gram();
t++;
if(t>'~')t=' ';
delay_ms(500);
LED0=!LED0;
}
}