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);
寻址地址为水平寻址模式,写入示意图如上: