关于OLED屏的笔记

文章详细介绍了OLED显示技术的工作原理,包括自发光特性、通信协议以及与STM32微控制器的接口操作。通过8080并行通信进行数据传输,并提供了初始化序列、写入数据的步骤以及字符显示的实现方法。代码示例展示了如何在OLED屏幕上画点、显示字符和数字。

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

OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。

OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。 常用的OLED屏幕有蓝色、黄色、白色等几种。屏的大小为0.96寸,像素点为 128*64,所以我们称为0.96oled屏或者12864屏。

------------------------------------------------------------------------------------

如何让字符显示在OLED屏幕上:

由于我们实际上是在和OLED的驱动IC通信,所以我们要选择驱动的相应时序8080时序。然后利用厂家给的初始化序列进行屏幕初始化。然后再进行画点读点的操作。

接下来介绍8080并行通信的读/写操作过程。

1、设置DC电平,选择写入类型(高电平为读写数据,低电平为读写命令);

2、拉低片选,选中我们的操作设备;

3、设置RD(读)/WD(写)为低电平,选择操作方式,再拉高选择的操作位,使之产生一个上升沿触发信号,会将数据锁存/写入,等于是在这个上升沿之后命令有效。

接下来以写入为例进行示范:根据需求自行选择DC电平,比如说读写数据的时候我们选择高电平;接下来拉低CS选中相应OLED屏设备;然后拉低WR线,准备进行写入数据;接下来在数据线上进行数据准备;然后我们再拉高WR线,产生一个上升沿触发信号,此时我们的数据线上的数据会被读取;然后再分别释放CS和DC线。

接下来进行代码示范:

void oled_wr_byte(uint8_t data, uint_8 cmd){

    OLED_RS(cmd); //数据类型,有传参决定
    OLED_CS(0);
    OLED_WR(0);
    oled_data_out(data); //数据线准备
    OLED_WR(1);
    OLED_CS(0);
    OLED_RS(cmd); //释放,恢复默认

}

void oled_data_out(uint8_t data){

    GPIOC->ODR = (GPIOC->ODR & 0xFF00) | (data & 0x00FF); //D[7:0]使用的是PC0~7,前一段清空后8位的数据,,后一段传入数据
}

整个OLED屏幕分成了八页,说白了就是把OLED的屏幕把宽平均分成了八份。比如想要在第0列第三行的开头显示一个点那就是按位来配置,0000 0100(0x08)。在对GRAM进行操作的时候,列地址指针自动递增,当列地址指针达到列结束地址的时候,重置开始地址,但页指针不变。用户必须设置新的页和列地址,才能访问下一页GRAM内容。

 

 STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM。

代码实现如下:

static uint8_t g_oled_gram[128][8]; //OLED的显存,前面是列数,后面是页数

void oled_refresh_gram(void){

    unit8_t i,n;

    for(i=0;i<8;i++){
        oled_wr_byte(0xB0 + i, OLED_CMD); //设置页地址
        oled_wr_byte(0x00, OLED_CMD);     //设置列低地址
        oled_wr_byte(0x10, OLED_CMD);     //设置列高地址

        for(n=0;n<128;n++){
            oled_wr_byte(g_oled_gram[n][i], OLED_DATA);
        }
    }
}

一个通用的置1表达式为OLED_GRAM[x][y/8] |= 1<< y%8;

然后给出标准画点的代码:

void oled_draw_point(uint8_t x, uint8_t y, uint8_t dot){

    uint8_t pos, bx, temp = 0;
    if(x > 127 || y > 63) return;

    pos = y / 8;    //页地址
    bx = y % 8;     //在页中纵坐标的位置
    temp = 1 << bx; //转换后y对应的bit位置
    
    if(dot)
        g_oled_gram[x][pos] |= temp;
    else
        g_oled_gram[x][pos] |= ~temp;

}

接下来介绍字符显示原理:

1、显示字符必须有相应的点阵数据,点阵数据的集合叫做字库;

2、单片机根据点阵数据按取模放进行描点还原,从而显示字符;

3、ASCII字符宽度 = 汉字宽度的一半。

画点遵循原则:从上到下,从左到右,高位在前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值