gentleman 发表于 2023-8-29 10:43:37

读ssd1315手册 点oled屏幕 (含指令解读)

本帖最后由 gentleman 于 2023-8-30 08:20 编辑

【如果出现大片空白,刷新一下就好,图片太多有时候加载不出来】

本文通过对ssd1315手册解读,来一步一步点亮oled12864屏幕,

测试环境 :stc8h8k64u试验箱4wire spi模式

直接上干货




我的屏幕是ssd1315的芯片,ssd1306 大部分指令通用
      
这是ssd1315 的内部模块图
   可以看到右侧 是COM0~127SEG0~127, 说明点屏的本质还是点灯,和点数码管是一样的,驱动芯片的目的是为了节省IO 与自动刷新
   左侧是ssd1315支持的各种协议,今天我会用4线spi进行驱动

   
支持5种协议,直接看4线spi

   
         

与常见的3线spi 基本相同,这里多了个D/C引脚
D/C 低发 命令    D/C 高 发数据
CS 低时 在slck 时钟上升沿读取 8位数据

这里直接采用stc8h的硬件 spi进行驱动

由于stc8h 的硬件spi过于简单,这里不过多叙述 (就2个寄存器 SPCTLSPSTAT)

添加两个函数用于发 指令与 数据

/// @brief oled写命令
/// @param cmd
void oledWriteCmd(uchar cmd)
{
    DC = 0;
    spi_Send(cmd);
}

/// @brief oled写数据
/// @param cmd
void oledWriteDat(uchar cmd)
{
    DC = 1;
    spi_Send(cmd);
}

继续看手册






ssd1315里有一块内存 分8页 每页对应8行128列 seg0~127
这也就是为什么 我们在驱动屏幕的时候,数据要一页一页的送,后面再详细说

手册种各种协议的时序,保持时间等部分跳过




由于购买的模块,这部分也都直接做好了。

直奔指令列表
   

      来了,开始初始化屏幕
      这一条是设置低 列的起始地址   低4位设置低列的地址 默认0000
       仅在页寻址模式有效。
       我们要用的就是页寻址模式驱动
       把他设置上

      
    oledWriteCmd(0xAE); // 关屏
    oledWriteCmd(0x00); // 低列地址




设置寻址模式,这是个双字节指令,第一个字节是20
我们用页寻址模式

oledWriteCmd(0x20); // 设置页模式双字节指令
    oledWriteCmd(0x02); //




这两条不是页寻址模式的,不用管他们




设置显示起始线
默认000000b
我们也0开始    oledWriteCmd(0x40); // 起始地址线


这条也是双字节指令,这条应该是对比度设置
设置为7F
oledWriteCmd(0x81); // 设置对比度 双字
    oledWriteCmd(0x7F); //




反转ram数据
原来是1 灯亮,反转后是0 灯亮
A6 不反转,
    oledWriteCmd(0xA6); // 不反转显示





这条没看懂是啥, 设置多态比
好像和通讯速度有关
   就按默认的来3f,也是双字指令
oledWriteCmd(0xA8); // 设置复用率 双字
    oledWriteCmd(0x3f); //





设置电流的不要动就默认00

    oledWriteCmd(0xAD); // 设置电流
    oledWriteCmd(0x00); //





开关屏的
AE 关 AF 打开

先关,最后初始化完成开




设置页,后面要用 ,页寻址模式有效




设置COM 引脚的扫描方向
由于试验箱的屏幕是反的
这个也要设为C0

    oledWriteCmd(0xC0); // 反向模式从COM扫描到COM   0xc0上下反置 0xc8正常



偏移量 ,他这个应该是上下偏移的
可以给他改个值看看
此处设为00
    oledWriteCmd(0xD3); // 屏幕偏移 双字
    oledWriteCmd(0x00); // 不偏移




设置分频与时钟周期
这里按照默认的就好,应该是不分配 1khz?

oledWriteCmd(0xD5); // 设置分频与时钟频率双字
    oledWriteCmd(0x80); //


设置点灯周期
这里15个时钟亮1个周期灭
oledWriteCmd(0xD9); // 设置电灯周期双字
    oledWriteCmd(0xF1); //




COM 引脚硬件设置
不要动,买的模块都是默认的




com引脚电压 ,这里设置为0.77倍的VCC

oledWriteCmd(0xDB); // 设置VCOM电压
    oledWriteCmd(0x40); // 0.77xVCC




NOP 空指令 啥都不干




电荷泵设置
不用电荷泵

oledWriteCmd(0x14); // 关闭电荷泵

    oledWriteCmd(0xAF);

到此初始化完成 打开屏幕
后面滚动的指令先不看,先把屏点亮

页寻址模式





         其余寻址模式先不看

         这就是提到多次的页寻址模式,
         整个屏幕分成8个页
         每页8*128个像素(就是led灯)
         

         开始写代码

      先写选坐标位置的
      /// @brief 设置oled坐标
/// @param page 第几页
/// @param col 第几列
void oledSetPos(uint page, uint col)
{
    oledWriteCmd(0xB0 + page);

    oledWriteCmd(col & 0xf);
    oledWriteCmd(0x10 + (col >> 4));
}/// @brief 输出一个字符
/// @param page第几页0~7
/// @param col   第几列 0~127
/// @param c   显示的字符
void oledPutChar(uint page, uint col, char c)
{
    uint i = 0;

    unsigned char *dots = oled_ascii_8_16;

    /* 发坐标 */
    oledSetPos(page, col);
    /* 发出1页数据 */
    for (i = 0; i < 8; i++)
      oledWriteDat(dots);

    oledSetPos(page + 1, col);
    /* 发出2页数据 */
    for (i = 0; i < 8; i++)
      oledWriteDat(dots);
}
       先发第一页的8行 8x8的数据
       再发下一页的8行 数据

      c-‘’ 这里大家都能看懂吧
      看不懂试一下就懂了

      再写个字符串的
/// @brief 输出8x16字符串
/// @param page 第几页 0~7
/// @param col第几列 0~128
/// @param str 显示的字符串
void oledPrint(uint page, uint col, char *str)
{
    uint i = 0;
    while (str) {
      oledPutChar(page, col, str);
      //      col += 8;
      col += 8;
      if (col > 127) {
            col = 0;
            page += 2;
      }
      i++;
    }
}       发完一个字符 行+8
       加满了 >127 就 页+2
      
      再main中调用初始化与 显示函数
      void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    oled_Init();

    while (1) {
      oledPrint(2, 20, "HelloWorld");
    }
}







gentleman 发表于 2023-8-29 10:47:22

本帖最后由 gentleman 于 2024-3-19 18:32 编辑



测试图片


gentleman 发表于 2023-8-30 07:26:56

stc32g系列 换个头文件换个编译器应该就行了,有人需要我在发

芯征程 发表于 2023-8-30 09:26:46

感谢楼主的分享和支持{:4_174:}

gentleman 发表于 2023-8-30 10:23:09

STC芯征程 发表于 2023-8-30 09:26
感谢楼主的分享和支持

和大家一起学习,共同进步{:4_183:}

gaoyang9992006 发表于 2023-12-28 16:27:18

感谢分享。

油桃子 发表于 2024-3-19 16:02:33

gentleman 发表于 2023-8-30 07:26
stc32g系列 换个头文件换个编译器应该就行了,有人需要我在发

我非常需要楼主 跪求

gentleman 发表于 2024-3-19 18:31:28

油桃子 发表于 2024-3-19 16:02
我非常需要楼主 跪求

2L 补了

油桃子 发表于 2024-3-24 09:28:57

gentleman 发表于 2024-3-19 18:31
2L 补了

谢谢楼主 祝你天天开心{:victory:}

yjawei 发表于 2024-3-24 10:55:29

对初始化的每个步骤都很详细说明,我之前不是很清楚电荷泵的部分,感谢分享,
页: [1] 2
查看完整版本: 读ssd1315手册 点oled屏幕 (含指令解读)