找回密码
 立即注册
查看: 2174|回复: 9

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

[复制链接]
  • TA的每日心情
    奋斗
    前天 08:47
  • 签到天数: 142 天

    [LV.7]常住居民III

    29

    主题

    559

    回帖

    2116

    积分

    荣誉版主

    积分
    2116
    发表于 2023-8-29 10:43:37 | 显示全部楼层 |阅读模式
    本帖最后由 gentleman 于 2023-8-30 08:20 编辑

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

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

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

    直接上干货
    读ssd1315手册  点oled屏幕 (含指令解读)-1.png



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

        读ssd1315手册  点oled屏幕 (含指令解读)-3.png
    支持5种协议,直接看4线spi

        读ssd1315手册  点oled屏幕 (含指令解读)-4.png
                读ssd1315手册  点oled屏幕 (含指令解读)-5.png

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

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

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

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

    1. /// @brief oled写命令
    2. /// @param cmd
    3. void oledWriteCmd(uchar cmd)
    4. {
    5.     DC = 0;
    6.     spi_Send(cmd);
    7. }
    8. /// @brief oled写数据
    9. /// @param cmd
    10. void oledWriteDat(uchar cmd)
    11. {
    12.     DC = 1;
    13.     spi_Send(cmd);
    14. }
    复制代码


    继续看手册
    读ssd1315手册  点oled屏幕 (含指令解读)-6.png


    读ssd1315手册  点oled屏幕 (含指令解读)-7.png


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

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

    读ssd1315手册  点oled屏幕 (含指令解读)-8.png


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

    直奔指令列表
        读ssd1315手册  点oled屏幕 (含指令解读)-9.png

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

          
    1.     oledWriteCmd(0xAE); // 关屏
    2.     oledWriteCmd(0x00); // 低列地址
    复制代码


    读ssd1315手册  点oled屏幕 (含指令解读)-10.png


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

    1. oledWriteCmd(0x20); // 设置页模式  双字节指令
    2.     oledWriteCmd(0x02); //
    复制代码


    读ssd1315手册  点oled屏幕 (含指令解读)-11.png


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

    读ssd1315手册  点oled屏幕 (含指令解读)-12.png


    设置显示起始线
    默认000000b
      我们也0开始
    1.     oledWriteCmd(0x40); // 起始地址线
    复制代码
    读ssd1315手册  点oled屏幕 (含指令解读)-13.png

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


    读ssd1315手册  点oled屏幕 (含指令解读)-14.png


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



    读ssd1315手册  点oled屏幕 (含指令解读)-15.png

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



    读ssd1315手册  点oled屏幕 (含指令解读)-16.png


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

    1.     oledWriteCmd(0xAD); // 设置电流
    2.     oledWriteCmd(0x00); //
    复制代码



    读ssd1315手册  点oled屏幕 (含指令解读)-17.png


    开关屏的
    AE 关 AF 打开

    先关,最后初始化完成开

    读ssd1315手册  点oled屏幕 (含指令解读)-18.png


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

    读ssd1315手册  点oled屏幕 (含指令解读)-19.png


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

    1.     oledWriteCmd(0xC0); // 反向模式从COM[N-1]扫描到COM[0]   0xc0上下反置 0xc8正常
    复制代码
    读ssd1315手册  点oled屏幕 (含指令解读)-20.png


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


    读ssd1315手册  点oled屏幕 (含指令解读)-21.png


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

    1. oledWriteCmd(0xD5); // 设置分频与时钟频率  双字
    2.     oledWriteCmd(0x80); //
    复制代码
    读ssd1315手册  点oled屏幕 (含指令解读)-22.png


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


    读ssd1315手册  点oled屏幕 (含指令解读)-23.png


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

    读ssd1315手册  点oled屏幕 (含指令解读)-24.png


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

    1. oledWriteCmd(0xDB); // 设置VCOM电压
    2.     oledWriteCmd(0x40); // 0.77xVCC
    复制代码


    读ssd1315手册  点oled屏幕 (含指令解读)-25.png


    NOP 空指令 啥都不干

    读ssd1315手册  点oled屏幕 (含指令解读)-26.png


    电荷泵设置
    不用电荷泵

    1. oledWriteCmd(0x14); // 关闭电荷泵
    2.     oledWriteCmd(0xAF);
    复制代码


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

    页寻址模式

    读ssd1315手册  点oled屏幕 (含指令解读)-27.png

    读ssd1315手册  点oled屏幕 (含指令解读)-28.png

             其余寻址模式先不看

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

             开始写代码

            先写选坐标位置的
          
    1. /// @brief 设置oled坐标
    2. /// @param page 第几页
    3. /// @param col 第几列
    4. void oledSetPos(uint page, uint col)
    5. {
    6.     oledWriteCmd(0xB0 + page);
    7.     oledWriteCmd(col & 0xf);
    8.     oledWriteCmd(0x10 + (col >> 4));
    9. }
    复制代码
    1. /// @brief 输出一个字符
    2. /// @param page  第几页  0~7
    3. /// @param col   第几列 0~127
    4. /// @param c     显示的字符
    5. void oledPutChar(uint page, uint col, char c)
    6. {
    7.     uint i = 0;
    8.     unsigned char *dots = oled_ascii_8_16[c - ' '];
    9.     /* 发坐标 */
    10.     oledSetPos(page, col);
    11.     /* 发出1页数据 */
    12.     for (i = 0; i < 8; i++)
    13.         oledWriteDat(dots[i]);
    14.     oledSetPos(page + 1, col);
    15.     /* 发出2页数据 */
    16.     for (i = 0; i < 8; i++)
    17.         oledWriteDat(dots[i + 8]);
    18. }
    复制代码

           先发第一页的8行 8x8的数据
           再发下一页的8行 数据

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

            再写个字符串的
    1. /// @brief 输出8x16字符串
    2. /// @param page 第几页 0~7
    3. /// @param col  第几列 0~128
    4. /// @param str 显示的字符串
    5. void oledPrint(uint page, uint col, char *str)
    6. {
    7.     uint i = 0;
    8.     while (str[i]) {
    9.         oledPutChar(page, col, str[i]);
    10.         //        col += 8;
    11.         col += 8;
    12.         if (col > 127) {
    13.             col = 0;
    14.             page += 2;
    15.         }
    16.         i++;
    17.     }
    18. }
    复制代码
          发完一个字符 行+8
           加满了 >127 就 页+2
          
          再main中调用初始化与 显示函数
         
    1. void main()
    2. {
    3.     P0M0 = 0x00;
    4.     P0M1 = 0x00;
    5.     P1M0 = 0x00;
    6.     P1M1 = 0x00;
    7.     P2M0 = 0x00;
    8.     P2M1 = 0x00;
    9.     P3M0 = 0x00;
    10.     P3M1 = 0x00;
    11.     P4M0 = 0x00;
    12.     P4M1 = 0x00;
    13.     P5M0 = 0x00;
    14.     P5M1 = 0x00;
    15.     P6M0 = 0x00;
    16.     P6M1 = 0x00;
    17.     P7M0 = 0x00;
    18.     P7M1 = 0x00;
    19.     oled_Init();
    20.     while (1) {
    21.         oledPrint(2, 20, "Hello  World");
    22.     }
    23. }
    复制代码








    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:47
  • 签到天数: 142 天

    [LV.7]常住居民III

    29

    主题

    559

    回帖

    2116

    积分

    荣誉版主

    积分
    2116
     楼主| 发表于 2023-8-29 10:47:22 | 显示全部楼层
    本帖最后由 gentleman 于 2024-3-19 18:32 编辑

    OledDrive.7z (45.38 KB, 下载次数: 71) SSD1315.pdf (1.9 MB, 下载次数: 62) OledDrive_32.7z (40.92 KB, 下载次数: 11)

    测试图片
    oled试验箱.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:47
  • 签到天数: 142 天

    [LV.7]常住居民III

    29

    主题

    559

    回帖

    2116

    积分

    荣誉版主

    积分
    2116
     楼主| 发表于 2023-8-30 07:26:56 | 显示全部楼层
    stc32g系列 换个头文件换个编译器应该就行了,有人需要我在发
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 08:36
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    11

    主题

    183

    回帖

    1802

    积分

    版主

    积分
    1802
    QQ
    发表于 2023-8-30 09:26:46 | 显示全部楼层
    感谢楼主的分享和支持
    QQ:1638975601
    手机:19952583876
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:47
  • 签到天数: 142 天

    [LV.7]常住居民III

    29

    主题

    559

    回帖

    2116

    积分

    荣誉版主

    积分
    2116
     楼主| 发表于 2023-8-30 10:23:09 | 显示全部楼层
    STC芯征程 发表于 2023-8-30 09:26
    感谢楼主的分享和支持

    和大家一起学习,共同进步
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    23

    积分

    新手上路

    积分
    23
    发表于 2023-12-28 16:27:18 | 显示全部楼层
    感谢分享。
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 12:59
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    1

    主题

    7

    回帖

    39

    积分

    新手上路

    积分
    39
    发表于 2024-3-19 16:02:33 | 显示全部楼层
    gentleman 发表于 2023-8-30 07:26
    stc32g系列 换个头文件换个编译器应该就行了,有人需要我在发

    我非常需要楼主 跪求

    点评

    2L 补了  详情 回复 发表于 2024-3-19 18:31
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:47
  • 签到天数: 142 天

    [LV.7]常住居民III

    29

    主题

    559

    回帖

    2116

    积分

    荣誉版主

    积分
    2116
     楼主| 发表于 2024-3-19 18:31:28 | 显示全部楼层
    油桃子 发表于 2024-3-19 16:02
    我非常需要楼主 跪求

    2L 补了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 12:59
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    1

    主题

    7

    回帖

    39

    积分

    新手上路

    积分
    39
    发表于 2024-3-24 09:28:57 | 显示全部楼层

    谢谢楼主 祝你天天开心
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    13 小时前
  • 签到天数: 45 天

    [LV.5]常住居民I

    0

    主题

    157

    回帖

    353

    积分

    中级会员

    积分
    353
    发表于 2024-3-24 10:55:29 | 显示全部楼层
    对初始化的每个步骤都很详细说明,我之前不是很清楚电荷泵的部分,感谢分享,
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-2 23:27 , Processed in 0.093613 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表