了解单片机模块——OLED模块(一)

学习目标:

提示:这里可以添加学习目标

例如:

  • 掌握OLED显示原理
  • (文章参考b站up主大明狐)

  • 学习内容:

    在这里插入代码片

    一、OLED显示原理
    了解OLED屏幕,首先要了解屏幕可以控制的最小单元,他是一个有8个像素点组成的小竖棍,像素点的顺序从上向下依次是第0位到第7位,是不是很像学习单片机入门的时候学习的8位LED,
    没错,小竖棍上的8个像素点,同样也是位0时熄灭,为1时点亮,给他不同的数值,就可以点亮相应的像素点,知道了这一点,就可以更进一步的了解屏幕的结构了
    如果我把被赋予不同数值的小竖棍,一条一条并列起来,就得到了一个简单的图案,给小竖棍赋予不同的数值,就会排列出截然不同的图案

    再回到12964屏幕,由128条小竖棍横向并排起来,就组成了屏幕的一行

    然后,又由8行同样的小竖棍竖向排列起来,就组成了一个完整的屏幕
    将图片按照一定的排列顺序,转换成数值的操作,叫做取模

    将取模得到的数值赋给每一条小竖棍,就又得到了一幅完整的图片

    这就是OLED屏幕显示图像的原理

    二、OLED屏幕的指令
    要点亮OLED屏幕,首先要做的是告诉屏幕,要开始工作了,以及需要做好那些准备,这个过程叫做屏幕的“初始化”,使用其他类型的屏幕,也要从这个步骤开始。
    这些指令按照功能划分大致可以分为两大类:
    第一类是对屏幕硬件的工作模式进行配置

    第二类是对于屏幕显示进行控制的指令
    比如让图像反色显示

    或者让画面在屏幕上的上下和左右镜像反转

    以及画面在水平方向和垂直方向的滚动、还有淡出、闪烁效果等等

    三、显存与屏幕
    前面提到,OLED12864显示屏是由8行、每行128根小竖棍组成
    在OLED屏幕的控制芯片里,有一个用于图形数据显示的存储区域(GDDRAM),叫做显存

    显存的每一位数据,可以跟屏幕上的像素点一一对应,我们给显存发送数值,屏幕上就会立即显示出对应的图像

    因为显存和屏幕的关系是实时的

    也就是显存里对应屏幕上的某个像素点的数值是1或0,则屏幕上对应的像素点就是点亮或熄灭的,所以我们通过使用编程语言的一些逻辑算法,对显存中的数据进行编辑,就实现了点亮屏幕,并且在屏幕上画画的目的

    四、IIC协议






    不同协议的屏幕,以上初始化内容可能不同,但最终都会作用在这两个向屏幕写入数据或指令的函数上,这个函数十分重要,之后所有对屏幕的控制指令,以及发送的图像数据,都离不开这个函数

    五、OLED屏幕的控制函数
    如果说以上两个函数是让单片机跟屏幕对话的,那么接下来的这些控制函数,就是可以让我们通过单片机跟屏幕交流的部分

    首先介绍一个重磅的函数

    要了解这个函数,先要回到屏幕和显存的结构上,前面提到过,显存里的数据,都是跟屏幕上的像素点是一一对应的,即数据的排列,也是128位为一行,共8行

    为了便于查找定位显存里的数据,控制芯片里为这一千多个数据的地址,制定了几种排列规则,即几种地址排列的模式

    首先说第一种模式,水平地址模式,设置指令为20、00,在这个模式下,数据是之字形排列,当数据地址超出屏幕有边界的时候,会自动下移一行,并在最左边显示出来,当排到最后一行的最后一列之后,会重新回到第一行的第一列

    然后说一下第三种,页地址模式,设置指令为20、02,跟水平地址模式类似,这个模式下,数据水平排列,区别在于,当数据地址超出屏幕右边界的时候,会在同一行的最左边显示出来

    最后说第二种模式,垂直地址模式,设置指令为20、01,这种模式下的数据,是以列为单位排列的,当数据排满某一行的8行之后,会右移一行,从第一行开始
    当排到最后一列的最后一行之后,会重新回到第一列的第一行
    因为屏幕在大多数使用中,都是横向使用,所以在这三种模式中,水平地址模式和页地址模式比较符合思考习惯,所以比较常用

    知道了显存的结构和地址模式,再回到定位函数

    这个函数是通过这三条控制指令来实现的,第一行是用来设置显示行的启始位置的,在显存地址中,第0行到第7行,是通过指令B0到B7来表示的,这里的B0就是指向第0行,通过加上参数y的数值0到7,就实现了对某一行的指定

    接下来的指令,是用来指定起始列的地址的,通过加上参数x的数值0到127,来实现对0到127列的指定

    指定高位的指令必须要有,否则就会在显示时依次发生错位

    说完定位函数,接下来的这个OLED_Clear();函数也是使用频率非常高的一条函数

    六、图案与字库

    我们可以将类型和结构大小都相同的几组数据,放在同一个数组里面,起名为Xin[],然后通过数据排列的规律,找到每组数据的起点,然后提取需要的数量的数据,这个大数组,就是我们在控制显示屏时最常用到的,也是显示屏的驱动程序中非常重要的一个组成部分“字库”,通常建立一个字库文件来专门定义这些字库数组

    下面再来介绍几个函数

    七、点亮OLED屏幕的像素点
    OLED12864显示屏是由8行每行128根小竖棍组成,之前尝试用直接赋值的方式,点亮一根小竖棍上的一个或几个像素点,这些像素点的亮灭,就组成了我们看到的文字和图片,我们要在屏幕上画画,其实也是对这些像素点的亮灭状态进行操作,然而依照画画的习惯,我们更希望通过,直接指定每个像素点的xy坐标,来实现图案的绘制,而不是一次操作8个像素点,于是就需要使用C语言中运算符来帮忙实现这个愿望

    1、第一个是位操作运算符里的左移运算符

    前面提到过,在小竖棍上的8个像素点,对应了显存中的8个位
    点亮8个点从上至下依次是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80

    通过以为运算符可以不去记忆这些数值,只需要将第一个点的数值(0x01),向左移动需要的位数,空出来的位会自动被0补全,就可以得到需要的数值

    列如指定第2位的点

    指定第5位的点

    示例:

    2、新的问题来了,如果小竖棍上已经有被点亮的像素点,却需要再点亮另外一个,并且不会影响到已经点亮的像素点,要怎么办呢?
    这就需要请另外一个运算符来帮忙了,他就是逻辑运算符的或运算


    假设以点亮的点A为0000 0001(第0位),新点亮的点为0001 0000(第4位),那么将A和B进行或运算,得到0001 0001,第0位和第4位同时点亮

    示例:

    3、现在我们可以自由画一个点了,但是想要熄灭一个点,又该怎么办呢,接下来的逻辑运算符与运算就可以帮我们完成这个任务


    4、不过新的疑问又出现了,移位运算智能做到对1进行移位,假如使用移位的方式来熄灭某一位上的点,就需要指定位为0,其余为为1的数值,于是最后一个帮手就有用武之地了
    ,他就是位运算符之一的按位取反运算符

    将其与移位运算符配合

    然后就可以将这个数值,使用到与运算中,从而实现将指定位置0的操作

    示例:

    八、刷新OLED屏幕上的显存
    因为显存中的数据只能被写入,却不能读取出来进行二次修改,所以就需要我们在单片机的内存中,创建一个跟显存一样大的数组,先对数组中的数据进行操作,然后再将数组中编辑好的数据,一次性发送给显存,从而实现在屏幕上画画


    创建的这个数组,作用相当于我们和显存之间的缓冲区

    前者是依据显存的结构,按照8组,每组128个数据的形式,将数据存放在一个二维数组里,后者则是将整个屏幕显存中的1024个数据,存放进一个一维数组里面

    只要每次执行完对缓冲数组的编辑,紧跟着执行一下刷新函数,就可以将编辑结果显示在屏幕上了,于是有了缓冲数组GRAM还有这个屏幕刷新函数OLED_Refresh(); 就为接下来在屏幕上画画做好了十分重要的准备工作,因为之后介绍的所有画画功能,都要通过这两个基础功能来让屏幕反馈给我们

    (注意将图中j的变量类型改成unsigned int)

    九、在OLED屏幕上画点
    OLED12864显示屏,是由8行,每行128根小竖棍构成的,假如我们从屏幕上,单独取出第0列的小竖棍来看,每一根小竖棍都可以拆成第0位到第7位这八个点,如果将行号设成变量n,那么n的范围是0到7,于是每一行小竖棍的第0列上,第0位的点的序号,恰好都是8的n倍,定义一个变量m用来表示每根小竖棍上的八个点的位置。
    可以看出像素点的y坐标0到63都可以表示成8*n+(0x01<<m)

    得到在屏幕任意位置点亮一个像素点的函数

    熄灭任意一点的函数

    示例:

    物联沃分享整理
    物联沃-IOTWORD物联网 » 了解单片机模块——OLED模块(一)

    发表评论