【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解

目录

  • 硬知识
    • SSD1306简介
    • I2C 接口
      • 从机地址位(SA0)
      • I2C 总线写数据
      • 命令解码器
    • 晶振电路和显示时间发生器
    • 复位
    • 图形显示数据RAM (GDDRAM)
    • 命令表
      • 基本命令表
        • 部分指令详解
          • 为 BANK0 设置对比度控制(81h)
          • 全部显示开启(A4h/A5h)
          • 设置正常/反相显示(A6h、A7h)
          • 设置显示关、开(AEh、AFh)
      • 滚屏命令
        • 部分指令详解
          • 水平滚动设置(26h 27h)
          • 持续垂直和水平滚动设置(29h 2Ah)
          • 关闭滚动(2Eh)
          • 激活滚动(2Fh)
          • 设置垂直滚动区域(A3h)
      • 地址设置命令表
        • 部分指令详解
          • 设置低列开始地址作为页地址模式(00h~0Fh)
          • 设置高列开始地址作为页地址模式(10h~1Fh)
          • 设置内存地址模式(20h)
          • 设置列地址(21h)
          • 设置页地址(22h)
          • 设置页开始地址作为页寻址模式(B0h~B7h)
      • 硬件配置(面板分辨率和版面相关)命令表
        • 部分指令详解
          • 设置显示开始行(40h~7Fh)
          • 设置 Segment 重映射(A0h/A1h)
          • 设置复用率(A8h)
          • 设置 COM 输出扫描方向(C0h、C8h)
          • 设置显示偏移(D3h)
          • 设置 COM 引脚硬件配置(DAh)
      • 时钟和驱动方案设置命令表
        • 部分指令详解
          • 设置显示时钟分频率、振荡器频率(D5h)
          • 设置重充电周期(D9h A[7:0])
          • 设置 Vcomh 取消选择水平(DBh A[6:4])
          • NOP(E3h)
  • 示例程序
    • oled.c
    • oled.h
    • oledfont.h
    • 测试程序
    • 实验现象

普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


2022/1/12 重制,统一了SPI版和I2C版本的代码

硬知识

摘自SSD1306-OLED驱动芯片中文手册
排版比较神秘

SSD1306简介

       SSD1306 是一个单片 CMOS OLED/PLED 驱动芯片,可以驱动有机/聚合发光二极管点阵图形显示系统。由 128 segments 和 64 Commons 组成。该芯片专为共阴极 OLED 面板设计。
       SSD1306 中嵌入了对比度控制器、显示 RAM 和晶振,并因此减少了外部器件和功耗。有 256级亮度控制。数据/命令的发送有三种接口可选择:6800/8000 串口,I2C 接口或 SPI 接口。

I2C 接口

从机地址位(SA0)

       SSD1306 在发送或接受任何信息之前必须识别从机地址。设备将会响应从机地址,后面
       跟随着从机地址位(SA0 位)和读写选择位(R/W#位),格式如下:
在这里插入图片描述
       SA0 位为从机地址提供了一个位的拓展。01111000x3c) 或 01111010x3d) 都可以做为 SSD1306 的从机地址。D/C#引脚作为 SA0 用于从机地址选择。R/W#为用来决定 I2C 总线接口的操作模式。
       R/W# = 1,读模式。R/W# = 0 写模式

I2C 总线写数据

       I2C 总线接口提供了写数据和命令到设备的接口。关于 I2C 总线的写模式的时序请参考下图:
在这里插入图片描述
I2C 的写模式

  1. 主机设备通过开始条件初始化数据通讯。开始条件的定义在下面的图中展示。开始条件通过将 SDA 从高拉低而 SCL 保持高建立。
  2. 从机地址紧跟着开始条件作为标志用。对于 SSD1306,从机地址可以是“b0111100”或
    “b0111101”通过改变 SA0 到 LOW 或 HIGH(D/C 引脚作为 SA0)。
  3. 写模式的建立是通过设置 R/W#为到逻辑 0 实现的。
  4. 应答位信号将在接收到一个字节的数据后发生包括从机地址和 R/W#位。可以参考下面的应答位信号的图示。应答位的定义是在应答位相关的时钟脉冲的高周期中把 SDA 线拉低。
  5. 传输完从机地址之后,控制字节或数据字节开始通过 SDA 传输。一个控制字节主要由
    CO 和 D/C#位后面再加上六个 0 组成的。
    a) 如果 CO 为设为逻辑 0,后面传输的信息就只包含数据字节。
    b) D/C 位决定了下个数据字节是作为命令还是数据。如果 D/C#位设为 0,下一个数据
    就是命令。如果 D/C#位设为 1,下一个数据就是数据,将会存在 GDDRAM 中。GDDRAM 列地址指针将会在每次数据写之后自动加 1.
  6. 应答位将会在接收到每个控制字节或数据字节之后发生
  7. 写模式会在用了停止条件之后结束。停止条件:将 SDA 从低拉高,而 SCL 保持高。

在这里插入图片描述
请注意数据位的传输是有限制的
8. 数据位,在每个 SCL 脉冲阶段传输,必须在时钟脉冲高周期内保持稳定状态。可以参考
下面的图示。除了开始或停止条件,数据线只能在 SCL 为 LOW 的时候转换状态。
9. SDA 和 SCL 都必须接外接上拉电阻

在这里插入图片描述

命令解码器

       这个模块决定了输入数据被解读为数据还是命令。数据的解读是基于 D/C#引脚的输入。如果 D/C#引脚是高,D[7:0]就被解读为写到图像显示数据 RAM(GDDRAM)中的显示数据。
       如果是低,D[7:0]的输入就被解读为一个命令。然后数据输入就会被解码并写到相关的命令寄存器中。

晶振电路和显示时间发生器

在这里插入图片描述

       这是一个片上低功耗 RC 震荡电路。操作时钟(CLK)可以由内部震荡器或外部 CL 引脚生成。
       这个选择是通过 CLS 引脚完成的。当 CLS 引脚拉高,内部振荡器开启,CL 应该保留开启。将CLS 拉低可以静止内部振荡器,外部时钟必须连接到 CL 引脚上。当选择了内部振荡器之后,输出频率 Fosc 可以通过命令 D5h A[7:4]修改。
       用于显示时钟发生器的显示时钟(DCLK)是源于 CLK 的。分频因子“D”可以通过命令 D5h 编程,范围为 1 到 16
DCLK = Fosc/D
显示的帧率是由下面的公式决定
在这里插入图片描述
D 代表时钟分频。由 D5h A[3:0]设置。范围是 1 到 16
K 是每行显示时钟的数量。值的计算如下:
K = 相 1 周期 + 相 2 周期 + BANK0 脉冲宽度 = 2 + 2 + 50 = 54 在上电重启时
Number of Multiplex ratio 通过 command A8h 设置。上电重启值为 63 。
Fosc 是振荡器频率,可以通过命令 D5h A[7:4]修改。值越大频率越大。

复位

当 RES# 输入为 LOW 时,芯片初始化为下面的状态:

  1. 显示关
  2. 128 * 64 显示模式
  3. 正常的 segment 和显示数据列地址和行地址映射(SEG0 映射到 address 00h,COM0 映射到 address 00h)
  4. 在串口中清除移位寄存器数据
  5. 显示开始行设置为显示 RAM 地址 0
  6. 列地址计数设为 0
  7. 正常扫描 COM 输出方向
  8. 对比度控制寄存器设为 7Fh
  9. 正常显示模式(等同于 A4h 命令)

图形显示数据RAM (GDDRAM)

       GDDRAM是一个位映射的静态RAM,保存要显示的位模式。RAM的大小为128x64位,内存分为8个页面,从PAGEO到PAGE7,用于单色128x64点阵显示,如图8-13所示
在这里插入图片描述
       当一个数据字节写到 GDDRAM 中,所有当前列的同一页的行图像数据都会被被填充(比如,被列地址指针指向的整列(8 位)都会被填充)。数据位 D0 写到顶行,而数据位 D7 写到底行,如下图所示。
在这里插入图片描述
       为了灵活性,segment 和 common 上的重映射都可以通过软件选择。
       对于显示的垂直移动,一个内部的寄存器保存了显示开始行可以用来设置控制 RAM 数据部分来映射显示(命令 D3h)。

命令表

基本命令表

在这里插入图片描述

部分指令详解

为 BANK0 设置对比度控制(81h)

       这个命令用来设置显示的对比度,该芯片有 256 级对比度,从 00h 到 FFh。屏显输出电流随着对比度增大而增大。

全部显示开启(A4h/A5h)

       A4h 命令打开显示,输出依据 GDDRAM 中的内容。
       如果使用 A5h 命令,然后再使用 A4h 命令,显示就会重覆盖为 GDDRAM 的内容。
       换句话说,A4h 命令从整体显示开启状态覆盖显示。
       A5h 命令轻质整体显示状态位开启,不管显示数据 RAM 中的内容。

设置正常/反相显示(A6h、A7h)

       这个命令将显示设置成正常或反相模式。在正常模式 1 就是开,而在反相模式下 1 就是关

设置显示关、开(AEh、AFh)

       这个单字节命令用来打开或关闭 OLED 面板的显示。
       当显示是 ON,通过设置主机配置命令选择的电路会打开;
       当显示为 OFF 时,这些电路会关闭,segment 和 common 输出将处于高阻状态。这些命令设置显示的状态在开关之间切换:
在这里插入图片描述

滚屏命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部分指令详解

水平滚动设置(26h 27h)

       这个命令是由五个连续字节来设置水平滚动参数和决定滚动开始页,结束页和滚动速度的。在声明这个命令前,水平滚动必须用命令(2Eh)关闭,否则,RAM 中的内容可能被损坏。SSD1306 水平滚动是为 128 列滚动设计的。下面的两张插图演示了滚动的效果:
在这里插入图片描述

持续垂直和水平滚动设置(29h 2Ah)

       这是一个由六个连续字节组成的命令,用来设置持续水平滚动参数和决定滚动开始页,结束页,滚动速度和垂直滚动偏移的。
       命令 29h、2Ah 中的字节 B[2:0],C[2:0]和 D[2:0]用来设置持续水平滚动。字节 E[5:0]用来设置持续垂直滚动的偏移量。所有这些字节一起设置持续倾斜(垂直+水平)滚动。如果垂直滚动偏移字节 E[5:0]设为 0,那么效果就只是水平滚动。
       在发布此命令前必须用命令(2Eh)关闭滚动。否则,RAM 内容会损坏。下面的插图展示了滚动效果:
在这里插入图片描述

关闭滚动(2Eh)

       这个命令停止滚动的动作。在发布命令 2Eh 来关闭滚动动作之后,RAM 内容需要重写。

激活滚动(2Fh)

       这个命令开始滚动的懂做,并且只有在声明了滚动设置参数之后使用。只对最后的设置命令有效
下面的命令在滚动激活后是禁止的:

  1. RAM 访问(数据读写)
  2. 改变水平滚动设置参数
设置垂直滚动区域(A3h)

       这个命令由三个连续的字节组成用来设置垂直滚动区域。对于持续垂直滚动功能(命令 29h 2Ah),垂直滚动的行数可以设置的更小或等于最大复用率。

地址设置命令表

在这里插入图片描述
在这里插入图片描述

部分指令详解

设置低列开始地址作为页地址模式(00h~0Fh)
设置高列开始地址作为页地址模式(10h~1Fh)
设置内存地址模式(20h)

       SSD1306 中有三种不同的内存地址模式:页地址模式,水平地址模式,垂直地址模式。这个命令将内存地址模式设置成这三种中的一种。在这里 COL 的意思是图形显示数据 RAM 列。
页地址模式(A[1:0] =10xb)
       在页地址模式下,在显示 RAM 读写之后,列地址指针自动加一。如果列地址指针达到了列的结束地址,列地址指针重置为列开始地址并且也地址指针不会改变。用户需要设置新的页和列地址来访问下一页 RAM 内从。页地址模式下 PAGE 和列地址指针的移动模式参考下图
在这里插入图片描述
在正常显示数据 RAM 读或写和页地址模式,要求使用下面的步骤来定义开始 RAM 访问的位置:

  1. 通过命令 B0h 到 B7h 来设置目标显示位置的页开始地址
  2. 通过 00h~0Fh 来设置低开始列地址的指针
  3. 通过命令 10h~1Fh 来设置高开始列地址

       比如说,如果页地址设置为 B2h,低列地址是 03h 高列地址为 00h,那么就意味着开始列是PAGE2 的 SEG3.RAM 访问指针的位置如下图所示。输出数据字节将写到 RAM 列 3 的位置。
在这里插入图片描述
水平寻址模式(A[1:0]= 00b)
       在水平寻址模式下,当显示 RAM 被读写之后,列地址指针自动加一。如果列地址指针达到列的结束地址,列地址指针重置为列的开始地址,并且页地址指针自动加 1。水平寻址模式下页和列地址的移动顺序如下图所示。当列地址和页地址都达到了结束地址,指针重设为列地址和页地址的开始地址。
在这里插入图片描述
垂直寻址模式(A[1:0]=01b)
       在垂直寻址模式下,当显示 RAM 被读写之后,页地址指针自动加一。如果页地址达到了页的结束地址,页地址自动重置为页的开始地址,列地址自动加一。页地址和列地址的移动顺序如下图所示。当列地址和页地址都达到结束地址后,指针自动重置为开始地址。
在这里插入图片描述
       在正常显示 RAM 读或写,水平/垂直寻址模式下,要求用下面的步骤来定义 RAM 访问指针位置:

  1. 用 21h 命令设置目标显示位置的列的开始和结束地址;
  2. 用命令 22h 设置目标显示位置的页的开始和结束地址
设置列地址(21h)

       这个三字节命令指定了显示数据 RAM 列开始地址和结束地址。这个命令也会设置列地址指针到列开始地址。这个指针用于定义当前读写的显示数据 RAM 列地址。如果用 20h 命令开启了水平寻址命令,在完成读写一个列数据之后,该指针就会自动指向下一列地址。当什么时候列地址指针完成了访问列结束地址,它就会返回到列开始地址,和行地址增加到下一行。

设置页地址(22h)

       这个三字节的命令指定了显示数据 RAM 页的开始和结束地址。这个命令同时也设置了页地址指针到页开始地址。这个指针用来定义在图像显示数据 RAM 中当前读写的地址。如果当前是垂直寻址模式,在读写完一页数据之后,会自动增加到下一页地址。当页地址指针完成访问结束页地址之后,会重置到开始页地址。
       下面的插图展示了列和页地址指针的移动方式:列开始地址设置为 2,列结束地址设置为125,页开始地址设置为 1,页结束地址设置为 6;通过命令 20h 使能水平地址增加模式。在这个案例中,图形显示数据 RAM 可访问的地址就只有从列 2 到列 125,页 1 到页 6。另外,列地址指针被设为 2 页地址指针被设为 1.在完成读写数据中的一个像素后,列地址自动加 1
到下一个 RAM 位置进行下一次读写操作。当列地址指针完成访问结束列地址 125 之后,重新回到列 2,页地址自动加 1。当结束页 6 和结束列 125RAM 位置被访问过之后,页地址设回 1,列地址设回 2。
在这里插入图片描述

设置页开始地址作为页寻址模式(B0h~B7h)

硬件配置(面板分辨率和版面相关)命令表

在这里插入图片描述

部分指令详解

设置显示开始行(40h~7Fh)

       这个命令设置显示开始行寄存器来决定显示 RAM 的开始地址,通过选择 0 到 63 的值。当值为 0 是,RAM 行 0 映射到 COM0,当值为 1 时,RAM 行 1 映射到 COM0,以此类推。

设置 Segment 重映射(A0h/A1h)

       这个命令修改显示数据列地址和 segment 驱动器之间的映射,允许在 OLED 模块设置上的灵活性。
       这个命令只影响后续的数据输出。早已存储在 GDDRAM 中的数据不会改变。

设置复用率(A8h)

       这个命令转换默认的 63 复用模式到任何复用率,范围从 16 到 63。输出 pads COM0~COM63将会转换为相关的 COM 信号。

设置 COM 输出扫描方向(C0h、C8h)
设置显示偏移(D3h)

       这是一个两字节的命令。第二个命令指定显示映射的开始行到 COM0 和 COM63 中的一个(假设 COM0 是显示的开始行,那么显示开始寄存器就等于 0)。
       比如为了将 COM16 向 COM0 方向移动 16 行,第二个字节六位数据就应该写成 010000b。为了向相反方向移动 16 行,这个六位数据就应该是 64‐16,所谓第二个字节应该是 100000b。
       下面两个表展示了命令 C0h/C8h 和 D3h 的设置效果
在这里插入图片描述
在这里插入图片描述

设置 COM 引脚硬件配置(DAh)

这个命令设置 COM 信号引脚配置来匹配 OLED 面板硬件层。下面的表展示了不同条件下的COM 引脚配置(复用率为 64)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时钟和驱动方案设置命令表

在这里插入图片描述

部分指令详解

设置显示时钟分频率、振荡器频率(D5h)

这个命令由两个功能组成:
显示时钟分频率(A[3:0])
       设置分频率从 CLK 来生成 DCLK(display clock)。这个分频率的范围为 1 到 16,重置值为 1.请参考上表,获取 DCLK 和 CLK 关系的更多细节
振荡器频率(A[7:4])
       如果 CLS 引脚置高编程后的振荡器频率 Fosc 就是 CLK 的源。这个 4 位的值设置 16种不同的频率,默认设置为 1000b。

设置重充电周期(D9h A[7:0])

       这个命令用于设置充充电周期的时间长度。间隔以计算 DCLK 的数量,重置值为 2DCLK。

设置 Vcomh 取消选择水平(DBh A[6:4])

       这个命令调整 VCOMHV_{COMH}VCOMH 调节器输出

NOP(E3h)

       空指令

示例程序

       软件I2C程序见【51单片机快速入门指南】4: 软件 I2C
       stdint.h见【51单片机快速入门指南】1:基础知识和工程创建

       由以上知识可知,SSD1306的7位地址可为0x3c、0x3d。最后一位由硬件决定。
       如下图可见,我的屏幕的地址为0x3c(0x78 = 0x3c << 1)
在这里插入图片描述

oled.c

#include "oled.h"
#include "./Soft_I2C/Soft_I2C.h"
#include "oledfont.h"
#include <stdlib.h>void delay_ms(uint16_t ms);//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127
//[1]0 1 2 3 ... 127
//[2]0 1 2 3 ... 127
//[3]0 1 2 3 ... 127
//[4]0 1 2 3 ... 127
//[5]0 1 2 3 ... 127
//[6]0 1 2 3 ... 127
//[7]0 1 2 3 ... 127#if OLED_BUFFER_MODEuint8_t OLED_GRAM[Max_Row / 8][Max_Column] = {0};#endif/**************************************************************************Function: Refresh the OLED screenInput   : noneOutput  : none函数功能:刷新OLED屏幕入口参数:无返回  值:无**************************************************************************/
void OLED_Refresh_Gram(void)
{
#if OLED_BUFFER_MODEuint16_t i;OLED_Set_Pos(0, 128);for (i = 0; i < Max_Row / 8 * Max_Column; i++){OLED_WR_Byte(OLED_GRAM[0][i], OLED_DATA);}
#endif
}/**
* @brief 向SSD1306写入一个字节
* @param dat:要写入的数据/命令 cmd:数据/命令标志 0,表示命令;1,表示数据;
* @retval None
*/
void OLED_WR_Byte(uint8_t dat, uint8_t cmd)
{if (cmd)i2c_mem_write(OLED_ADDRESS, OLED_WriteData_Addr, &dat, 1);elsei2c_mem_write(OLED_ADDRESS, OLED_WriteCom_Addr, &dat, 1);
}/**************************************************************************Function: Set the coordinates (position) displayed on the screen.Input   : x, y: starting point coordinatesOutput  : none函数功能:设置汉字在屏幕上显示的坐标(位置)入口参数: x,y :起点坐标返回  值:无**************************************************************************/
void OLED_Set_Pos(uint8_t x, uint8_t y)
{OLED_WR_Byte(0xb0 + y, OLED_CMD);OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);OLED_WR_Byte((x & 0x0f), OLED_CMD);
}/**
* @brief 开启OLED显示
* @param None
* @retval None
*/
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D, OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X14, OLED_CMD);  //DCDC ONOLED_WR_Byte(0XAF, OLED_CMD);  //DISPLAY ON
}/**
* @brief 关闭OLED显示
* @param None
* @retval None
*/
void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D, OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X10, OLED_CMD);  //DCDC OFFOLED_WR_Byte(0XAE, OLED_CMD);  //DISPLAY OFF
}/**
* @brief 清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样
* @param None
* @retval None
*/
void OLED_Clear(void)
{
#if OLED_BUFFER_MODEuint16_t i;for (i = 0; i < Max_Row / 8 * Max_Column; i++){OLED_GRAM[0][i] = 0;}OLED_Refresh_Gram(); //Update the display //更新显示
#elseuint8_t i, n;for (i = 0; i<8; i++){OLED_WR_Byte(0xb0 + i, OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte(0x00, OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte(0x10, OLED_CMD);      //设置显示位置—列高地址for (n = 0; n<Max_Column; n++)OLED_WR_Byte(0, OLED_DATA);}//更新显示
#endif
}/**
* @brief 在指定位置显示一个字符,包括部分字符
* @param x:0~127   y:0~63   Is_Reverse:1,反白显示  0,正常显示	 charSize:选择字体 16/6
* @retval None
*/
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t charSize, uint8_t Is_Reverse)
{uint8_t i = 0;chr -= ' ';	//得到偏移后的值if (x > Max_Column - 1){x = 0;y = y + 2;}
#if OLED_BUFFER_MODEif(charSize == 16){for(i = 0; i < 8; i++){OLED_GRAM[y][x+i] = Is_Reverse == 0?F8X16[chr][i]:~F8X16[chr][i];OLED_GRAM[y+1][x+i] = Is_Reverse == 0?F8X16[chr][i+8]:~F8X16[chr][i+8];}}else if(charSize == 6){for(i=0; i<6; i++){OLED_GRAM[y][x+i] = Is_Reverse == 0?F8X6[chr][i]:~F8X6[chr][i];}}
#elseif (charSize == 16){OLED_Set_Pos(x, y);for (i = 0; i<8; i++)OLED_WR_Byte(Is_Reverse == 0?F8X16[chr][i]:~F8X16[chr][i], OLED_DATA);OLED_Set_Pos(x, y + 1);for (i = 0; i<8; i++)OLED_WR_Byte(Is_Reverse == 0?F8X16[chr][i + 8]:~F8X16[chr][i + 8], OLED_DATA);}else if(charSize == 6){OLED_Set_Pos(x, y);for (i = 0; i<6; i++)OLED_WR_Byte(Is_Reverse == 0?F8X6[chr][i]:~F8X6[chr][i], OLED_DATA);}
#endif
}/**
* @brief m^n函数
* @param None
* @retval None
*/
uint32_t oled_pow(uint8_t m, uint8_t n)
{uint32_t result = 1;while (n--)result *= m;return result;
}/**
* @brief 显示2个数字
* @param x,y :起点坐标
*				 len :数字的位数,即显示几位有效数字
*				 Size:字体大小
*				 mode:模式	0,填充模式;1,叠加模式
*        num:数值(0~4294967295);
* @retval None
*/
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t Size, uint8_t Is_Reverse)
{uint8_t t, temp;uint8_t enshow = 0;for (t = 0; t < len; t++){temp = (num / oled_pow(10, len - t - 1)) % 10;if (enshow == 0 && t < (len - 1)){if (temp == 0){OLED_ShowChar(x + 8 * t, y, ' ', Size, Is_Reverse);continue;}elseenshow = 1;}OLED_ShowChar(x + 8 * t, y, temp + '0', Size, Is_Reverse);}
}/**
* @brief 显示一个字符号串
* @param
* @retval None
*/
void OLED_ShowString(uint8_t x, uint8_t y, char *chr, uint8_t charSize, uint8_t Is_Reverse)
{uint8_t j = 0;while (chr[j] != '\0'){OLED_ShowChar(x, y, chr[j], charSize, Is_Reverse);x += 8;if (x>120){x = 0;y += 2;}j++;}
}/**
* @brief 显示汉字
* @param
* @retval None
*/
void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t no, uint8_t Is_Reverse)
{uint8_t i;
#if OLED_BUFFER_MODEfor (i = 0; i < 16; i++){OLED_GRAM[y][x+i] = Is_Reverse == 0?Hzk[2 * no][i]:~Hzk[2 * no][i];OLED_GRAM[y+1][x+i] = Is_Reverse == 0?Hzk[2 * no + 1][i]:~Hzk[2 * no + 1][i];}
#elseOLED_Set_Pos(x, y);for (i = 0; i < 16; i++){OLED_WR_Byte(Is_Reverse == 0?Hzk[2 * no][i]:~Hzk[2 * no][i], OLED_DATA);}OLED_Set_Pos(x, y + 1);for (i = 0; i<16; i++){OLED_WR_Byte(Is_Reverse == 0?Hzk[2 * no + 1][i]:~Hzk[2 * no + 1][i], OLED_DATA);}
#endif
}/**
* @brief 显示显示BMP图片
* @param 显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7
* @retval None
*/
void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[], uint8_t Is_Reverse)
{uint16_t j = 0;uint8_t x, y;if (y1 % 8 == 0) y = y1 / 8;else y = y1 / 8 + 1;
#if OLED_BUFFER_MODEfor (y = y0; y<y1; y++){for (x = x0; x<x1; x++){OLED_GRAM[y][x] = Is_Reverse == 0?BMP[j++]:~BMP[j++];}}
#elsefor (y = y0; y<y1; y++){OLED_Set_Pos(x0, y);for (x = x0; x<x1; x++){OLED_WR_Byte(Is_Reverse == 0?BMP[j++]:~BMP[j++], OLED_DATA);}}
#endif
}/**
* @brief 初始化SSD1306
* @param None
* @retval None
*/
void OLED_Init(void)
{OLED_WR_Byte(0xAE, OLED_CMD);//--turn off oled panel 设置显示关OLED_WR_Byte(0x00, OLED_CMD);//---set low column address	设置低列地址OLED_WR_Byte(0x10, OLED_CMD);//---set high column address 设置高列地址OLED_WR_Byte(0x40, OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x40~0x7F) 设置显示开始行OLED_WR_Byte(0xDA, OLED_CMD);//--set com pins hardware configuration 设置 COM 引脚硬件配置OLED_WR_Byte(0x12, OLED_CMD);#if OLED_BUFFER_MODEOLED_WR_Byte(0x20, OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) 设置内存地址模式OLED_WR_Byte(0x00, OLED_CMD);//OLED_WR_Byte(0xD3, OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)	设置显示偏移OLED_WR_Byte(0x00/*±8的倍数*/,OLED_CMD);
#elseOLED_WR_Byte(0x20, OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) 设置内存地址模式OLED_WR_Byte(0x02, OLED_CMD);//OLED_WR_Byte(0xD3, OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)	设置显示偏移OLED_WR_Byte(0x00/*±8的倍数*/, OLED_CMD);//-not offset
#endifOLED_WR_Byte(0xA1, OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8, OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常OLED_WR_Byte(0xDB, OLED_CMD);//--set vcomh	设置 Vcomh 取消选择水平OLED_WR_Byte(0x30, OLED_CMD);//Set VCOM Deselect LevelOLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0x81, OLED_CMD);//--set contrast control register 为 BANK0 设置对比度控制OLED_WR_Byte(Brightness, OLED_CMD); //1~ 255; Default 0x7f (brightness Settings, the bigger the brighter) //1~255;默认0X7F (亮度设置,越大越亮)OLED_WR_Byte(0xA8, OLED_CMD);//--set multiplex ratio(1 to 64)	设置复用率OLED_WR_Byte(0x3f, OLED_CMD);//--1/64 dutyOLED_WR_Byte(0xd5, OLED_CMD);//--set display clock divide ratio/oscillator frequency	设置显示时钟分频率、振荡器频率OLED_WR_Byte(0x80, OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9, OLED_CMD);//--set pre-charge period 设置重充电周期OLED_WR_Byte(0xF1, OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0x8D, OLED_CMD);//--set Charge Pump enable/disable 升压允许OLED_WR_Byte(0x14, OLED_CMD);//--set(0x10) disableOLED_WR_Byte(0xA4, OLED_CMD);// Disable Entire Display On (0xa4/0xa5) 全部显示开启OLED_WR_Byte(0xA6, OLED_CMD);// Disable Inverse Display On (0xa6/a7) 设置正常显示OLED_WR_Byte(0xAF, OLED_CMD);// display ON 设置显示开OLED_Clear();OLED_Set_Pos(0, 0);
}

oled.h

#ifndef __OLED_H
#define __OLED_H#include <stdint.h>
#include <STC89C5xRC.H>#define OLED_BUFFER_MODE	0
#define Max_Column			128
#define Max_Row				64
#define	Brightness			0xFF#define OLED_ADDRESS 0x3c	//7位地址
//设备地址#define OLED_WriteCom_Addr	0x00	//从机写指令地址
#define OLED_WriteData_Addr	0x40	//从机写数据地址#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据/* OLED控制用函数 */
void OLED_Clear(void);																																											 /* OLED清屏 */
void OLED_Display_On(void);                                                         /* OLED开 */
void OLED_ShowPosture(void);																																								 /* 提示信息 */
void OLED_Display_Off(void);                                                        /* OLED关 */
void OLED_Init(void);                                                               /* OLED初始化 */
void OLED_WR_Byte(uint8_t dat, uint8_t cmd);	                                    /* 写字节 */
void OLED_Set_Pos(uint8_t x, uint8_t y);											/* 设置坐标 */
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t charSize, uint8_t Is_Reverse);            /* 显示字符 */
void OLED_ShowString(uint8_t x, uint8_t y, char *p, uint8_t charSize, uint8_t Is_Reverse);	            /* 显示字符串 */
void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t no, uint8_t Is_Reverse);                            /* 显示中文 */
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t Size, uint8_t Is_Reverse);   /* 显示数字 */
void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[], uint8_t Is_Reverse);	/* 显示图片 */void OLED_Refresh_Gram(void);#endif  /* __OLED_H */

oledfont.h

#ifndef __OLEDFONT_H
#define __OLEDFONT_H/************************************8*6的点阵************************************/
code unsigned char F8X6[][6] =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// /0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// ~
};//阴码 列行式 逆向
code unsigned char F8X16[][16]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  00x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 10x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 20x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 30x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 40xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 50x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 60x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 70x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 80x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 90x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 100x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 130x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 140x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 150x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 160x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 170x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 180x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 190x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 200x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 210x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 220x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 230x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 240x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 250x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 260x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 270x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 280x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 290x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 300x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 310xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 320x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 330x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 340xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 350x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 360x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 370x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 380xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 390x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 400x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 410x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 420x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 430x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 440x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 450x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 460xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 470x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 480xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 490x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 500x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 510x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 520x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 530x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 540xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 550x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 560x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 570x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 580x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 590x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 600x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 610x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 620x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 630x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 640x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 650x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 660x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 670x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 680x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 690x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 700x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 710x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 720x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 730x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 740x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 750x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 760x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 770x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 780x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 790x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 800x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 810x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 820x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 830x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 840x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 850x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 860x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 870x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 880x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 890x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 900x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 910x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 920x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 930x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};code unsigned char Hzk[][32]=
{{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},{0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",0*/{0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},{0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},/*"景",1*/{0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00},{0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},/*"园",2*/{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00},{0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},/*"电",3*/{0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00},{0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",4*/{0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},{0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},/*"科",5*/{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",6*/};#endif

测试程序

#include <STC89C5xRC.H>
#include "intrins.h"
#include "stdint.h"
#include "./I2C_OLED/oled.h"void main(void)
{
uint8_t i;OLED_Init();OLED_Clear();OLED_Display_On();	     OLED_ShowString(0, 0, "STC89C52    OLED", 16, 0);OLED_ShowString(0, 2, "   2022-01-12", 6, 0);for(i = 0; i < 7; ++i)OLED_ShowChinese(8 + 16 * i, 6, i, 1);OLED_Refresh_Gram();while(1){}
}

实验现象

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用GNS3和Cisco IOU搭建路由交换实验-安装篇

如何使用GNS3和Cisco IOU搭建路由交换实验-安装篇GNS3软件的安装建议大家从官网直接下载最新版本的GNS3&#xff0c;官网连接http://www.gns3.com/根据系统类型选择相应的版本&#xff0c;这里我选择的是Windwos系统的最新版本1.3.2下载好安装包后直接运行安装包&#xff0c;在…

1787: [Ahoi2008]Meet 紧急集合

1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1482 Solved: 652[Submit][Status][Discuss]Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 6 6 6 Sample Output 5 2 2 5 4 1 6 0 HINT Sou…

一步一步学Vue(四)

接上篇。上篇中给出了代码框架&#xff0c;没有具体实现&#xff0c;这一篇会对上篇定义的几个组件进行分别介绍和完善&#xff1a; 1、TodoContainer组件 TodoContainer组件&#xff0c;用来组织其它组件&#xff0c;这是react中推荐的方式&#xff0c;也是redux中高阶组件一般…

【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据

目录硬知识特性参数MPU6050 简介模块重要寄存器简介电源管理寄存器 1陀螺仪配置寄存器加速度传感器配置寄存器FIFO 使能寄存器陀螺仪采样率分频寄存器配置寄存器电源管理寄存器 2陀螺仪数据输出寄存器加速度传感器数据输出寄存器温度传感器示例程序MPU6050.cMPU6050.hmain.c实验…

OSM数据的获取及格式转换

转自 &#xff1a;http://blog.sina.com.cn/s/blog_72f0b6080102w39z.html 前言&#xff1a;本篇博文将介绍如何对OSM数据进行获取&#xff0c;以及格式的转换&#xff08;转为shapefile格式&#xff09;。以供OSM数据获取失败、OSM editor操作失败的朋友参考。由于并不是多么高…

再读TCP/IP网络7层协议

随着工作的深入&#xff0c;每次读这7层协议&#xff0c;每次都有不同的理解。 分层名 分层号 描述 比喻 应用层Application La…

oracle复习笔记

2019独角兽企业重金招聘Python工程师标准>>> 1.oracle相关认证&#xff1a;OCA:Oracle认证专员&#xff0c;OCP:Oracle专家认证&#xff0c;OCM:Oracle认证大师。 2.1979年,Oracle2发布。 3.Oracle数据库特点&#xff1a;支持多用户&#xff0c;大事务量的事务处理&…

【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角

目录相关介绍DMP库相关DMP加载步骤&#xff1a;DMP设置数据写入更新DMPDMP数据包结构程序实现DMP.cDMP.h测试程序四元数实验现象欧拉角的获取普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 相关…

cardsui-for-android

https://github.com/Androguide/cardsui-for-android cardsui-for-android-master.zip

spoj 2 Prime Generator

题目&#xff1a;Prime Generator 思路&#xff1a;分段筛素数 #include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> #include <map> using namespace std; #define maxn 40000 int n_prime…

LTDC/DMA2D—液晶显示

本章参考资料&#xff1a;《STM32F4xx 参考手册 2》、《STM32F4xx 规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于开发板配套的液晶屏参数可查阅《5.0 寸液晶屏数据手册》配套资料获知。 显示器简介显示器属于计算机的 I/O 设备&#xff0c;即输入输出设备…

【51单片机快速入门指南】4.3.2: MPU6050:一阶互补滤波、二阶互补滤波和卡尔曼滤波获取欧拉角

目录源码MPU6050_Filter.cMPU6050_Filter.h使用方法测试程序一阶互补滤波效果二阶互补滤波效果卡尔曼滤波效果总结普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 参考资料&#xff1a; MPU6050…

NGUI基础-三大基础组件之Root组件

NGUI NGUI&#xff08;Next-Gen UI&#xff09;是一款用于Unity游戏引擎的UI插件&#xff0c;它提供了一套功能强大、灵活易用的界面开发工具。在NGUI中&#xff0c;Root&#xff08;根节点&#xff09;是一个重要的概念。 基础组件之Root Root是NGUI中的最高层级节点&#…

【转】android 中如何限制 EditText 最大输入字符数

原文网址&#xff1a;http://blog.csdn.net/fulinwsuafcie/article/details/7437768 方法一&#xff1a; 在 xml 文件中设置文本编辑框属性作字符数限制 如&#xff1a;android:maxLength"10" 即限制最大输入字符个数为10 方法二&#xff1a; 在代码中使用InputFilte…

【51单片机快速入门指南】4.3.3: MPU6050使用Mahony AHRS算法实现六轴姿态融合获取四元数、欧拉角

目录源码Mahony_6.cMahony_6.h使用方法测试程序main.c效果STC89C516 32MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 移植自MPU6050姿态解算——Mahony互补滤波 —— 大写的小写字母 加入了输入数据范围的自动处理…

linux文件系统及bash基础特性

linux文件系统 一、根文件系统 linux被识别的第一个被称为根之间关联的文件系统叫做根文件系统&#xff08;rootfs&#xff09;&#xff0c;其他分区要想被读到&#xff0c;需要挂载到根目录的某个挂载点&#xff08;根的子目录&#xff09;上。根文件系统至关重要&#xff0c;…

【51单片机快速入门指南】4.3.4: MPU6050使用Madgwick AHRS算法实现六轴姿态融合获取四元数、欧拉角

目录源码Madgwick_6.cMadgwick_6.h使用方法测试程序main.c效果STC89C516 32MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 移植自AHRS —— LOXO&#xff0c;算法作者&#xff1a;SOH Madgwick 源码 为了避免所用R…

Hybris商品图片导入与压缩有关的配置.

1. 在电脑上安装 ImageMagick 软件&#xff08;windows平台还需要安装VC&#xff09;&#xff0c;下载路径&#xff1a;http://www.imagemagick.org/script/download.php#windows 在local.properies文件配置安装路径和配置文件路径&#xff1a; Windows版本的&#xff0c;安装…

poj 2507Crossed ladders 计算几何

链接&#xff1a;http://poj.org/problem?id2507 题意&#xff1a;哪个直角三角形&#xff0c;一直角边重合&#xff0c; 斜边分别为 X, Y&#xff0c; 两斜边交点高为 C &#xff0c; 求重合的直角边长度~ 思路&#xff1a; 设两个三角形不重合的两条直角边长为 a &#xff0…

【机器视觉学习笔记】VS2015 安装 opencv_contrib并测试

目录opencv_contrib的获取主要工具编译 opencv编译 opencv_contribVisual Studio 编译配置新项目的环境添加包含目录添加库目录配置调试环境添加依赖项测试平台&#xff1a;Windows 10 20H2 Visual Studio 2015 opencv_contrib-3.4.12 参考文章&#xff1a; 添加OpenCV_contr…