128*64OLED常用操作

总述

OLED屏在低功耗且显示要求不高的场景还是十分实用的,例如:指纹锁、小型物联网设备等。常用操作有显示二值化图片、文字、滚动以及简单的动画等。

软件实现框架

  1. 设置一个128*8的虚拟显示缓冲区
  2. 前后台模式,前台只负责改变需要显示内容到虚拟缓冲区,后台负责定时刷新

基础函数实现

单点操作

注意: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获取。
128*64OLED常用操作

上一篇:Java知识点-----------( -128 ~ 127 )的常量池


下一篇:CISSP学习:第6章密码学和对称密钥算法