基于SSD1306的OLED的驱动学习(二):SSD1306的寻址方式

本文详细介绍了SPI通信协议的实现,并针对SSD1306 OLED显示屏的三种寻址模式——页地址寻址、水平地址寻址和垂直地址寻址进行了深入解析。通过代码示例展示了如何在不同模式下进行数据写入,以及地址自动递增的规则。此外,还解释了如何通过特定命令来设定列地址和页地址,以实现精确的显示控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

寻址地址为水平寻址模式,写入示意图如上:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值