OLED 显示模块

  最后代码已上传!!!!
  代码文章链接
   github 代码链接在该文章最后

如果还没有看过I2C 协议的,请移步先看下面这篇文章

 I2C协议

好的,现在我们进入正题

1. 向 OLED 寄存器地址写入一个 byte 的数据

  • 开启 I2C
  • 发送 OLED 设备地址 + 读写控制 (w - 0, r - 1)
    • #define OLED_I2C_WR 0 采用宏定义方式
      #define OLED_I2C_RD 1
  • 一般 OLED 地址为 0x78,不行就尝试下 0x7A
  • 传入参数 addr,为寄存器参数,根据 OLED 手册,0x00 - 写入命令寄存器,0x40 - 写入数据寄存器
  • 每一次发送数据,I2C 都需要作出正确的应答,0 为正确应答,查看该函数具体实现请移步到I2C协议
  • 如果 OLED 设备未正确应答,使用 goto 无条件转移语句,将 I2C 协议停止掉。谨慎使用 goto 语句
void I2C_WriteByte(uint8_t addr,uint8_t data){i2c_Start();           //开启 协议//0x78 转化为 2进制 0111 1110 再或上一个 0 | 1 的值,表示地址最后一位为读写控制指令i2c_SendByte(OLED_ADDRESS|OLED_I2C_WR);        //发送地址 和 读写控制指令if (i2c_WaitAck() != 0){goto cmd_fail;  }   i2c_SendByte(addr);             //发送对应寄存器,判断为0x00发送命令,还是0x40发送数据if (i2c_WaitAck() != 0){goto cmd_fail;   }i2c_SendByte(data);                //对应寄存器为 0x00,该data为命令,对应寄存器为0x40,该data为数据if (i2c_WaitAck() != 0){goto cmd_fail;  }   i2c_Stop();                     //最后 停止协议cmd_fail: i2c_Stop();}

2. 写入命令函数和写入数据函数

  • 由于我们基本上只使用 写入命令 ,和写入数据两个寄存器地址,所以重新封装下函数,使其简单方便
void WriteCmd(unsigned char I2C_Command)
{I2C_WriteByte(0x00, I2C_Command);
}
void WriteDat(unsigned char I2C_Data)
{I2C_WriteByte(0x40, I2C_Data);
}

3. OLED 初始化

这边代码直接使用网上的,如果非要自己编写,请查看 OLED 模块使用手册,某宝一般都会提供,可能为 全英文文档,没错,博主看不懂!

void OLED_Init(void)
{delay_ms(1000);        // 1s,一定要延时,防止错误WriteCmd(0xAE); //display offWriteCmd(0x20); //Set Memory Addressing Mode    WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,InvalidWriteCmd(0xb0);   //Set Page Start Address for Page Addressing Mode,0-7WriteCmd(0xc8);    //Set COM Output Scan DirectionWriteCmd(0x00); //---set low column addressWriteCmd(0x10); //---set high column addressWriteCmd(0x40); //--set start line addressWriteCmd(0x81); //--set contrast control registerWriteCmd(0xff); //亮度调节 0x00~0xffWriteCmd(0xa1); //--set segment re-map 0 to 127WriteCmd(0xa6); //--set normal displayWriteCmd(0xa8); //--set multiplex ratio(1 to 64)WriteCmd(0x3F); //WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM contentWriteCmd(0xd3); //-set display offsetWriteCmd(0x00); //-not offsetWriteCmd(0xd5); //--set display clock divide ratio/oscillator frequencyWriteCmd(0xf0); //--set divide ratioWriteCmd(0xd9); //--set pre-charge periodWriteCmd(0x22); //WriteCmd(0xda); //--set com pins hardware configurationWriteCmd(0x12);WriteCmd(0xdb); //--set vcomhWriteCmd(0x20); //0x20,0.77xVccWriteCmd(0x8d); //--set DC-DC enableWriteCmd(0x14); //WriteCmd(0xaf); //--turn on oled panel
}

4. 设置 OLED 光标起点

  • 参数解释:

    • x ,坐标轴中的 水平 坐标,大小为 0 - 127
    • y,坐标轴中的 垂直 坐标,大小为 0 - 7
void OLED_SetPos(unsigned char x, unsigned char y)
{ WriteCmd(0xb0+y);                //设置页坐标             WriteCmd(((x&0xf0)>>4)|0x10);   //设置 列 高四位地址WriteCmd((x&0x0f)|0x01);      //设置 列 低四位地址
}

5. 全屏填充函数

函数作用:填充每一页,实现全亮,全灭的操作

void OLED_Fill(unsigned char fill_Data)
{unsigned char m,n;for(m=0;m<8;m++){WriteCmd(0xb0+m);    //page0-page7WriteCmd(0x00);        //第四位起始地址WriteCmd(0x10);        //高四位起始地址for(n=0;n<128;n++)   //每页水平坐标为 0 - 127{WriteDat(fill_Data); //写入数据 0x00 为全灭,0xff为全亮}}
}

6. 显示英文,数字字符

  1. 采用 字符库软件生成 16 进制数,放入数组中

  2. 判断是采用 6*8 数组还是 8*16 数组

  3. 空格的 ascll 码为 32 ,需要减去,这样才能得到正确的数字,字母,符号等

  4. 如果为 6*8 的 ascll 码,每个 x 就为 6,所以判断一下 如果同一行后面不能准确显示,就换行,再显示该字符

  5. 设置字符起点,写入对应数据,数据为字符软件生成的字符

  6. case2 表示 8*16 的字符,一行 16 位 16进制数代表某一个英文字符,8*16 代表列数为 8 个,也就是每一行应该输出 8 个 16进制数,总共输出两行,先使用 ascall 码找到英文字符对应的所在位置,再设置 起点坐标,由于一次绘制 8 个 16进制数,所以 x+=8; j++ 表示开始下一个字符


就是类似于

void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{unsigned char c = 0,i = 0,j = 0;switch(TextSize){case 1:{while(ch[j] != '\0'){c = ch[j] - 32;                                   if(x > 126){x = 0;y++;}OLED_SetPos(x,y);for(i=0;i<6;i++)WriteDat(F6x8[c][i]);x += 6;j++;}}break;case 2:{while(ch[j] != '\0'){c = ch[j] - 32;if(x > 120){x = 0;y++;}OLED_SetPos(x,y);for(i=0;i<8;i++)WriteDat(F8X16[c*16+i]); OLED_SetPos(x,y+1);for(i=0;i<8;i++)WriteDat(F8X16[c*16+i+8]);x += 8;j++;}}break;}
}

7. 显示中文字符

  • 与上面 字符串 case 2 中显示相同

  • 这边的字符串数组为 12*12 ,一个汉字为 1个 2*12点阵,所以 addr 为 24*N

void OLED_ShowCN8(unsigned char x, unsigned char y, unsigned char N)
{unsigned char wm=0;unsigned int  adder=24*N;OLED_SetPos(x , y);for(wm = 0;wm < 12;wm++){WriteDat(F12x12[adder]);adder += 1;}OLED_SetPos(x,y + 1);for(wm = 0;wm < 12;wm++){WriteDat(F12x12[adder]);adder += 1;}
}

最后

 第一次尝试编写博客,若是有什么建议,欢迎批评指出。

后续会逐步分块更新,并会在最后一篇文章上传源代码。

  最后一篇文章已更新,代码在该篇文章最后

  一文带你了解 MQTT 协议 代码在该文章最后

 若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连!

OLED 显示模块程序详解相关推荐

  1. 【STM32】OLED 显示实验代码详解

    文章目录 main.c oled.c oled.h main.c #include "led.h" #include "delay.h" #include &q ...

  2. python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...

    一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...

  3. Dede二次开发程序详解(dede爱好者必备)

    Dede二次开发程序详解(dede爱好者必备) 调用说明:推荐会员(带用户头像)  [quote] {dede:sql sql="SELECT mid,mtype,userid,uname, ...

  4. KBQA_多轮对话——模型源码解析(一)Pickle模块功能详解

    KBQA_多轮对话--模型源码解析(一)Pickle模块功能详解 pickle --- Python 对象序列化的基本功能 1.pickle基本概念 2.pickle 与 json 模块的比较 3.p ...

  5. matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇

    MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...

  6. 从程序详解拒绝服务***

    从程序详解拒绝服务*** 拒绝服务(Denial of Service,  DoS)***是最简单的网络***形式之一,它只阻止对服务或资源的访问,而不是试图窃取信息.DoS***有两种常见的形式:使 ...

  7. 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt

    基于MATLAB的车牌识别程序详解 自定义一个字符函数,用来从车牌区域中提取出7个字符,其中利用切割函数来进行切割. 程序:function [word,result]=getword(d) word ...

  8. python中importlib模块安装_Python中标准模块importlib详解

    Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...

  9. python3 json模块_详解python 3.6 安装json 模块(simplejson)

    JSON 相关概念: 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反 ...

最新文章

  1. 给SAP系统安装联机帮助(事务码SR13)
  2. stringbuffer的最大长度_Java中的String、StringBuffer和StringBuilder
  3. camerax 自动聚焦_Android实现手机摄像头的自动对焦
  4. 框架中的左侧菜单关联右侧页面是如何实现的_前端基础学习:Vue2.0实现移动端外卖平台项目,参考旧版饿了么!...
  5. oracle函数总结
  6. 一加8 Pro渲染图曝光:骁龙865+挖孔屏+后置四摄
  7. 利用finereport建设保险公司决策分析系统的思路和方法
  8. 新站如何在两个月之内冲到百度首页
  9. 创建和销毁对象(1)
  10. 汇率兑换 双向兑换_常出国的你一定要看:如何兑换外币最省钱?
  11. 防护针对SQL Server数据库的SQL注入攻击
  12. 关于if else 和 switch 的区别 究竟哪个更快
  13. 泰格收银系统_泰格超市收银系统
  14. HBase 下载地址
  15. 橡胶软接头加防拉脱限位装置
  16. 3.32 小猪短租的爬虫-
  17. JavaWeb-6Servlet
  18. 如何甄选出一个优秀的软件供应商?by彭文华
  19. HTML中input:file标签的使用
  20. Java在编译到执行过程的编码问题

热门文章

  1. 实现网页直播源码的直播与视频回放功能
  2. jupyter库的安装
  3. 2023 届校招薪资爆料汇总
  4. 电驱动系列:十七、相绕组的磁势、分布系数、绕组系数及齿谐波(电机篇)
  5. ADAS技术以及产品详解
  6. onfinishinflate()方法
  7. Java byte数组与十六进制字符串互转
  8. 随机生成1-6的数字
  9. php反弹教程,详解NC反弹shell的几种方法
  10. 阿里巴巴脱贫基金半年报发布:800余贫困县半年电商销售超260亿