屏幕,首先要了解屏幕能控制的最小单元,他是一个有8个像素点组成的小竖棍,像素点的顺序从上向下依次是第0位到第7位,是否很像学习没错,小竖棍上的8个像素点,同样也是位0时熄灭,为1时点亮,给他不同的数值,就可以点亮相应的像素点,知道了这一点,就可以更进一步的了解屏幕的结构了
如果我把被赋予不同数值的小竖棍,一条一条并列起来,就得到了一个简单的图案,给小竖棍赋予不同的数值,就会排列出截然不同的图案
二、OLED屏幕的指令要点亮OLED屏幕,首先要做的是告诉屏幕,要开始工作了,以及一定要做好那些准备,这样的一个过程叫做屏幕的“初始化”,使用别的类型的屏幕,也要从这个步骤开始。这些指令按照功能划分大概能分为两大类:第一类是对屏幕硬件的工作模式进行配置
三、显存与屏幕前面提到,OLED12864显示屏是由8行、每行128根小竖棍组成在OLED屏幕的控制芯片里,有一个用于图形多个方面数据显示的存储区域(GDDRAM),叫做显存
显存的每一位数据,可以跟屏幕上的像素点一一对应,我们给显存发送数值,屏幕上就会立即显示出对应的图像
也就是显存里对应屏幕上的某个像素点的数值是1或0,则屏幕上对应的像素点就是点亮或熄灭的,所以我们利用编程语言的一些逻辑算法,对显存中的数据来进行编辑,就实现了点亮屏幕,并且在屏幕上画画的目的
不同协议的屏幕,以上初始化内容可能不同,但最终都会作用在这两个向屏幕写入数据或指令的函数上,这个函数十分重要,之后所有对屏幕的控制指令,以及发送的图像数据,不能离开这个函数
五、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语言中运算符来帮忙实现这个愿望
前面提到过,在小竖棍上的8个像素点,对应了显存中的8个位点亮8个点从上至下依次是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80
通过以为运算符可以不去记忆这些数值,只需要将第一个点的数值(0x01),向左移动需要的位数,空出来的位会自动被0补全,就能够获得需要的数值
2、新的问题来了,如果小竖棍上已经有被点亮的像素点,却需要再点亮另外一个,并且不可能影响到已经点亮的像素点,要怎么办呢?这就需要请另外一个运算符来帮忙了,他就是逻辑运算符的或运算
假设以点亮的点A为0000 0001(第0位),新点亮的点为0001 0000(第4位),那么将A和B进行或运算,得到0001 0001,第0位和第4位同时点亮
3、现在我们大家可以自由画一个点了,但是想要熄灭一个点,又该怎么去办呢,接下来的逻辑运算符与运算就可以帮我们完成这个任务
4、不过新的疑问又出现了,移位运算智能做到对1进行移位,假如使用移位的方式来熄灭某一位上的点,就需要指定位为0,其余为为1的数值,于是最后一个帮手就有用武之地了,他就是位运算符之一的按位取反运算符
八、刷新OLED屏幕上的显存因为显存中的数据只能被写入,却不能读取出来进行二次修改,所以就要求我们在单片机的内存中,创建一个跟显存一样大的数组,先对数组中的数据来进行操作,然后再将数组中编辑好的数据,一次性发送给显存,以此来实现在屏幕上画画
前者是依据显存的结构,按照8组,每组128个数据的形式,将数据存放在一个二维数组里,后者则是将整个屏幕显存中的1024个数据,存放进一个一维数组里面
只要每次执行完对缓冲数组的编辑,紧跟着执行一下刷新函数,就可以将编辑结果为在屏幕上了,于是有了缓冲数组GRAM还有这个屏幕刷新函数OLED_Refresh(); 就为接下来在屏幕上画画做好了十分重要的准备工作,因为之后介绍的所有画画功能,都要通过这两个基础功能来让屏幕反馈给我们
九、在OLED屏幕上画点OLED12864显示屏,是由8行,每行128根小竖棍构成的,假如我们从屏幕上,单独取出第0列的小竖棍来看,每一根小竖棍都可以拆成第0位到第7位这八个点,如果将行号设成变量n,那么n的范围是0到7,于是每一行小竖棍的第0列上,第0位的点的序号,恰好都是8的n倍,定义一个变量m用来表示每根小竖棍上的八个点的位置。能够准确的看出像素点的y坐标0到63都可以表示成8*n+(0x01m)