最近在做一些基于SH1107的1.3寸OLED屏幕相关的项目,现在对一些相关的命令、地址和代码做些总结。
一、显示地址
1、SH1107最大是支持128x128的矩阵面板的,现在以分辨率为64(H)x128(V)为准进行说明
H:Horizontal(横),即横向为64个像素点
V:Vertical(竖),即竖向为128个像素点
SH1107可参考以下的显示地址列表:
![ac7cf00b0bd62ed771595cdb8e9a0dfd.png](https://i-blog.csdnimg.cn/blog_migrate/4c28bc50730ac9155514abaa7ee03925.jpeg)
① SH1107具有16页即page0-page15,每一页都为8行总共128行,也就是Seg0-Seg127
② SH1107具有128列,即Column0-Column127,也就是0-7F
③ 这里使用的设置内存地址模式命令(Set memory addressing mode)为0x20,即页地址模式。页地址模式是指列写入数据后,列地址的指针会自动加1,如果列地址指针到达终止地址(0x7F)后,列地址指针将会返回到起始地址(0x00),但是页地址指针不会改变,如果需要访问下一页的内容,我们需要手动设置下一页的页地址和列地址,所以此模式下是OLED是一页一页刷新显示的,命令格式如下图:
![fe3b1b4391ac4953e33a84abb95aeaac.png](https://i-blog.csdnimg.cn/blog_migrate/2bc8f5606c1738718f10dba6ed4ac7dd.png)
2、这里我所使用的液晶屏以16页、64列为准,具体可参考下图的实物显示位置图
① OLED屏上每一行和每一列的显示方向,下图白色指标为行(H)的方向,一行为64个点,红色指标为列(V)的方向,一列为128个点,如下图:
![11286fdfc416093a657b1dab97b3b238.png](https://i-blog.csdnimg.cn/blog_migrate/4f52e279717e779395e0b5a14d3dce67.jpeg)
② OLED屏对应的全部显示地址列表,16页对应page0-page15,64列对应col0-col63,如下图:
![dd70e97fc8f491210ef573dfff45ff42.png](https://i-blog.csdnimg.cn/blog_migrate/7330d6016bdc4972aeb8438ed4bc3f6d.jpeg)
③ OLED屏对应的8192(64*128)个像素点,每一页里每一列都为D0-D7的8个点,程序里点亮的话也是8位数据传输,如下图:
![f3c1aeaf5b98f4e4198c5205f71c1cb4.png](https://i-blog.csdnimg.cn/blog_migrate/37e201e9d7c3e7161f1613f7138fa541.jpeg)
二、相关代码
1、在对应的页和列写数据
OLED_WR_Byte(0xb0,OLED_CMD); // 设置页地址
OLED_WR_Byte(0x0f,OLED_CMD); // 设置显示的列的低地址
OLED_WR_Byte(0x10,OLED_CMD); // 设置显示的列的高地址
OLED_WR_Byte(0xff,OLED_DATA);
在第一页的第16列写入全高电平,也就是将第16列的D7-D0写入11111111,将这八位对应的像素点全点亮,如下图(图1为OLED屏第16列被点亮的八个点,图2红框是对应的显示地址列表里的第16列):
![5906e23a9809d4c3fc20730e6d55eff0.png](https://i-blog.csdnimg.cn/blog_migrate/fac4322ae8d495854efc2039d60bb302.png)
![ad5dc51e83a98991481350e3ad57947c.png](https://i-blog.csdnimg.cn/blog_migrate/0cbadd0d9d61e2e1e8f87a8dddc6642e.jpeg)
① 程序OLED_WR_Byte (0xb0,OLED_CMD)的0xb0是设置页的地址,格式是根据设置页地址命令(Set Page Address)进行编写,该命令格式高四位的1011是固定的,而低四位是根据SH1107的16个页(00H-0FH)进行改变,第一页为0,所以传送的是0xb0,命令如下:
![c50ce1f57dbf769bed8e87adb24fb4fe.png](https://i-blog.csdnimg.cn/blog_migrate/2ea0872987496064d7933ec3523e2bb1.png)
② 这里需要注意,列地址范围是00H-3FH,但是在发送命令的时候需要将列地址的高四位和低四位分开进行发送,程序里面设置的是0FH,即第16列。
③ 程序OLED_WR_Byte (0x0f,OLED_CMD)的0x0f是设置列的低地址,格式是根据设置列低地址(Set Column Address 4 Lower Bits)进行编写,该命令格式高四位的0000是固定的,而低四位则需要将程序指定的第16列的列地址0x0f(0000