打印
[研电赛技术支持]

【GD32F303红枫派使用手册】第二十二讲 IIC-IIC OLED显示实验

[复制链接]
853|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聚沃科技 于 2024-6-22 10:09 编辑


22.1 实验内容
通过本实验主要学习以下内容:
• OLED驱动原理
• IIC驱动OLED显示操作
22.2 实验原理
OLED模块的驱动芯片为SSD1306,其显存大小总共为 128*64bit 大小,SSD1306 将这些显存分为了 8 页,其对应关系如下所示:
SSD1306 的命令比较多,这里我们仅介绍几个比较常用的命令,这些命令如下所示:
我们再来介绍一下 OLED 模块的初始化过程,SSD1306 的典型初始化框图如下图:
22.3 硬件设计
OLED电路如下所示,该OLED驱动使用PB10PB11引脚,本例程采用IIC的驱动方式。

22.4 代码解析
22.4.1 主函数
主函数代码如下所示,调用bsp_oled_init进行OLED初始化,之后循环显示图片/字符串以及数字。
C
int main(void)
{
  delay_init();                                                                                                                                                                                                                        /* 延迟函数初始化 */
        BOARD_UART.uart_mode_tx=MODE_DMA;                                                                                                                                        /* 配置串口为DMA模式 */
        bsp_uart_init(&BOARD_UART);                                                                                                                                                          /* 初始化串口 */
        printf("Start OLED display demo! \r\n");                                                                                                        /* 显示启动OLED显示实验 */
        bsp_oled_init();                                                                                                                                                                                                        /* OLED初始化 */
        while (1)
        {
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
                  bsp_oled_**(0,0,128,32,gImage_juwo2);                                                                                                /* 显示聚沃***/
                  delay_ms(1000);                                                                                                                                                                                                /* 延迟1000ms间隔 */
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
                  bsp_oled_**(20,0,86,64,gImage_gd_**);                                                                                        /* 显示GD ***/
                  delay_ms(1000);                                                                                                                                                                                                /* 延迟1000ms间隔 */
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
                  bsp_oled_showstring(20,0,(uint8_t *)"ju wo ke ji",FONT_8_16); /* 显示聚沃科技字符串 */
                  bsp_oled_shownum(30,3, 1234,4,FONT_8_16);                                                                                        /* 显示数字 */
                  delay_ms(1000);                                                                                                                                                                                                /* 延迟1000ms间隔 */
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
        }
}
22.4.2 OLED初始化函数
OLED初始化函数如下,通过该函数可完成对外部OLED模块初始化。
C
void bsp_oled_init(void)
{
    bsp_i2c_config();                                   /* IIC接口初始化 */

    bsp_oled_write_byte(0xAE,OLED_CMD);                 /* 关闭oled 显示 */

    bsp_oled_write_byte(0x81,OLED_CMD);                 /* 设置对比度控制寄存器 */
    bsp_oled_write_byte(BRIGHTNESS,OLED_CMD);           /* 设置对比度, 0x00-0xff */

    bsp_oled_write_byte(0xA0,OLED_CMD);                 /* 设置seg/row映射,row地址127映射到seg0 */
    bsp_oled_write_byte(0xC0,OLED_CMD);                 /* 设置com/row扫描方向,从com[n-1]扫描到com0 */

    bsp_oled_write_byte(0xD5,OLED_CMD);                 /* 设置显示时钟分频比/振荡器频率 */
    bsp_oled_write_byte(0x80,OLED_CMD);                 /* 分频比为1,使用默认的内部时钟*/
    bsp_oled_write_byte(0xA8,OLED_CMD);                 /* 设置多路复用比率, 0x0f-0x3f */
    bsp_oled_write_byte(0x3F,OLED_CMD);                 /* 1/64 占空比 */

    bsp_oled_write_byte(0xD3,OLED_CMD);                 /* 通过com设置0d~63d的垂直偏移 */
    bsp_oled_write_byte(0x00,OLED_CMD);                 /* 不偏移 */

    bsp_oled_write_byte(0xD9,OLED_CMD);                 /* 设置预充电时间 */
    bsp_oled_write_byte(0xF1,OLED_CMD);                 /* 将预充电设置为15个时钟,将放电设置为1个时钟 */

    bsp_oled_write_byte(0xDA,OLED_CMD);                 /* 设置com引脚硬件配置 */
    bsp_oled_write_byte(0x12,OLED_CMD);                 /* 顺序com引脚配置和禁用com左/右重映射 */

    bsp_oled_write_byte(0xDB,OLED_CMD);                 /* 调整Vcom调节器输出 */
    bsp_oled_write_byte(0x30,OLED_CMD);                 /* 设置 Vcom 为 0.83Vcc */

    bsp_oled_write_byte(0x20,OLED_CMD);                 /* 设置存储器寻址模式, 0x00-0x02 */
    bsp_oled_write_byte(0x02,OLED_CMD);                 /* 页面寻址模式 */

    bsp_oled_write_byte(0x8D,OLED_CMD);                 /* 电荷泵设置 */
    bsp_oled_write_byte(0x14,OLED_CMD);                 /* 使能电荷泵*/

    bsp_oled_write_byte(0xA4,OLED_CMD);                 /* 禁用整个显示, 0xA4 or 0xA5 */

    bsp_oled_write_byte(0xA6,OLED_CMD);                 /* 设置正常显示,0为OFF显示,1为ON显示*/

    bsp_oled_write_byte(0xAF,OLED_CMD);                 /* 正常模式或睡眠模式, 0xAF or 0xAE */

    bsp_oled_clear(0);
}
22.4.3 OLED显示图片函数
OLED显示图片函数如下,其中形参说明如下:x为图片起始地址的x坐标,y为图片起始位置的y坐标,x_res为图片分辨率的x轴分辨率,y_res为分辨率的y轴分辨率,比如图片为128*32显示,则x_res128y_res32pbuff为图片数组的指针。
C
void bsp_oled_**(uint8_t x, uint8_t y, uint8_t x_res, uint8_t y_res, uint8_t *pbuff)
{
    uint8_t i,n;
          uint8_t y_num;
          uint16_t pixel;
          pixel = x_res*y_res;
    if(y_res%8>0)
                {
                        y_num = y_res/8 +1;
                }else{
          y_num = y_res/8;
                }
         
    /* 显示log */
    for(i=0;i<y_num;i++){
        /* 设置页面寻址模式的页面起始地址(B0h~B7h) */
        bsp_oled_write_byte (0xB0+i,OLED_CMD);
        /* 为页面寻址模式设置低四位列起始地址(00h~0Fh) */
        bsp_oled_write_byte (0x00,OLED_CMD);
        /* 为页面寻址模式设置高四位列起始地址(10h~1Fh) */
        bsp_oled_write_byte (0x10,OLED_CMD);
                          /* 设置坐标 */
        bsp_oled_set_pos(x,y+i);
        /* l传输图片数据 */
        for(n=0;n<x_res;n++){
                                          if(i*x_res+n<pixel)
                                                {
            bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA);
                                                }else{
                                                        break;
                                                }
        }
    }
}
在图片显示的应用中需要对图片进行取模,开发板配套资料中有取模软件以及使用说明,本文档中简要介绍取模方法:
调整图片为合适分辨率和格式
将图片调整到合适分辨率,如果分辨率比较大的话,可以使用PS等工具,调整到128*64分辨率以内,格式的话建议调整为bmp格式文件。
使用取模工具进行取模
取模可使用资料中带的以下工具。
选择图片模式。
点击文件,打开要取模的图片,点击选项,进行设置。
最后点击生成字模。
将生成的字模复制到代码的数组中。
另外也可以对汉字和英文进行取模,使用方法类似,可以参考资料中的说明。
22.4.4 字符串显示函数
字符串显示函数如下所示,通过该函数可在任意起始地址显示字符串。
C
void bsp_oled_showstring(uint8_t x, uint8_t y, uint8_t *ch, oled_font size)
{
    uint8_t j=0;

    while(ch[j]!='\0'){
        bsp_oled_showchar(x,y,ch[j],size);
        x += 8;
        if(x>120){
            x = 0;
            y += 2;
        }
            j++;
    }
}
22.5 实验结果
将本例程下载到红枫派开发板中,并将H10跳线帽加上,上电运行后将会看到OLED屏上循环显示聚沃科技**GD **、字符串以及数字。


本教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

103

帖子

2

粉丝