基于SSD1306的OLED的驱动学习(二):SSD1306的寻址方式
SPI通讯程序:(时钟高电平空闲,上升沿读取数据,从高到低)
void OLED_WR_Byte(u8 data,u8 cmd){unsigned char i = 0;if(cmd){//cmd非零,DC拉高,为写数据模式OLED_DC_High;}else{//写命令模式OLED_DC_Low;}/**********SPI主体***********/for(i=0;i<8;i++){OLED_SCL_Low;if(data & 0x80){OLED_SDA_High;}else{OLED_SDA_Low;}OLED_SCL_High;data <<= 0x01;}OLED_SCL_High;/*****************************/
}
SSD1306寻址方式介绍:
| 寻址方式选择命令: 0x20
可选模式: (页地址0x10,水平0x00,垂直0x01)
- 0x02:页地址寻址模式
该模式下,显示器从某一页的column0→column127进行扫描,需要注意的是该模式在接收到一个写显存命令后列地址会自动+1但是当该页扫描至终止列地址时指针会回到该页的起始地址而页地址指针不会自动+1,这意味这我们的程序中需要手动选定页地址
代码示例:(写显存函数)
void OLED_Refresh(void){
u8 i,j;
for(i = 0;i<8;i++){OLED_WR_Byte(0xb0+i,OLED_WR_CMD);//OLED_WR_Byte(0x00,OLED_WR_CMD);OLED_WR_Byte(0x10,OLED_WR_CMD);for(j = 0;j<128;j++){OLED_WR_Byte(OLED_GDDRAM[j][i],OLED_WR_DATA);}
}
}
除了全屏一起写数据,也可以选择指定区域进行写入,类似上方代码:
(:官方文档
即在正常显示模式,页地址寻址模式下,写入显存时需要先指定列起始地址,页地址。
- 设置列地址低四位命令:0x00-0x0F
- 设置列地址高四位命令:0x10-0x1F
- 设置页地址命令:0xB0-0xBF(PAGE0-PAGE7)
以官方文档中的例子做解析:
命令0xB2设置要写入的页为PAGE2;低四位命令0x03和高四位0x00(发送的命令是0x10)共同构成地址0x03,即从SEG3开始写入显存。
打个比方:
1.我们先发送命令0xB0,0x00,0x11,那么此时写入开始位置被指向PAGE2的SEG32(0x10)
2.发送数据0101 0010B,那么(SEG32,PAGE2)中从上往下的第2个,第5个,第7个点阵被点亮,完成后列地址自动+1,即此时显存写入位置到达了(SEG33,PAGE2),我们再发送数据的话就会被写入(SEG33,PAGE2).以此推进,直到写入位置到达(SEG127,PAGE2)后,再下一个写入位置就会回到(SEG32,PAGE2),我们要继续写入下一页的话就需要发送 命令0xB3(0xB0-0xBF,任一个)并指定开始列地址。
- 0x00 水平地址寻址模式
该模式就是在页地址寻址模式下加上当列地址到达尾部时页地址自动+1,当列地址与页地址都达到尾部时,列地址与页地址都会自动重置
//写显存函数
void OLED_Refresh(void){
u8 i,j;
for(i = 0;i<8;i++){for(j = 0;j<128;j++){OLED_WR_Byte(OLED_GDDRAM[j][i],OLED_WR_DATA);}
}
}
- 0x01 垂直地址寻址模式
垂直寻址模式,顾名思义,与水平寻址模式相对。如上图:
在上述的水平地址寻址模式和垂直地址寻址模式下,不可以使用页寻址模式下的定位命令,但是其有专有命令:
- 设置列地址命令 0x21
- 设置页地址命令 0x22
列地址设定命令(0x21)
列地址设定命令由三个命令组成命令组,第一个命令是0x21,第二个,第三个命令分别设定列起始和终止地址
(0x00-0x7F和0x00-0x7F)
页地址设定命令(0x22)
页地址设定命令与列地址设定命令一样由三个命令组成:
0x22->(0x00-0x07)->(0x00-0x07)
(:官方文档例子
例中设定了:
起始列地址为Col2,终止列为Col125(0x21->0x02->0x7D);
起始页地址为PAGE1,终止页地址为PAGE2(0x22->0x01->0x06);
寻址地址为水平寻址模式,写入示意图如上:
基于SSD1306的OLED的驱动学习(二):SSD1306的寻址方式相关推荐
- 0.96寸OLED显示屏驱动手册(SSD1306)
MCU IIC接口 IIC通信接口由从地址位SA0,IIC总线数据信号SDA(输出SDAout/D2和输入SDAin /D1)和IIC总线时钟信号SCL(D0).不管是数据线还是时钟线都需要连接上拉电 ...
- dev layoutview 怎么显示大小_Liunx驱动学习:基于imx6ul 驱动oledssd1306 实现终端显示...
说明: 在学习linux驱动的过程中,绕不开的就是LCD驱动,网上大部分教程都是教大家如果使用分辨率比较高的LCD作为Linux开发板的显示终端,但并没有讲过如果驱动spi或者iic这种低分辨率低帧率 ...
- SPI的模拟应用——OLED以及时钟模块的应用(二)7脚OLED的驱动及现实当前温度
https://pan.baidu.com/s/1_wo1f2zA_oLl9EuYuC9Yzg?pwd=ajoyhttps://pan.baidu.com/s/1_wo1f2zA_oLl9EuYuC9 ...
- 二、ESP32基于Arduino IDE OLED 联网显示时间
上一篇学习笔记讲了如何在Arduino上配置ESP32开发环境,这次分享一下如何让ESP32联网获取时间再通过OLED来显示.此系列文章都是学习笔记,希望能有所帮助. ps:代码中调用的库如需要可在在 ...
- 关于基于stm32的0.96寸oled显示屏的学习理解心得。
关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...
- 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 基于MTD的NAND驱动开发(二)
基于MTD的NAND驱动开发(二) 基于MTD的NAND驱动开发(三) http://blog.csdn.net/leibniz_zsu/article/details/4977853 http:// ...
- IMX6ULL嵌入式Linux驱动学习笔记(二)
IMX6ULL嵌入式Linux驱动学习 一.字符设备驱动 二.驱动模块的加载与卸载 三.字符设备的注册与注销 四.设备号 五.file_operations的具体实现 六.字符设备驱动框架 七.编写应 ...
- ESP32基于Arduino框架下U8g2驱动I2C OLED 时间显示
ESP32基于Arduino框架下U8g2驱动I2C OLED时间显示
- SWM181 驱动ssd1306 I2C OLED屏幕显示
SWM181 驱动ssd1306 I2C OLED屏幕显示
最新文章
- redis, memcached, mongo性能比较
- 《Ajax实战》三部曲之“王者归来”
- 使用 GNU Libtool 创建库
- 理解JavaScript的执行机制
- 用Windows Server实现软件定义存储之存储空间直连
- 专转本计算机word知识点,江苏专转本计算机windows和word复习资料(含答案).doc
- python绘图函数m_Python散点图。m的尺寸和样式
- 构建安全网络 比格云全系云产品30天内5折购
- 2019-OO-第二单元总结
- 新版本vsphere支持最大单个vmdk超过2T,理论上支持最大62T
- 前台提交数据到后台为乱码问题解决方式
- Notification使用详解之二:可更新进度的通知
- 图神经网络概述(3):来自IEEE Fellow的GNN综述
- crontrigger java_java CronTrigger用法
- 移动开发即服务,腾讯云移动开发平台打造开发新模式
- 北京喜提初雪,Edg喜夺冠军
- html多张图片合在一块,多张照片怎么拼在一起?10张以上多图拼图方法 超简单! (全文)...
- JVM常用参数与工具
- 网络舆情数据挖掘分析的三点方法和建议
- jmeter常用逻辑控制器的使用(如果(if)控制器)