其实我没买OLED屏哈哈哈,这个只是学习了,没机会实践。
大部分图片来源:正点原子HAL库课程
专栏目录:记录自己的嵌入式学习之路-CSDN博客
目录
1 显示原理
2 读写方式:8080并口
2.1 支持的指令类型
2.2 读写过程
2.3 三种设置内存地址模式
2.4 软件读写方式
2.5 页地址模式的本质
2.6 屏幕驱动步骤
1 显示原理
MCU驱动OLED的控制器进行读写:MCU←→OLED控制器←→OLED屏幕。
2 读写方式:8080并口
2.1 支持的指令类型
2.2 读写过程
- CS:OLED 片选信号,就是告诉系统,我要对该芯片/内存进行通信了,后续我发的信号就是给这个芯片/内存的;
- WR:向 OLED 写入数据;
- RD:从 OLED 读取数据;
- D[7:0]:8 位双向数据线;
- RST(RES):硬复位 OLED;
- DC:命令/数据标志(0,读写命令;1,读写数据)。
一个示例的读写过程(也许不代表真正的代码,但逻辑是对的):
2.3 三种设置内存地址模式
- 页地址模式
- 水平地址模式
- 垂直地址模式
2.4 软件读写方式
2.5 页地址模式的本质
由于屏幕是128*64,所以弄了一个显存区域,其每页有128字节,一共有8页。这里用128字节是因为内存是以一字节为单位存储的,而128是为了对上列数,而因为一个字节只有8位,所以一页是128*8,为了完全映射128*64,就弄了8页。
其需要设置段重映射,这是为了将页地址完全一致地映射到屏幕像素上去。否则第一列对应的就是屏幕的第128列了。所以总体来说,页数相当于行数除以8,列地址相当于真正的列数。
内存和页地址的联系可参考下图确认每个点的操作:
这里的内存其实就是在单片机中开辟一个[128][8]的二维数组,作为显存的作用,在程序中需要显示字符的时候先对该显存进行赋值,再调用自己写的屏幕更新函数来更新整个屏幕。
画点方式:算出像素的行数位(即下图temp),用数组获取原有像素所在列的值(8位)。若开启像素,则并将其与temp进行或运算;关闭像素则需要将其与temp的反值进行与运算。