https://pan.baidu.com/s/1_wo1f2zA_oLl9EuYuC9Yzg?pwd=ajoyhttps://pan.baidu.com/s/1_wo1f2zA_oLl9EuYuC9Yzg?pwd=ajoy

以上为程序源码和仿真。

目录

一、oled概念

二、SSD1306驱动芯片

2-1 简介:

2-2 SSD1306命令

三、oled的引脚

四、画点原理(理解显示原理)

4-1 OLED模块显存:

4-2 设置内存地址模式(20h)

4-2-1 页地址模式(A[1:0]=02h)

4-2-2 水平寻址模式(A[1:0]= 00b)

4-2-3 垂直寻址模式(A[1:0]=01b)

4-3 页地址模式(A[1:0]=02h)详解

五、软件驱动

5-1 OLED.h文件:

5-2 OLED.c文件:

5-2-1 SPI通信写数据

5-2-2 向SSD1306写命令数据

5-2-3 清屏函数

5-2-4 初始化oled

5-2-5 显示一个字符

5-2-6 显示字符串

5-2-7 显示数字

5-2-8 显示汉字

5-2-9 其他命令

5-3 oledfont.h文件

六、实验


一、oled概念

OLED,即有机发光二极管( Organic Light Emitting Diode)。 OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。 LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示 OLED 效果要来得好一些。我们介绍的是0.96寸OLED显示屏,实物图如下:

                               


二、SSD1306驱动芯片

2-1 简介:

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

OLED控制器为SSD1306,也就是说:裸屏由SSD1306驱动,这也是一种较为广泛使用的led驱动芯片。所以,我们通过向SSD1306写入命令以达到想要的功能。


2-2 SSD1306命令

SSD1306的命令有很多,这就代表了它有很多的功能,但是在这里就不过多赘述,我们就了解几个常用的命令,掌握这些常用的命令便可使用基本的功能,最开始当然就是显示一个点,如果掌握显示一个点的基本原理,oled模块就几乎可以掌握了,再去学字符的显示、图形的显示和其他命令很快的掌握。下面介绍几个常见的命令:

1、命令0XB0~0xB7:用于设置页地址,其低三位的值对应着GRAM的页地址。
        2、命令0X00~0X0F:用于设置显示时的起始列地址低四位。
        3、命令0X10~0X1F:用于设置显示时的起始列地址高四位。

这三个命令是画点函数所要使用的,尤其是后面的两个命令,至关重要,在后面的画点实验会详细介绍(什么是列高列低也会讲到)。

4、命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
        5、命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。


三、oled的引脚

oled的介绍和驱动的介绍就先到这里,如果想要了解更多的功能和命令,可以去查查SSD1306的手册。上次我们对SPI协议和两个单片机利用SPI进行通信做了简单的介绍和实操,接下来我们通过spi驱动oled模块,在这里简单介绍一下,oled对于单片机来说就是一个从机,单片机可以通过向SSD1306写数据命令oled模块做出相应的功能,而写数据就是通过SPI通信。

我们这里介绍的是7针oled;

 我们讲了SPI是全双工的,主机向从机发送数据,同时从机也可以向主机发送数据,但是oled模块不能向主机写数据,只能读出主机发过来的命令执行相应的功能,那么就意味着SPI的4条逻辑线中MISO(Master input slave output 主机输入,从机输出)就不需要了。

模块接口定义:

GND

VCC

D0

 D1

RES

DC

 CS

电源地

电源正(3~5.5V)

OLED 的 D0 脚,在 SPI 和 IIC 通信中为时钟管脚

OLED 的 D1 脚,在 SPI 和 IIC 通信中为数据管脚

OLED 的 RES#脚,用来复位(低电平复位)

OLED 的 D/C#E 脚,数据和命令控制管脚(D/C为1代表的是发送数据,D/C为0的代表是发送命令)

OLED 的 CS#脚,也就是片选管脚

在这里,重点介绍一下DC,在向SSD1306写命令或是写数据时,先要向SSD1306写入控制字节信息,简单理解你可以理解当DC置0时,后面发送的是写命令,命令就是上述提到的一些常用命令,当DC置0时,后面发送的是写数据,数据一般是控制oled每个像素的的亮灭,后面会介绍。

为了对应SPI的逻辑线,做了简单的对照:

D0->SCLK: Serial Clock 串行时钟信号,由主机产生发送给从机;

D1->MOSI:Master output slave input 主机输出,从机输入(数据来自主机);

CS->SS/CS:Slave Select/Chip Select 从设备使能信号,由主设备控制。 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号,oled的也是。


 四、画点原理(理解显示原理)

——可以先看5-写函数部分

在写画点函数之前,我们得先了解它的发光原理,那么,如何实现一个点的点亮呢?

首先我们提到oled的分辨率为 128*64 ,怎么理解?可以看作oled由128列、64行的像素的组成,每个像素点放在一个小格子里,而要想点亮一个点,就在对应的格子里写入1,1为亮,0为灭。

那么怎么在指定的位置写入一个点呢?

步骤:设置内存地址模式(20h)->我们这选择页地址模式->确认是在哪一页->确认是这一页的哪一列->写数据


4-1 OLED模块显存:

oled的数据存放模式,OLED本身是没有显存的,它的显存是依赖于SSD1306提供的。SSD1306的显存总共为128 * 64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。


4-2 设置内存地址模式(20h

SSD1306 中有三种不同的内存地址模式:页地址模式,水平地址模式,垂直地址模式。这个命令将内存地址模式设置成这三种中的一种。A[1:0] :00,列地址模式;01,行地址模式;10,页地址模式;默认10;这个在初始化的时候要设置的。下面的三种模式可以简单过一下,我会选择页地址模式进行详细的讲解:


4-2-1 页地址模式(A[1:0]=02h)

在页地址模式下,在显示 RAM 读写之后,列地址指针自动加一。如果列地址指针达到了列的结束地址,列地址指针重置为列开始地址并且也地址指针不会改变。用户需要设置新的页和列地址来访问下一页 RAM 内从。页地址模式下 PAGE 和列地址指针的移动模式参考下图:

在正常显示数据 RAM 读或写和页地址模式,要求使用下面的步骤来定义开始 RAM 访问的位置:

  • 通过命令 B0h 到 B7h 来设置目标显示位置的页开始地址
  • 通过命令 00h~0Fh 来设置低位列地址
  • 通过命令 10h~1Fh 来设置高位列地址(这3点后面后说)

4-2-2 水平寻址模式(A[1:0]= 00b

在水平寻址模式下,当显示 RAM 被读写之后,列地址指针自动加一。如果列地址指针达到列的结束地址,列地址指针重置为列的开始地址,并且页地址指针自动加 1。水平寻址模式下页和列地址的移动顺序如下图所示。当列地址和页地址都达到了结束地址,指针重设为列地址和页地址的开始地址。

4-2-3 垂直寻址模式(A[1:0]=01b

在垂直寻址模式下,当显示 RAM 被读写之后,页地址指针自动加一。如果页地址达到了页的结束地址,页地址自动重置为页的开始地址,列地址自动加一。页地址和列地址的移动顺序如下图所示。当列地址和页地址都达到结束地址后,指针自动重置为开始地址。

在正常显示 RAM 读或写,水平/垂直寻址模式下,要求用下面的步骤来定义 RAM 访问指针位置:

用 21h 命令设置目标显示位置的列的开始和结束地址;

用命令 22h 设置目标显示位置的页的开始和结束地址。

4-3 页地址模式(A[1:0]=02h)详解

在正常显示数据 RAM 读或写和页地址模式,要求使用下面的步骤来定义开始 RAM 访问的位置:

  1. 通过命令 B0h 到 B7h 来设置目标显示位置的页开始地址

将128*64分为8页,也就是没8行为1页,比如写入命令0xB0,就是在第一页开始写入数据,也就是1到8行(定义是从0开始的,也就是0代表第一行或者第一列),怎么写命令呢?就用到我们写的函数(OLED_CMD是0的宏定义):OLED_WR_Byte(unsigned char dat1,unsigned char cmd)

写入0xB0就是:
OLED_WR_Byte(0xB0,OLED_CMD);

2.通过命令 00h~0Fh 来设置低位列地址

    3.通过命令 10h~1Fh 来设置高位列地址

什么是低位列地址、高位列地址,比方说:十六进制0x1F,二进制为1000 1111,那么它的低地址就是1111;高地址就是1000。命令 00h~0F,命令 10h~1Fh

这两个命令就是指定是哪一列的,是必须一起用的,放在页地址后面,比如:

我要在第3页的第4列(对应关系是PAGE2的SEG3)开始写入数据,那么我们给的命令就是:

OLED_WR_Byte(0xB2,OLED_CMD);
OLED_WR_Byte(0x03,OLED_CMD);
OLED_WR_Byte (0x10,OLED_CMD);

这样就意味着开始列是PAGE2 的 SEG3.RAM 访问指针的位置如图所示。输出数据字节将写到 RAM 列 3 的位置。

知道如何写命令让其在指定的页和列开始写入数据,但是每一页的每一列有8个像素点,如何写入数据呢?还是从PAGE2的第三列写入开始,我们可以试试全部点亮,那么就写入0x00,格式如下:

OLED_WR_Byte(0xB2,OLED_CMD);
OLED_WR_Byte(0x03,OLED_CMD);
OLED_WR_Byte (0x10,OLED_CMD);
OLED_WR_Byte (0xFF,OLED_DATA);//注意这次是写数据

值得注意的是,OLED不能一次控制一个点阵,只能控制8个点阵;而且是垂直方向扫描控制;所以我们写入数据时要写8bit数据。那么,每次要写8个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显示了。

比如说某一页上的数据是 (0100 0000) 。如果想让其他像素点显示,会对这一页重新赋值,比如(0010 0000)。赋值过后,先前的数据就会被覆盖。也就是说一页只能打一个点,因此为了避免这种情况,要记录之前显示过的值,必须要在单片机内部申请一块内存区域充当OLED的显示缓存区,每次打点的时候读取先前的数据进行运算后再给OLED传送数据。

我们采用的办法是在单片机的内部建立一个OLED的GRAM(共128个字节),在每次修改的时候,只是修改GRAM(实际上就是SRAM),在修改完了之后,一次性把单片机上的GRAM写入到OLED的GRAM。这里的GRAM可以理解为建立一个二维数组OLED_GRAM[128][8];

当然这个方法也有坏处,但是51系列的SRAM很小,其内存大小为均1280字节。OLED显示屏共128列8页,若在单片机中申请内存则是128×8×1=1024个字节,就比较麻烦了。所以我们就不采用这种方式,我们利用页寻找的方式找到我们要开始写入的地方,也就是开始光标,然后在逐一写入字节,所以就不会有在指定的一个点画出点的函数。

        主要思路:确定一页的一列为开头,写完这一页的一列后,如果还有数据要写,会自动写入下一列。

讲到这里,大家应该理解了画点的思路和原理了吧,如果还不会,可以不断地修改页地址和列地址以及写入的数据,观察oled的现象,慢慢体会画一个像素点的原理。

实验方法的main.c 文件:

#include <reg52.h>
#include "oled.h"
void main()
{OLED_Init();OLED_WR_Byte (0xB2,OLED_CMD);//页OLED_WR_Byte (0x03,OLED_CMD);//列低OLED_WR_Byte (0x10,OLED_CMD);//列高OLED_WR_Byte (0xFF,OLED_DATA);//注意这次是写数据while(1){}
}

注意:这里面的函数在oled.c文件里是必须有的,写数据和写命令函数在下面;

五、软件驱动

使用的是软件模拟spi驱动,下面我们开始编写驱动程序:

5-1 OLED.h文件:

管脚定义:(后面写好的函数记得在这里声明)

#include<reg52.h>#ifndef __OLED_H__
#define __OLED_H__//首先定义好I/O口
sbit OLED_SCK=P2^0;//位定义时钟D0
sbit OLED_SDI=P2^1;//D1(MOSI) 数据
sbit OLED_RST =P2^2;//复位
sbit OLED_DC =P2^3;//数据/命令控制
sbit OLED_CS=P2^4;//位定义片选(使能)#define OLED_SCK_Clr() OLED_SCK=0
#define OLED_SCK_Set() OLED_SCK=1#define OLED_SDI_Clr() OLED_SDI=0
#define OLED_SDI_Set() OLED_SDI=1#define OLED_RST_Clr() OLED_RST=0
#define OLED_RST_Set() OLED_RST=1#define OLED_DC_Clr() OLED_DC=0
#define OLED_DC_Set() OLED_DC=1#define OLED_CS_Clr()  OLED_CS=0
#define OLED_CS_Set()  OLED_CS=1#define OLED_CMD  0    //写命令
#define OLED_DATA 1 //写数据#endif

5-2 OLED.c文件:

5-2-1 SPI通信写数据

7脚oled是用spi驱动的,既然涉及spi,也就是写主机和从机之间的数据传输,上面提到oled模块不能向主机写数据,所以只要写spi通信的写数据函数:

void Spi_Send(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++)     //循环写入 {              OLED_SCK_Clr();   //片选拉低 if(dat&0x80)// 1000 0000 dat与0x80x相与     {OLED_SDI_Set();    //数据脚拉高 }else{OLED_SDI_Clr();   //数据脚拉低             }OLED_SCK_Set();    //时钟信号上升沿 dat<<=1;           }
}

5-2-2 向SSD1306写命令数据

接下来写向SSD1306写入一个字节的函数,为什么分写数据和写命令呢?写命令是为了实现oled的一些功能,如设置内存地址模式,反白显示等,都是要通过发送指定的命令去实现,而写数据主要是点亮oled,就意味着0x00~0xFF的数据都可能涉及到,这样会和指定的命令重复,所以要分清是写命令还是写数据;

那怎么区分呢?上文介绍D/C为1代表的是发送数据,D/C为0的代表是发送命令。

//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0表示命令;1表示数据
void OLED_WR_Byte(unsigned char dat1,unsigned char cmd)
{   unsigned char i;        /用于写入的循环变量 if(cmd)               OLED_DC_Set();     //如果写入数据,DC拉高 else OLED_DC_Clr();        //否则写入命令,DC拉低 OLED_CS_Clr();         //片选拉低,准备写入 Spi_Send(dat1)           //spi写字节          OLED_CS_Set();            //片选数据拉高 停止写入 OLED_DC_Set();        //拉高DC,默认是高电平
} 

这样一来,基本的写数据命令函数就完成了


5-2-3 清屏函数

看这个函数可能会不理解,但是初始化的时候会用到,可以先跳过这里去看第四章画点的介绍,再回来理解。清屏的思路就是将每一个像素点写入0。

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{  unsigned char i,n;           for(i=0;i<8;i++)  //这个可以理解为循环8次每次代表一页Page{  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<128;n++)OLED_WR_Byte(0x00,OLED_DATA); //128列依次写入字节0000 0000} //更新显示
}

5-2-4 初始化oled

接下来我们对oled初始化,这样才能对oled正常使用,初始化就是依照oled的数据手册提供的初始化步骤和向oled写入相关的命令就可以了。

//初始化SSD1306
void OLED_Init(void)
{OLED_RST_Set();delay_ms(100);OLED_RST_Clr();delay_ms(100);OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);//--关闭oled面板OLED_WR_Byte(0x00,OLED_CMD);//---设置低列地址OLED_WR_Byte(0x10,OLED_CMD);//---设置高列地址OLED_WR_Byte(0x40,OLED_CMD);//--设置起始行地址集映射RAM显示起始行 OLED_WR_Byte(0x81,OLED_CMD);//--设置对比度控制寄存器OLED_WR_Byte(0xCF,OLED_CMD); // 设置SEG输出电流亮度OLED_WR_Byte(0xA1,OLED_CMD);//设置SEG列映射0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);//设置COM/Row扫描方向   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);//设置正常显示OLED_WR_Byte(0xA8,OLED_CMD);//设置多路复用比(1比64)OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);//设置显示偏移位移映射RAM计数器 (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);//-not offsetOLED_WR_Byte(0xd5,OLED_CMD);//设置显示时钟分频比/振荡频率OLED_WR_Byte(0x80,OLED_CMD);//设置分频比,设置时钟为100帧/秒OLED_WR_Byte(0xD9,OLED_CMD);//设置pre-charge时期OLED_WR_Byte(0xF1,OLED_CMD);//设定预充时间为15个时钟,放电时间为1个时钟OLED_WR_Byte(0xDA,OLED_CMD);//设置com引脚硬件配置OLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomhOLED_WR_Byte(0x40,OLED_CMD);//设置VCOM取消选择级别OLED_WR_Byte(0x20,OLED_CMD);//设置寻址模式 (0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);//设置页寻址模式 OLED_WR_Byte(0x8D,OLED_CMD);//设置电荷泵启用/禁用OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable设置(0 x10)禁用OLED_WR_Byte(0xA4,OLED_CMD);// 在(0xa4/0xa5)上禁用整个显示OLED_WR_Byte(0xA6,OLED_CMD);// 在(0xa6/a7)上禁用反向显示OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel开启oled面板  OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear();   //清屏
}

5-2-5 显示一个字符

我们理解了oled显示的原理之后,接下来,我们开始在oled屏幕上显示内容,先写基础的字符显示,上面我们提到了内容显示的思路:确定一页的一列为开头,写完这一页的一列后,如果还有数据要写,会自动写入下一列。

所以先写光标函数:

//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{ OLED_WR_Byte(0xb0+y,OLED_CMD);OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);OLED_WR_Byte((x&0x0f),OLED_CMD);
}  

字符函数:

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//sizey:选择字体  8/16  6x8  8x16
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char sizey)
{       unsigned char c=0,sizex=sizey/2;unsigned int i=0,size1;if(sizey==8)size1=6;else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2);c=chr-' ';//得到偏移后的值OLED_Set_Pos(x,y);for(i=0;i<size1;i++){if(i%sizex==0&&sizey!=8) OLED_Set_Pos(x,y++);if(sizey==8) OLED_WR_Byte(asc2_0806[c][i],OLED_DATA);//6X8字号else if(sizey==16) OLED_WR_Byte(asc2_1608[c][i],OLED_DATA);//8x16字号
//      else if(sizey==xx) OLED_WR_Byte(asc2_xxxx[c][i],OLED_DATA);//用户添加字号else return;}
}

这个函数中,涉及到数组asc2_0806[c][i] 和asc2_1608[c][i]那是因为一个字符由很多个像素点组成,数组方便封装和调用。这些数组都是放在oledfont.h文件中的。

使用的方法是:

OLED_ShowChar(0,0,'?',8);

这就会在第一行到第8行,第一列到第四列显示一个字体为8的问号:


5-2-6 显示字符串

这个就是基于5.2.5的字符显示函数,无非就是连续的显示字符:

//显示一个字符号串
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char sizey)
{unsigned char j=0;while (chr[j]!='\0'){        OLED_ShowChar(x,y,chr[j++],sizey);if(sizey==8)x+=6;else x+=sizey/2;}
}

我们同样可以在主函数实验显示:

OLED_ShowString(0,0,"xpi",8);


5-2-7 显示数字

第一个字符显示函数是为下一个函数服务的,整体性质跟上述的函数相似。无非就是将要输入的数字拆分为一个一个的个位数字符函数显示。

//m^n函数
unsigned int oled_pow(unsigned char m,unsigned char n)
{unsigned int result=1;     while(n--)result*=m;    return result;
}
//显示数字
//x,y :起点坐标
//num:要显示的数字
//len :数字的位数
//sizey:字体大小
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char sizey)
{           unsigned char t,temp,m=0;unsigned char enshow=0;if(sizey==8)m=2;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+(sizey/2+m)*t,y,' ',sizey);continue;}else enshow=1;}OLED_ShowChar(x+(sizey/2+m)*t,y,temp+'0',sizey);}
}

5-2-8 显示汉字

一、字模提取

在第四章中我们讲解了如何画像素点,以上内容的性质都是一样的,显示汉字也基本不变,同样是一列一列的往oled写入8bit字节,显示东西,你必须了解那个地方是亮的,那个地方是灭的,以上的数组都是购买oled模块是赠送的代码,他们已经整理好了每一个字符的对应字节包装在二维数组中,那么如果我们想自定义字符该怎么办呢?很简单,就是自己设计字符,那个地方亮,哪个灭,都用字节赋予。

比如要显示上面的2,那么从第一列开始写字节,依次写入:0x23,0x45,0x49,0x31;

当然,我们不可能每次都自己画吧?写汉字的时候就很难了,我们可以用一些取模软件进行字节的取值。

我使用的是PCtoLCD2002,有很多种取模工具,可以自行查阅:

方法步骤:

输入要生成的字:

二、汉字显示代码

//显示汉字
void OLED_ShowChinese(unsigned char x,unsigned char y,unsigned char no,unsigned char sizey)
{unsigned int i,size1=(sizey/8+((sizey%8)?1:0))*sizey;for(i=0;i<size1;i++){if(i%sizey==0) OLED_Set_Pos(x,y++);if(sizey==16) OLED_WR_Byte(Hzk[no][i],OLED_DATA);//16x16字号
//      else if(sizey==xx) OLED_WR_Byte(xxx[c][i],OLED_DATA);//添加字号else return;}
}

Hzk[no][i]中存放的就是刚刚生成的数组,复制进去就可以用了,主义的是,要将这两个大括号里的内容合成一个:将:

{0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00},{0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00},/*"我",0*/

改为:

unsigned char code Hzk[][32]={{0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00}/*"我",0*/};

调用方法:

OLED_ShowChinese(0,0,0,16);

效果:

提醒一下,尽量不要使用汉字显示,因为51单片机内存本来就小,汉字越多二维数组就越多,最后内存过载会使单片机出现莫名其妙的现象。图形的显示虽然美观,但还是要装进的代码很大,内存有限。

//显示图片
//x,y显示坐标
//sizex,sizey,图片长宽
//BMP:要显示的图片
void OLED_DrawBMP(u8 x,u8 y,u8 sizex, u8 sizey,u8 BMP[])
{   u16 j=0;u8 i,m;sizey=sizey/8+((sizey%8)?1:0);for(i=0;i<sizey;i++){OLED_Set_Pos(x,i+y);for(m=0;m<sizex;m++){      OLED_WR_Byte(BMP[j++],OLED_DATA);            }}
} 

5-2-9 其他命令

//开启OLED显示
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
}
//关闭OLED显示
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
}           //反显函数
void OLED_ColorTurn(unsigned char i)
{if(i==0){OLED_WR_Byte(0xA6,OLED_CMD);//正常显示}if(i==1){OLED_WR_Byte(0xA7,OLED_CMD);//反色显示}
}//屏幕旋转180度
void OLED_DisplayTurn(unsigned char i)
{if(i==0){OLED_WR_Byte(0xC8,OLED_CMD);//正常显示OLED_WR_Byte(0xA1,OLED_CMD);}if(i==1){OLED_WR_Byte(0xC0,OLED_CMD);//反转显示OLED_WR_Byte(0xA0,OLED_CMD);}
}

5-3 oledfont.h文件

#ifndef __OLEDFONT_H
#define __OLEDFONT_H       /************************************6*8的点阵************************************/
unsigned char code asc2_0806[][6] ={
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},// sp
{0x00, 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},// 0
{0x00, 0x00, 0x42, 0x7F, 0x40, 0x00},// 1
{0x00, 0x42, 0x61, 0x51, 0x49, 0x46},// 2
{0x00, 0x21, 0x41, 0x45, 0x4B, 0x31},// 3
{0x00, 0x18, 0x14, 0x12, 0x7F, 0x10},// 4
{0x00, 0x27, 0x45, 0x45, 0x45, 0x39},// 5
{0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
{0x00, 0x01, 0x71, 0x09, 0x05, 0x03},// 7
{0x00, 0x36, 0x49, 0x49, 0x49, 0x36},// 8
{0x00, 0x06, 0x49, 0x49, 0x29, 0x1E},// 9
{0x00, 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},// A
{0x00, 0x7F, 0x49, 0x49, 0x49, 0x36},// B
{0x00, 0x3E, 0x41, 0x41, 0x41, 0x22},// C
{0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C},// D
{0x00, 0x7F, 0x49, 0x49, 0x49, 0x41},// E
{0x00, 0x7F, 0x09, 0x09, 0x09, 0x01},// F
{0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A},// G
{0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F},// H
{0x00, 0x00, 0x41, 0x7F, 0x41, 0x00},// I
{0x00, 0x20, 0x40, 0x41, 0x3F, 0x01},// J
{0x00, 0x7F, 0x08, 0x14, 0x22, 0x41},// K
{0x00, 0x7F, 0x40, 0x40, 0x40, 0x40},// L
{0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F},// M
{0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F},// N
{0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E},// O
{0x00, 0x7F, 0x09, 0x09, 0x09, 0x06},// P
{0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
{0x00, 0x7F, 0x09, 0x19, 0x29, 0x46},// R
{0x00, 0x46, 0x49, 0x49, 0x49, 0x31},// S
{0x00, 0x01, 0x01, 0x7F, 0x01, 0x01},// T
{0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F},// U
{0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F},// V
{0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F},// W
{0x00, 0x63, 0x14, 0x08, 0x14, 0x63},// X
{0x00, 0x07, 0x08, 0x70, 0x08, 0x07},// Y
{0x00, 0x61, 0x51, 0x49, 0x45, 0x43},// Z
{0x00, 0x00, 0x7F, 0x41, 0x41, 0x00},// [
{0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55},// 55
{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},// a
{0x00, 0x7F, 0x48, 0x44, 0x44, 0x38},// b
{0x00, 0x38, 0x44, 0x44, 0x44, 0x20},// c
{0x00, 0x38, 0x44, 0x44, 0x48, 0x7F},// d
{0x00, 0x38, 0x54, 0x54, 0x54, 0x18},// e
{0x00, 0x08, 0x7E, 0x09, 0x01, 0x02},// f
{0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C},// g
{0x00, 0x7F, 0x08, 0x04, 0x04, 0x78},// h
{0x00, 0x00, 0x44, 0x7D, 0x40, 0x00},// i
{0x00, 0x40, 0x80, 0x84, 0x7D, 0x00},// j
{0x00, 0x7F, 0x10, 0x28, 0x44, 0x00},// k
{0x00, 0x00, 0x41, 0x7F, 0x40, 0x00},// l
{0x00, 0x7C, 0x04, 0x18, 0x04, 0x78},// m
{0x00, 0x7C, 0x08, 0x04, 0x04, 0x78},// n
{0x00, 0x38, 0x44, 0x44, 0x44, 0x38},// o
{0x00, 0xFC, 0x24, 0x24, 0x24, 0x18},// p
{0x00, 0x18, 0x24, 0x24, 0x18, 0xFC},// q
{0x00, 0x7C, 0x08, 0x04, 0x04, 0x08},// r
{0x00, 0x48, 0x54, 0x54, 0x54, 0x20},// s
{0x00, 0x04, 0x3F, 0x44, 0x40, 0x20},// t
{0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C},// u
{0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C},// v
{0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C},// w
{0x00, 0x44, 0x28, 0x10, 0x28, 0x44},// x
{0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C},// y
{0x00, 0x44, 0x64, 0x54, 0x4C, 0x44},// z
{0x14, 0x14, 0x14, 0x14, 0x14, 0x14},// horiz lines};//16*16 ASCII字符集点阵
unsigned char code asc2_1608[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00},/*"!",1*/
{0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00},/*"#",3*/
{0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00},/*"$",4*/
{0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00},/*"%",5*/
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10},/*"&",6*/
{0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",8*/
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",9*/
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",10*/
{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},/*"/",15*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",16*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",17*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",18*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",19*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",20*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",21*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",22*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",23*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",24*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",25*/
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00},/*"<",28*/
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"=",29*/
{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00},/*">",30*/
{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00},/*"?",31*/
{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00},/*"@",32*/
{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",33*/
{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},/*"B",34*/
{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",35*/
{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},/*"D",36*/
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},/*"E",37*/
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},/*"F",38*/
{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00},/*"G",39*/
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},/*"H",40*/
{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"I",41*/
{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00},/*"J",42*/
{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00},/*"K",43*/
{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00},/*"L",44*/
{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00},/*"M",45*/
{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00},/*"N",46*/
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00},/*"O",47*/
{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00},/*"P",48*/
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00},/*"Q",49*/
{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20},/*"R",50*/
{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00},/*"S",51*/
{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"T",52*/
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"U",53*/
{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},/*"V",54*/
{0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00},/*"W",55*/
{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20},/*"X",56*/
{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"Y",57*/
{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00},/*"Z",58*/
{0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00},/*"[",59*/
{0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00},/*"\",60*/
{0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/
{0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20},/*"a",65*/
{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"b",66*/
{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},/*"c",67*/
{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20},/*"d",68*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},/*"e",69*/
{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"f",70*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00},/*"g",71*/
{0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"h",72*/
{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},/*"j",74*/
{0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00},/*"k",75*/
{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"l",76*/
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F},/*"m",77*/
{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"n",78*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"o",79*/
{0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00},/*"p",80*/
{0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80},/*"q",81*/
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},/*"r",82*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",83*/
{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00},/*"t",84*/
{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},/*"u",85*/
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00},/*"v",86*/
{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},/*"w",87*/
{0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00},/*"x",88*/
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00},/*"y",89*/
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40},/*"{",91*/
{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},/*"|",92*/
{0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
unsigned char code Hzk[][32]={
{0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00}/*"我",0*/};#endif

六、实验

通过OLED显示当前的温度:

我们结合之前学的温度传感模块,当时是数码管上显示,能在数码管显示那么在oled上显示也是很简单操作的,我们将上面写好之后封装好,检验每个函数能正常让oled显示相应的功能,就方便以后的使用了,直接调用函数就行了。源码如下:

链接:https://pan.baidu.com/s/1_wo1f2zA_oLl9EuYuC9Yzg?pwd=ajoy 
提取码:ajoy

SPI的模拟应用——OLED以及时钟模块的应用(二)7脚OLED的驱动及现实当前温度相关推荐

  1. SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)

    链接:https://pan.baidu.com/s/1g8jkENjO8v4eXq0bN0acEw?pwd=45c8  提取码:45c8 目录 一. 什么是SPI 1-1 SPI简介 1-2 SPI ...

  2. enc28j60 linux 驱动_linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  3. FPGA异步时序和多时钟模块

    第六章   时钟域 有一个有趣的现象,众多数字设计特别是与FPGA设计相关的教科书都特别强调整个设计最好采用唯一的时钟域.换句话说,只有一个独立的网络可以驱动一个设计中所有触发器的时钟端口.虽然这样可 ...

  4. STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)

    文章目录 1. 准备工作 1.1. 所用硬件 1.2. SPI 简介 1.3. 生成工程 1.3.1. 创建工程选择主控 1.3.2. 系统配置 1.3.3. 配置工程目录 2. 读写EEPROM实验 ...

  5. Arduino提高篇23—OLED电子时钟

    在前篇文章中,我们通过库函数驱动DS1302获取到时间数据并且通过串口输出,而串口只是方便调试,要制作电子时钟,我们需要使用显示模块,本篇结合OLED对时间数据进行展示. 1. 实验材料 Uno R3 ...

  6. arduino nano 蓝牙_Arduino提高篇23—OLED电子时钟

    关注. 星标公众号,不错过精彩内容 编辑:Tony 来源:公众号TonyCode 在前篇文章中,我们通过库函数驱动DS1302获取到时间数据并且通过串口输出,而串口只是方便调试,要制作电子时钟,我们需 ...

  7. 树莓派基础实验32:DS1302实时时钟模块实验

    一.介绍   现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话.传真.便携式仪器等产品领域.在本实验中,我们将使用DS ...

  8. 蓝桥杯单片机之DS1302时钟模块的使用

    蓝桥杯单片机之DS1302时钟模块的使用 DS1302简介 SPI串口简介 BCD码 阅读手册获取寄存器信息 日历时钟寄存器 控制字 将手册中的数据进行分析可得 完整代码示例: 总结 DS1302简介 ...

  9. 基于DS3231时钟模块的stm32 Hal库程序,源码

    关于DS3231模块介绍我在我的博客基于DS3231时钟模块的stm32 程序,源码中有介绍 ,大家可以自己看下.我这篇直接讲HAL的代码. 一.配置IO /**/****************** ...

最新文章

  1. Matplotlib绘图双纵坐标轴设置及控制设置时间格式
  2. UILabel 使用 标签,圆角,富文本
  3. mysql proxies_priv_Mysql5.7.18利用MySQLproxies_priv实现类似用户组管理实例分享
  4. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
  5. toughradius 配置mysql_ToughRADIUS
  6. Vue3.js 全局组价案例入门
  7. 华为商城抢手机软件_华为p40配置详细参数
  8. 洛谷P3812 【模板】线性基
  9. raft算法_MIT 6.824 分布式系统 | Lab 2A:Raft选举
  10. BugKu_MISC_(3)
  11. 端口扫描之FTP反弹扫描
  12. java openxml_Excel单元格中的OpenXml和Date格式
  13. python调用函数出现未定义_在python中调用函数时出错“函数未定义”
  14. Java基础算法,获得相反数
  15. 基础提升*哈希函数与哈希表
  16. Matlab/simulink通信系统仿真入门操作
  17. 力扣--初级算法-1
  18. 搜狗输入法 exe 文件列表
  19. 形态世界的非定形现象
  20. python中计算区间内的质子数

热门文章

  1. 闲说CRM的三个境界
  2. SOA架构和微服务架构之间的关系
  3. Quartz立即执行
  4. ZYNQ7000搭建嵌入式Linux操作系统---基础篇
  5. 【天赢金创】0 基础怎样开始学习做网站 (Ruby on Rails)?
  6. ZOJ问题(找规律,字符串处理)
  7. openwrt配置IPV6四天折腾记
  8. 我的世界java版如何装mod_我的世界mac版怎么装mod 我的世界mac版mod安装教程
  9. 企业需要什么--以及他们在哪里
  10. 香港舞蹈家荣毅捷“回乡”办学记:民族的就是世界的