总述
OLED屏在低功耗且显示要求不高的场景还是十分实用的,例如:指纹锁、小型物联网设备等。常用操作有显示二值化图片、文字、滚动以及简单的动画等。
软件实现框架
- 设置一个128*8的虚拟显示缓冲区
- 前后台模式,前台只负责改变需要显示内容到虚拟缓冲区,后台负责定时刷新
基础函数实现
单点操作
注意:oled刷新中y轴从上到下对应的是单字节的低位到高位(byte B = bit7 … bit0 (低在显示屏上端))
static unsigned char oled_ram[OLED_HIGH/8][OLED_WIDTH] = {0};
static void sys_draw_point_vdb(unsigned char x, unsigned char y, unsigned char set)
{
unsigned char point_data = oled_ram[y/8][x];
if(set == 1)
point_data |= 1 << ((y%8));
else if(set == 0)
point_data &= ~(1 << ((y%8)));
oled_ram[y/8][x] = point_data;
}
刷新屏幕
可以全屏刷,也可以单区域刷,看具体需求。
int app_oled_gui_refresh(unsigned char start_x, unsigned char start_y, unsigned char stop_x, unsigned char stop_y)
{
for(int i =start_x; i < stop_x; i++)
for(int j =start_y/8; j < stop_y/8; j++)
oled_gui_set_color(i, j, oled_ram[j][i]); //设置,纵向8bit一刷新
}
清除相应点
与显示一样也是清除虚拟缓冲区的。
int app_oled_gui_clear_vdb(int x_start, int y_start, int x_stop, int y_stop)
{
for(int i = x_start; i < x_stop; i++)
{
for(int j = y_start; j < y_stop; j++)
oled_ram[j/8][i] &= ~(1<<(j%8));
}
}
常用操作实现
显示操作
对于显示文字、图片等,都只用将相应点的数据按位放到虚拟缓冲区就可以了。
硬件支持的滚动操作
左右滚动
/**
* @author whiteblack
* @brief 水平滚动
* @Input params: 滚动方向左0,右1
* @Input params: 开始滚动页 0到7
* @Input params: 终止滚动页 0到7
* @Input params: 滚动延时000 b - 5帧100 b - 3帧
001 b - 64帧101 b - 4帧
010 b - 128帧110 b - 25帧
011 b - 256帧111 b - 2帧
常规选择0x07
* @Input params:
* @Output params:
* @Output params:
* @return 见状态码
*/
//oled_gui_cmd 为命令设置
int app_oled_gui_horizontal_scroll(unsigned char move_dir,unsigned char start_page, unsigned stop_page, unsigned char scorll_interv)
{
oled_gui_cmd(0x2E); //关闭滚动
oled_gui_cmd(0x26+move_dir); //水平向左或者右滚动 26/27
oled_gui_cmd(0x00); //虚拟字节
oled_gui_cmd(start_page); //起始页 0
oled_gui_cmd(scorll_interv); //滚动时间间隔
oled_gui_cmd(stop_page); //终止页 7
oled_gui_cmd(0x00); //虚拟字节
oled_gui_cmd(0xFF); //虚拟字节
oled_gui_cmd(0x2F); //开启滚动
}
上下滚动
/**
* @author whiteblack
* @brief 垂直滚动
* @Input params: 开始滚动页 0到7
* @Input params: 终止滚动页 0到7
* @Input params: 滚动延时000 b - 5帧100 b - 3帧
001 b - 64帧101 b - 4帧
010 b - 128帧110 b - 25帧
011 b - 256帧111 b - 2帧
常规选择0x07
* @Input params:
* @Output params:
* @Output params:
* @return 见状态码
*/
int app_oled_gui_vertical_scroll(unsigned char start_page, unsigned stop_page, unsigned char scorll_interv)
{
oled_gui_cmd(0x2e); //关闭滚动
oled_gui_cmd(0x29); //水平垂直和水平滚动左右 29/2a
oled_gui_cmd(0x00); //虚拟字节
oled_gui_cmd(start_page); //起始页 0
oled_gui_cmd(scorll_interv); //滚动时间间隔
oled_gui_cmd(stop_page); //终止页 1
oled_gui_cmd(0x01); //垂直滚动偏移量
oled_gui_cmd(0xA3); //开启滚动
oled_gui_cmd(0); //开启滚动
oled_gui_cmd(64); //开启滚动
oled_gui_cmd(0x2F); //开启滚动
}
总结
以上简单介绍了OLED的操作,其实对于OLED操作有一些开源的库,推荐一个SOLGUI OLED库,该库有现成的目录框架以及一些常用的控件。
关注微信公众号,并发送OLED获取。