基于STM32F103C8T6的IIC通信协议及硬件通信和软件OLED温度显示项目_stm32f103c8t6 i2c-程序员宅基地

技术标签: stm32  单片机  

#一、IIC协议简介
#二、IIC总线系统结构
#三、IIC总线物理层特点
#四、软/硬件IIC总线
#五、IIC总线协议层
#六、IIC通信结构
##1.空闲状态
##2.开始信号
##3.停止信号
##4.应答信号
##5.数据的有效性
##6.数据传输
#七、STM32的IIC特性
##1.软件模拟协议
##2.硬件实现协议
#八、STM32的IIC架构
##1.通信引脚
##2.时钟控制逻辑
##3.数据控制逻辑
#九、STM32的IIC的通信过程
#十、STM32的IIC结构体
#十一、OLED屏幕
#十二、OLED接线
#十三、OLED屏幕显存及其原理
#十四、OLED屏幕常用指令
#十五、OLED屏幕字模软件的使用
#十六、IIC硬件通讯
#十七、项目代码
#十八、IIC软件通讯项目(显示温湿度)
#十九、项目代码

一、IIC协议简介

IIC通信协议(Inter----Integrted Circuit)是由Phiips飞利浦公司开发的,由于他引脚少,硬件实现简单,可拓展性强,不需要USART,CAN通讯协议的外部收发设备,现在被广泛使用在系统内多个集成电路IC(芯片)间的通讯,IIC使用半双工通讯,半双工允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,实际上是切换的单工。

在这里插入图片描述

二、IIC总线系统结构

  • IIC是一个支持多设备的总线。”总线“是指多个设备共用的信号线,在一个IIC通讯总线中,可连接多个IIC通讯设备,支持多个通讯主机及多个通讯从机。
  • 一个IIC总线只使用两条总线线路,一条双向串行数据线(SDA)一条串行时钟线(SCL)数据线即用来表示数据,时钟线用于数据收发同步。
  • 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备直接访问。

在这里插入图片描述

三、IIC总线物理层特点

  • 总线通过上拉电阻接到电源
  • 当IIC设备空闲时,会输出高阻态,而当所有设备都空闲时,都输出高阻态,由上拉电阻把总线拉成高电平
  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定哪个设备占用总线
  • 具有三种传输模式:标准模式传输速率为100kbit/s,快速模式为400kbit/s,高速模式下可达3.4M/s,但目前大多IIC设备尚不支持高速模式,主要应用低速模式。

在这里插入图片描述

四、软/硬件IIC总线

  • 硬件IIC:对应芯片上的IIC外设,由相对应的IIC驱动电路,其所使用的IIC管脚也是专用的
  • 软件IIC:一般是用GPIO管脚,用软件控制管脚状态以及模拟IIC通信波形
  • 两者区别:硬件IIC的效率要远高于软件的,而软件IIC不受引脚限制,接口比较灵活。软件IIC 是通过GPIO,软件模拟寄存器的工作方式,而硬件IIC是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册,因为固件IIC的端口是固定的,所以会有所区别。
  • 硬件IIC用法复杂,模拟IIC流程更加清楚,硬件IIC速度比模拟快,并且可以用DMA,模拟IIC可以在任何管脚上,硬件IIC在固定管脚上。

五、IIC总线协议层

IIC的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

在这里插入图片描述

IIC基本读写过程:

1.主机写数据到从机

  • S:数据由主机传输至从机

  • SLAVE ADDRESS:从机地址

    起始信号产生后,所有从机就开始紧接下来广播的从机地址信号。IIC总线,每个设备的地址都是唯一的,当主机广播的地址与某个设备的地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据IIC协议,这个从机地址可以是7位或者10位。

  • R/W:地址位之后,传输方向选择位,为0:表示数据传输方向是由主机传输到从机,即主机向从机写数据,为1:表示数据传输方向是由从机传输到主机,即从机向主机写数据。从机接收传输方向选择位后,主机或从机会返回一个应答A(ACK)或非应答A/A(NACK)信号,只有接收到应答信号后,主机才能继续发送或者接收数据。

  • P:数据传输结束

2.主机读数据到从机

读数据:

  • 配置方向传输位为“读数据”方向。
  • 广播完地址后,接收到应答信号后,从机开始向主机返回数据(DATA),数据包大小也为8位,从机没发送完一个数,都会等待主机信号(ACK),重复这个过程,可以返回N个数据,N没有限制大小,当主机希望停止接收数据时,就向从机返回一个非应答信号(NCAK),则从机自动停止传输数据。

3、通讯复合模式

  • 复合格式,该传输过程有两次起始信号(S)
  • 在第一次传输过程中,主机通过SLAVE_ADDRESS寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址;
  • 第二次传输中,对该地址的内容进行读或者写,也就是说,第一次通讯时告诉从机读写地址,第二次则是读写的实际内容。

六、IIC通讯结构

1.空闲状态

  • IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。在空闲状态期间,输出场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

2.起始信号

  • 当SCL为高电平期间,SDA由高到低的跳变;启动信号时一种电平跳变时序信号,而不是一个电平信号。

3.停止信号

  • 当SCL为高电平期间,SDA由低到高的跳变;停止信号也是一种高电平跳变时序信号,而不是一个电平信号。

:起始信号和停止信号一般由主机产生

在这里插入图片描述

4.应答信号

  • 发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号;
  • 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接受了该字节;
  • 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功;
  • 对于反馈有效应答位ACK的要求是,接收器在第九个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平
  • 如果接收器是主控器,则在它收到在最后一个字节后,发送一个NACK信号,以通知被控发送器数据发送,并释放SDA线,以便主控接收器发送一个停止信号P;

在这里插入图片描述

5.数据的有效性

  • IIC总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化,SDA数据线在SCL的每个时钟周期传输一位数据;
  • 数据在SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须稳定

在这里插入图片描述
6.数据传输

  • 在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或者同步控制),即在SCL串行时钟的配合下,SDA上逐位地串行传送每一位数据,数据位的传输是边沿触发。

七、STM32的IIC特性及其架构

1.软件模拟协议

  • 使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑

2.硬件实现协议

  • 由STM32的IIC片上外设专用负责实现IIC通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理IIC协议的方式减轻了CPU的工作,且使软件设计更加简单。

STM32的IIC外设可用作通讯的主机及从机,支持100Kbits/s和400Kbits/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。

八、STM32的IIC架构

  • 通讯引脚
  • 时钟控制逻辑
  • 数据控制逻辑
  • 整体控制逻辑

在这里插入图片描述

1.通信引脚

  • STM32芯片有多个IIC外设,它们的IIC通讯信号引出到不同的GPIO引脚上,使用时必须配置这些指定的引脚

2.时钟控制逻辑

1)控制逻辑简介

  • SCL线的时钟信号,由IIC接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率
  • 可选择的IIC通讯的“标准/快速模式”,这两个模式分别对应100/400Kbits/s的通讯速率
  • 在快速模式下可选择SCL时钟的占空比,可选T(low)/T(high)=2或T(low)/T(high)=16/9模式
  • CCR寄存器中12位的配置因子CCR,它与IIC外设的输入时钟源共同作用,产生SCL时钟,STM32的IIC外设输入时钟源为PCLKl1

2)计算时钟频率

标准模式:

  • Thigh = CCR*Tpclk1
  • Tlow = CCR*Tpclk1

快速模式中 T low/T high =2 时:

  • Thigh = CCR*Tpclk1
  • Tlow = 2*CCR *Tpclk1

快速模式中 T low/T high =2 时:

  • Thigh = 9 * CCR * Tpclk1
  • Tlow = 16 * CCR *Tpclk1

如:PCLK1=36Mhz,想要配置400Kbits/s,方法:

  • PCLK时钟周期:TPCLK1=1/36 000 000
  • 目标SCL时钟周期:TSCL=1/400 000
  • SCL时钟周期内的高电平时间:Thigh=TSCL/3
  • SCL周期时钟内的低电平时间:Tlow=2*TSCL/3
  • 计算CCR的值 : CCR=Thigh/Tpclk1=30
  • 计算出来的值写入到寄存器即可

3.数据控制逻辑

  • IIC的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA数据线
  • 当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去
  • 当从外部接收数据的时候,数据移位寄存器把SDA信号线采样的数据一位一位地存储到“数据寄存器”中

九、STM32的IIC的通信过程

使用IIC外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1和SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态

  • 主发送器
    在这里插入图片描述

  • 控制产生起始信号(S),当发生起始信号后,它产生事件” EV5〞,并会
    对SR1寄存器的 SB 位置1,表示起始信号己经发生。

  • 发生设备地址井等待应答信号,若有从机应答,则产生时间 EV6及
    EV8这时SR1寄存器的 ADDR位及TXE位被
    置1,ADDR位1表示地址己经发送,TEX表示数据寄存器为空。

十、STM32的IIC结构体

typedef struct
{

  • uint32_t I2C_ClockSpeed; //设置SCL时钟频率,此值要低于400 000
  • uint16_t I2C_Mode; //指定工作模式,可选IIC模式及SMBUS模式
  • uint16_t I2C_DutyCycle;//时钟占空比,可选low/high = 2:0或16:9
  • uint16_t I2C_Own_Address1;//自身的11C设备地址
  • uint16_t I2C_Ack;//使能或者关闭响应,一般是使能
  • uint16_t I2C_AcknowledgedAddress;//指定地址长度,可为7或10

}12C InitTypeDef;

1. uint32_t I2C_ClockSpeed; //设置SCL时钟频率,此值要低于400 000

  • 设置IIC的传输速率,在调用初始化函数时,函数会根据我输入的数值经过运算后把时钟因子写入到IIC的时钟控制寄存器CCR,而我们写入的这个参数值不得高于Khz
  • 实际上由于CCR寄存器不能写入小数类型的时钟因子,影响到SCL的实际频率可能会低于本成员设置的参数值,这时除了通讯会稍微慢点以外,不会对IIC的标准通讯造成其他影响。

2.uint16_t I2C_Mode;//指定工作模式,可选IIC模式及SMBUS模式

  • 选择IIC的使用方式。有IIC模式(I2C_Mode_IIC)和SMBus主、从模式(IIC_Mode_SMBusHost、IIC_Mode_SMBusDeceive)
  • IIC不需要在此处区分主从模式,直接设置IIC_Mode_IIC即可

3.uint16_t I2C_DutyCycle;//时钟占空比,可选low/high = 2:0或16:9

  • 设置IICSCL线时钟的占空比。该配置有两个选择,分别为低电平时间比高电平时间2:1(IIC_DutyCycle_2)和16:9(IIC_DutyCycle_16_9)
  • 其实这两个模式的比例差别不大,一般要求都不会如此严格,这里随便选就可以。

4.uint16_t I2C_Own_Address1;//自身的11C设备地址

  • 配置STM32的IIC设备自己的地址,每个连接到IIC总线上的设备都有一个自己的地址,作为主机也不例外。地址可以设置为7位或10位(受下面IIC_AcknowledgeAddress成员决定),只要该地址是IIC总线上唯一的即可
  • STM32的IIC外设可同时使用两个地址,即同时对两个地址作出响应,这个结构体成员IIC_OwnAddress1配置的是默认的,OAR1寄存器存储的地址,若需要设置第二个地址寄存器OAR2,可使用IIC_OwnAddress2Config函数来配置,OAR2不支持10位地址。

5.uint16_t I2C_Ack;//使能或者关闭响应,一般是使能

  • 配置IIC应答是否使能,设置使能则可以发送响应信号,一般配置为允许应答(IIC_Ack_Enable),这是绝大多数遵循IIC标准的设备的通讯要求,改为禁止应答(IIC_Ack_Disable)往往会导致通讯错误

6. uint16_t I2C_AcknowledgedAddress;//指定地址长度,可为7或10

  • 选择IIC的寻址模式是7位或者是10位地址,这需要根据实际连接到IIC总线上的设备地址进行选择,这个成员的配置也影响到IIC_OwnAddress成员,只有这里设置成10位模式时,IIC_OwnAddress1才支持10位地址
  • 配置完这些结构体成员的值,调用库函数IIC_Init就可以把结构体的配置写入对应的寄存器中。

十一、OLED屏幕

  • OLED即有机发光管(Organic Light-Emitting Diode,OLED),OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高优点反应速度、可用于挠曲性面板、使用温度范围广、构造及制造简单等优点
    被认为是下一代的平面显示屏新兴应用技术
  • OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优
  • 常用的OLED屏幕有蓝色、黄色、白色等几种,屏的大小为0.96寸,像素点为128*64,所以我们称为0.96oled屏或者12864屏
  • 模块尺寸:23.7*23.8mm
  • 电源电压:3.3v-5.5v
  • 驱动芯片:SSD1306
  • 测试平台:提供k60/k10,9s12xs128,51,stm32,stm8等单片机

在这里插入图片描述
十二、OLED屏幕接线

  • GND——OLED显示模块电源地
  • VCC——OLED显示模块电源正(3.3v/5v)
  • SCL——OLED显示模块IIC总线时钟信号
  • SDA——OLED显示模块IIC总线数据信号

十三、OLED屏幕显存及其原理

在这里插入图片描述

  • 如图,OLED屏幕显存有64行乘128列,一共分为8页,一页8行,128列。
  • OLED本身是没有显存的,他的显存是依赖SSD1306提供的,而SSD1306提供一块显存
  • SSD1306显存总共为128*64bit大小,SSD1306将这些显存分成了8页,每页包含128字节。
  • STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM(但对于SRAM很小的单片机就比较麻烦)

十四、OLED屏幕常用指令

在这里插入图片描述

  • 0x81:设置对比度。包含两个字节,第一个0x81为命令,随后法是的一个字节要设置这个对比度,值越大屏幕越亮
  • 命令0xAE/0xAF:0xAE为关闭显示命令,0xAF为开启显示命令
  • 0x8D:包含两个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2(A2)表示电荷泵的开关状态,该位为1开启电荷泵,为0则关闭。模块初始化的时候,这个必须要开启,否则看不到屏幕显示。
  • 命令0xB0~B7:用于设置页地址,其低三位的值对应GRAM页地址
  • 命令0x00~0x0F:用于设置显示时的起始列地址低四位
  • 命令0x10~0x1F:用于设置显示时的起始列地址高四位

十五、OLED屏幕字模软件的使用

在这里插入图片描述
OLED打点方式:

OLED点阵的点亮方式,举个显示“P”的例子,最左边为最高位P7

  • 可以看出,想要显示“P”,首先写入0x1f,则显示一个竖杠,之后控制器自动水平移动到下一列
  • 再写入0x05,则出现两个小横杆,这两个横杆就是0x05中0000 0101中两个1所处的位置,写完第二列后,控制器自动跳到第三列
  • 再写入0x07,第四列写入0x00后,P就显示出来了,这也说明,即使你只想在第一列的最上端显示一个小数点,即写入0x01
  • 即你不能一次性控制一个点阵,只能一次性控制八位点阵,即一列点阵,这决定了字模选择的取模方式为“列行式”

字模软件使用:

字模软件:PCtoLCD2022完美版

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
图像处理过程:

图像要求png格式

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

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
十六、IIC硬件通讯

在这里插入图片描述
主发送器:起始信号——EV5——发送器件地址——EV6——发送寄存器地址——EV8——发送数据——EV8——停止信号

十七、项目代码:

oled.c

#include "stm32f10x.h"
#include "oled.h"
#include "delay.h"
#include "codetab.h"

//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 

void I2C_Configuration(void)//I2C初始化
{
    
    
	  
    I2C_InitTypeDef   I2C_InitStructure;//I2C时钟结构体初始化
    GPIO_InitTypeDef   GPIO_InitStructure;//GPIO时钟结构体初始化
	
	  //1.配置时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//配置GPIO时钟
	  RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );//配置I2C时钟
		
	  //2.配置GPIO时钟结构体
		//PB6 --SCL 时钟总线  PB7 --SDA 数据总线
		GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;//输出模式为复合开漏输出
		GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_6 | GPIO_Pin_7;//配置引脚6、7
		GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;//配置速度为50Mhz
		GPIO_Init(GPIOB, &GPIO_InitStructure);//GPIO时钟初始化

		
		I2C_DeInit(I2C1);//I2C初始化
		I2C_InitStructure.I2C_Ack  =  I2C_Ack_Enable;//应答使能
		I2C_InitStructure.I2C_AcknowledgedAddress =  I2C_AcknowledgedAddress_7bit;//配置地址长度为7位
		I2C_InitStructure.I2C_ClockSpeed = 400000 ; //配置通讯速度为400kbits/s
		I2C_InitStructure.I2C_DutyCycle  = I2C_DutyCycle_2 ;//设置占空比为2
		I2C_InitStructure.I2C_Mode =  I2C_Mode_I2C;//I2C模式
		I2C_InitStructure.I2C_OwnAddress1 = 0X30 ;//主机地址随便配置,如0x30
		I2C_Init(I2C1,&I2C_InitStructure );//配置I2C时钟初始化
		I2C_Cmd(I2C1,ENABLE);//使能I2C时钟

	}

void I2C_WriteByte(uint8_t addr,uint8_t data)
{
    

    while (I2C_GetFlagStatus(I2C1,  I2C_FLAG_BUSY));  //检查I2C总线是否繁忙
	
    I2C_GenerateSTART(I2C1,  ENABLE);                //开启I2C1
    while( !I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_MODE_SELECT)); //EV5,主模式
	
	 I2C_Send7bitAddress(I2C1,OLED_ADDRESS, I2C_Direction_Transmitter); //发送器件地址
	 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6

	 I2C_SendData(I2C1,  addr);   //寄存器地址
   while(!I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_BYTE_TRANSMITTING));//EV8

	I2C_SendData(I2C1,  data);   //发送数据
	 while(!I2C_CheckEvent(I2C1,  I2C_EVENT_MASTER_BYTE_TRANSMITTING));//EV8

  I2C_GenerateSTOP( I2C1,  ENABLE); //关闭I2C总线


}
//写命令
void WriteCmd(unsigned char I2C_Command)
{
    
  
   I2C_WriteByte(0X00,I2C_Command);


}
//写数据
void WriteDat(unsigned char I2C_Data)
{
    

   I2C_WriteByte(0x40,I2C_Data);


}

//OELD屏幕初始化
void OLED_Init(void)
{
    
  delay_ms(100);
	WriteCmd(0xAE); //display off
	WriteCmd(0x20);	//Set Memory Addressing Mode	
	WriteCmd(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	WriteCmd(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	WriteCmd(0xc8);	//Set COM Output Scan Direction
	WriteCmd(0x00); //---set low column address
	WriteCmd(0x10); //---set high column address
	WriteCmd(0x40); //--set start line address
	WriteCmd(0x81); //--set contrast control register
	WriteCmd(0xff); //亮度调节 0x00~0xff
	WriteCmd(0xa1); //--set segment re-map 0 to 127
	WriteCmd(0xa6); //--set normal display
	WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
	WriteCmd(0x3F); //
	WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	WriteCmd(0xd3); //-set display offset
	WriteCmd(0x00); //-not offset
	WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
	WriteCmd(0xf0); //--set divide ratio
	WriteCmd(0xd9); //--set pre-charge period
	WriteCmd(0x22); //
	WriteCmd(0xda); //--set com pins hardware configuration
	WriteCmd(0x12);
	WriteCmd(0xdb); //--set vcomh
	WriteCmd(0x20); //0x20,0.77xVcc
	WriteCmd(0x8d); //--set DC-DC enable
	WriteCmd(0x14); //
	WriteCmd(0xaf); //--turn on oled panel


}
//设置起点坐标
void OLED_SetPos(unsigned char x,unsigned char y)
{
    
   WriteCmd(0xb0 +y);
	 WriteCmd((x&0xf0)>>4|0x10);//取高位
	 WriteCmd((x&0x0f)|0x01);//取低位

}
//全屏填充
void OLED_Fill(unsigned char Fill_Data)
{
    
    unsigned char m,n;
	 for(m=0;m<8;m++)
	{
    
		WriteCmd(0xb0+m);
		WriteCmd(0x00);
		WriteCmd(0x10);
		
			for(n=0;n<128;n++)
			{
    
					WriteDat(Fill_Data);
			}
	}
}
//清屏
void OLED_CLS(void)
{
    
   OLED_Fill(0x00);
}

//OLED打开
void OLED_ON(void)
{
    
   WriteCmd(0X8D);  //设置电荷泵
	 WriteCmd(0X14);  //开启电荷泵
	 WriteCmd(0XAF);  //OLED唤醒
  

}
//OLED关闭
void OLED_OFF(void)
{
    
   WriteCmd(0X8D);  //设置电荷泵
	 WriteCmd(0X10);  //关闭电荷泵
	 WriteCmd(0XAE);  //关闭OLED


}

//显示字符串
void OLED_ShowStr(unsigned char x,unsigned y,unsigned char ch[],unsigned 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;
			
		}
}		  

//显示文字
void OLED_ShowCN(unsigned char x,unsigned char y,unsigned char N)
{
    
		unsigned char wn=0;
	  unsigned int addr=32*N;
	  OLED_SetPos(x,y);
	  for(wn=0;wn<16;wn++)
	  {
    
				WriteDat( F16X16[addr]);
			  addr+=1;
	  }
		OLED_SetPos(x,y+1);
		for(wn=0;wn<16;wn++)
	  {
    
				WriteDat( F16X16[addr]);
			  addr+=1;
	  }
}

void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
    
		unsigned int j=0;
	  unsigned char x,y;
	
	  if(y1%8==0)
		    y=y1/8;
		else
			y=y1/8+1;
		for(y=y0;y<y1;y++)
		{
    
				OLED_SetPos(x0,y);
			  for(x=x0;x<x1;x++)
			  {
    
						WriteDat(BMP[j++]);
				}
		}

}

oled.h

#ifndef _OLED_H_
#define _OLED_H_
#include "stm32f10x.h"
#define OLED_ADDRESS 0x78

void I2C_Configuration(void);
void I2C_WriteByte(uint8_t addr,uint8_t data);
void WriteCmd(unsigned char I2C_Command);
void WriteDat(unsigned char I2C_Data);
void OLED_Init(void);
void OLED_SetPos(unsigned char x,unsigned char y);
void OLED_Fill(unsigned char Fill_Data);
void OLED_ON(void);
void OLED_OFF(void);
void OLED_ShowStr(unsigned char x,unsigned y,unsigned char ch[],unsigned TextSize);
void OLED_ShowCN(unsigned char x,unsigned char y,unsigned char N);
void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);
void OLED_CLS(void);


#endif


codetab.h

unsigned char F16X16[]=
{
    
0x00,0x40,0xC0,0xF0,0x40,0x40,0x40,0x40,0xC0,0xF0,0x40,0x40,0x40,0x00,0x00,0x00,
0x00,0x06,0x03,0x3F,0x01,0x11,0x0A,0x06,0x01,0x3F,0x01,0x02,0x04,0x08,0x00,0x00,/*"林",0*/

0x00,0x20,0x20,0xA0,0x20,0x70,0x60,0x60,0x60,0x70,0xA0,0x20,0x20,0xA0,0x00,0x00,
0x00,0x33,0x1B,0x07,0x00,0x17,0x25,0x05,0x17,0x20,0x07,0x0D,0x15,0x22,0x00,0x00,/*"燕",1*/

0x00,0xF0,0x00,0x00,0xF0,0x00,0x10,0x30,0xD0,0x90,0xD0,0x70,0x30,0x00,0x00,0x00,
0x20,0x21,0x2E,0x22,0x23,0x13,0x13,0x0F,0x12,0x12,0x12,0x1F,0x21,0x21,0x00,0x00,/*"贤",2*/
};//显示文字


const unsigned char F6x8[][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
};//显示字符


const unsigned char F8X16[]=	  
{
    
  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
};//ASCII码


unsigned char BMP1[]=
{
    
0X22,0X01,0X80,0X00,0X40,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X20,0X30,0X20,0X20,0X20,
0X30,0X30,0X20,0X20,0X60,0X40,0X40,0X50,0X62,0X27,0XF6,0XB6,0XB7,0XA7,0XA7,0X9F,
0XB7,0X16,0X0E,0X0E,0X0C,0X0C,0X5C,0XDC,0X5C,0X5C,0X58,0XD0,0XF0,0X90,0X90,0X90,
0X80,0X80,0X00,0X10,0X30,0X90,0X90,0X20,0X00,0X80,0X80,0X80,0XC4,0X84,0X84,0X80,
0X80,0X00,0X80,0X80,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,
0X50,0X70,0X60,0X50,0X50,0X78,0X58,0X58,0X78,0X78,0X38,0X38,0X28,0X38,0X30,0X14,
0X14,0X30,0X38,0X38,0X30,0X38,0XB8,0XDC,0X3C,0X3D,0X01,0X25,0X2C,0XAC,0XB8,0XB1,
0XF1,0XF1,0XE9,0XF9,0XE1,0X63,0X63,0X63,0X77,0X57,0XDF,0X58,0X58,0X58,0X18,0X18,
0X10,0X18,0X10,0X10,0X00,0X00,0X80,0X00,0XA0,0X20,0X10,0X08,0X08,0X00,0X10,0X18,
0X0C,0X0C,0X0E,0X07,0X03,0X03,0X1F,0X3F,0X1F,0X07,0X17,0X3F,0X3E,0X3E,0X68,0X40,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0XE0,0XE1,0XF2,0XFE,0XFC,0XF8,0XFA,0XE2,0XFA,0XD4,0XDC,0XF8,0XD0,0X80,
0XA0,0XD8,0XD4,0X54,0X1C,0X13,0X08,0X04,0X05,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XE0,0XF0,0XF0,0X70,0X70,0XE0,0XC0,0X40,0X00,
0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X40,0XF0,0X70,0X70,0X70,0X70,0XB0,0XF0,0X30,0X20,0XE0,0XC0,0XC0,0X40,
0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X10,0X18,0X08,0X0C,
0X0C,0X07,0X07,0X07,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X01,0X81,0X89,0XC8,
0XC1,0X41,0XA1,0XE1,0X80,0X00,0X00,0XB0,0X10,0X18,0X14,0X1C,0X0C,0X0C,0X1E,0X1E,
0X1E,0X3E,0X3E,0X1E,0X1E,0X1E,0X5F,0X5F,0X1F,0X0E,0X4E,0X0F,0X0E,0X86,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0X1F,0XFF,
0X1F,0X01,0X00,0X00,0X05,0X01,0X03,0X01,0X21,0X00,0X00,0X40,0X00,0X00,0X00,0X00,
0X20,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XE0,0XF0,0X70,0X01,0X15,0X05,0X01,
0X00,0X00,0X00,0X01,0X03,0X00,0X00,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X10,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X0F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

};//显示图像

delay.c

#include "delay.h"
#include "stm32f10x.h"

void initSysTick(void)
{
    
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频
    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;            //使能中断
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;             //开定时器
    SysTick->LOAD = 9;                                    //随意设置一个重装载值
}
/**
 * 功能:微秒级延时函数
 * 参数:xus :具体延时时间  (单位:微秒)
 * 返回值:None
 */
void delay_us(u32 xus)
{
    
    SysTick->LOAD = 9 * xus;                               //计9次为1us,xus则重装载值要*9
    SysTick->VAL = 0;                                      //计数器归零
    while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数完成
}
/**
 * 功能:毫秒级延时函数
 * 参数:xms :具体延时时间  (单位:毫秒)
 * 返回值:None
 */
void delay_ms(u32 xms)
{
    
    SysTick->LOAD = 9000;                                      //计9次为1us,1000次为1ms
    SysTick->VAL = 0;                                          //计数器归零
    while (xms--)
    {
    
        while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成
    }
}

delay.h

#include "stm32f10x.h"

void initSysTick(void);
void delay_us(u32 xus);
void delay_ms(u32 xms);



main.c

#include "stm32f10x.h"
#include "main.h"
#include "Shake.h"
#include "Relay.h"
#include "delay.h"
#include "oled.h"


extern  const unsigned char BMP1[];
int main(void)
{
    
	 //unsigned char i=0;
   initSysTick();
   I2C_Configuration();
   OLED_Init();
   delay_ms(2000);
	
	 OLED_Fill(0XFF);  //屏幕点亮
	 delay_ms(2000);
		
	 OLED_Fill(0X00);   //全屏灭
	 delay_ms(2000);

	//OLED_ShowStr(0,3,"I LOVE YOU",1);//显示字符
	//OLED_ShowStr(0,4,"I LOVE YOU",2);


	 while(1)
	{
    
     /*for(i=0;i<3;i++)
     {
				OLED_ShowCN(22+i*16,0,i);
		 }	*///显示文字

     OLED_DrawBMP(0,0,128,8,(unsigned char*)BMP1);//显示图形
     
	}
}










十八、IIC软件通讯项目(显示温湿度)

温湿度DHT11

十九、项目代码

OLED.c

#include "stm32f10x.h"
#include "oled.h"
#include "oledfront.h"
#include "delay.h"
#include "DHT11.h"

/*static void delay_u(unsigned char num)//毫秒级延时
{
		uint8_t i=10;
	  while(num--)
		{
				while(i--);	
		}
}*/

/*static void delay_ms(unsigned int ms)//微妙级延时
{
		unsigned int x,y;
	  for(x=ms;x>0;x--) 
	  {
				for(y=12000;y>0;y--);
		}
}*/

static void OLED_GPIO_Init(void)
{
    
	
	  //1.配置GPIO
		GPIO_InitTypeDef GPIO_InitStructure;//GPIO结构体初始化
	
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//配置GPIO时钟
	
	  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_OD;//开漏输出
	  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1;
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	  GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIO初始化
	
	  OLED_SCLK_Set();
	  OLED_SDIN_Set();
}

//模拟IIC起始信号
static void OLED_IIC_Start(void)
{
    
		OLED_SCLK_Set();//时钟总线高电平
	  OLED_SDIN_Set();//数据总线高电平
	  delay_us(1);//延时1us
	  OLED_SDIN_Clr();//数据总线置低
	  delay_us(1);//延时1us
	  OLED_SCLK_Clr();//时钟总线置低
	  delay_us(1);//延时1us
	  
	
}	



//模拟I2C停止信号
static void OLED_IIC_Stop(void)
{
    
	  OLED_SDIN_Clr();//数据总线置低
	  delay_us(1);//延时1us
		OLED_SCLK_Set();//时钟总线高电平
	  delay_us(1);//延时1us
	  OLED_SDIN_Set();//数据总线高电平
	  delay_us(1);//延时1us 
}

//模拟I2C读取从机应答信号
static unsigned char I2C_Wait_Ack(void)
{
    
		unsigned char ack;
	  OLED_SCLK_Clr();//时钟总线置低
	  delay_us(1);//延时1us
	  OLED_SDIN_Set();//数据总线高电平
	  delay_us(1);//延时1us
	  OLED_SCLK_Set();//时钟总线高电平
	  delay_us(1);//延时1us 
	
	  if(OLED_READ_SDIN())
				ack=IIC_NO_ACK;
		else
				ack=IIC_ACK;
		OLED_SCLK_Clr();//时钟线置低
		delay_us(1);//延时1us
		
		return ack;
	  
}

//IIC读取一个字节
static void Write_IIC_Byte(unsigned char IIC_Byte)
{
    
		unsigned char i;//定义变量i
	  for(i=0;i<8;i++)
	  {
    
				OLED_SCLK_Clr();
			  delay_us(1);//延时1us 
			  if(IIC_Byte&0x80)//读取最高位
				  OLED_SDIN_Set(); //最高位为1
				else 
					OLED_SDIN_Clr(); //最高位为0
				
				IIC_Byte<<=1;//数据左移一位
				delay_us(1);//延时1us 
				OLED_SCLK_Set();//时钟总线置高,产生上升沿
				delay_us(1);//延时1us
			  
		}
		OLED_SCLK_Clr();//时钟线置低
		delay_us(1);//延时1us
		
		while(I2C_Wait_Ack());//从机等待
		                        	
}

//IIC写入命令
static void Write_IIC_Command(unsigned char IIC_Command)
{
    
		OLED_IIC_Start();//启动信号
	  Write_IIC_Byte(0x78);//写入从机地址
	  Write_IIC_Byte(0x00);//写入命令
	  Write_IIC_Byte(IIC_Command);//命令
	  OLED_IIC_Stop();  //发送停止信号
	  
}	

//IIC写数据
static void Write_IIC_Data(unsigned char IIC_Data)
{
    
		OLED_IIC_Start();//启动信号
	  Write_IIC_Byte(0x78);//写入从机地址
	  Write_IIC_Byte(0x40);//写入数据
	  Write_IIC_Byte(IIC_Data);//数据
	  OLED_IIC_Stop();  //发送停止信号
}

//对OLED写字节
void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
{
    
		if(cmd)
		{
    
			 Write_IIC_Data(dat);//写入数据
		}
		else
		{
    
			 Write_IIC_Command(dat);//写入命令
		}

}

//设置数据输入的起始行和列
//x:列的起始低地址于起始高地址
//y:页 起始页的地址0~7
void OLED_Set_Pos(unsigned char x,unsigned char y)
{
    
		OLED_WR_Byte(0xb0+y,OLED_CMD);//写入页地址
	  OLED_WR_Byte((x&0x0f),OLED_CMD);//写入列的地址,低半个字节
    OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//写入列地址,高半个字节 
}   

//开显示
void OLED_Display_ON(void)
{
    
		OLED_WR_Byte(0x8D,OLED_CMD);//设置OLED电荷泵
	  OLED_WR_Byte(0x14,OLED_CMD);//使能,开
	  OLED_WR_Byte(0xAF,OLED_CMD);//开显示 
}

//关显示
void OLED_Display_OFF(void)
{
    
		OLED_WR_Byte(0x8D,OLED_CMD);//设置OLED电荷泵
	  OLED_WR_Byte(0x10,OLED_CMD);//失能
	  OLED_WR_Byte(0xAE,OLED_CMD);//关显示
}

//清屏幕
void OLED_Clear(void)
{
    
		unsigned char 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<128;n++) OLED_WR_Byte(0,OLED_DATA);//写入0清屏
		}
}



void OLED_Init(void)
{
    
	OLED_GPIO_Init();	//GPIO口初始化
 
	delay_ms(200);	//延迟,由于单片机上电初始化比OLED快,所以必须加上延迟,等待OLED上复位完成

	OLED_WR_Byte(0xAE,OLED_CMD);	//关闭显示

	OLED_WR_Byte(0x00,OLED_CMD);	//设置低列地址
	OLED_WR_Byte(0x10,OLED_CMD);	//设置高列地址
	OLED_WR_Byte(0x40,OLED_CMD);	//设置起始行地址
	OLED_WR_Byte(0xB0,OLED_CMD);	//设置页地址

	OLED_WR_Byte(0x81,OLED_CMD); 	// 对比度设置,可设置亮度
	OLED_WR_Byte(0xFF,OLED_CMD);	//  265  

	OLED_WR_Byte(0xA1,OLED_CMD);	//设置段(SEG)的起始映射地址;column的127地址是SEG0的地址
	OLED_WR_Byte(0xA6,OLED_CMD);	//正常显示;0xa7逆显示

	OLED_WR_Byte(0xA8,OLED_CMD);	//设置驱动路数(16~64)
	OLED_WR_Byte(0x3F,OLED_CMD);	//64duty
	
	OLED_WR_Byte(0xC8,OLED_CMD);	//重映射模式,COM[N-1]~COM0扫描

	OLED_WR_Byte(0xD3,OLED_CMD);	//设置显示偏移
	OLED_WR_Byte(0x00,OLED_CMD);	//无偏移
	
	OLED_WR_Byte(0xD5,OLED_CMD);	//设置震荡器分频
	OLED_WR_Byte(0x80,OLED_CMD);	//使用默认值
	
	OLED_WR_Byte(0xD9,OLED_CMD);	//设置 Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);	//使用官方推荐值
	
	OLED_WR_Byte(0xDA,OLED_CMD);	//设置 com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);	//使用默认值
	
	OLED_WR_Byte(0xDB,OLED_CMD);	//设置 Vcomh,可调节亮度(默认)
	OLED_WR_Byte(0x40,OLED_CMD);	使用官方推荐值
	
	OLED_WR_Byte(0x8D,OLED_CMD);	//设置OLED电荷泵
	OLED_WR_Byte(0x14,OLED_CMD);	//开显示
	
	OLED_WR_Byte(0xAF,OLED_CMD);	//开启OLED面板显示
	OLED_Clear();        //清屏
	OLED_Set_Pos(0,0); 	 //设置数据写入的起始行、列
}  




//OLED显示字符
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr)
{
    
		unsigned char c=0,i=0;
	  c=chr-' ';//获取字符偏移量
	  if(x>MAX_Column)
		{
    
				x=0; //如果列出了范围,就从下两页的第0列开始
			  y=y+2;
		}
		if(SIZE==16)//字符大小如果为16=8*16;
		{
    
				OLED_Set_Pos(x,y);//从x,y开始画点
			  for(i=0;i<8;i++)
			  OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);//找出字符c的数组位数,先把第一列画完  
		    OLED_Set_Pos(x,y+1);//从x,y开始画点
			  for(i=0;i<8;i++)
			  OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);//找出字符c的数组位数,先把第一列画完  
	
		}
		else //6=6*8
		{
    
				OLED_Set_Pos(x,y);//从x,y开始画点
			  for(i=0;i<6;i++)
			  OLED_WR_Byte(F6x8[c][i],OLED_DATA);//找出字符c的数组位数,先把第一列画完  
		}
}


//显示字符串
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr)
{
    
		unsigned char j=0;
	  while(chr[j]!='\0')//判断是否为最后一个字符
		{
    
				OLED_ShowChar(x,y,chr[j]);//显示字符
		    x+=8;//列数+8,一个字符占8位
			  if(x>=128)
				{
    
					 x=0;
					 y+=2;
				}
				j++;
		}
		
}

//计算的m^n次方,result一个数的n次方
unsigned int OLED_Pow(unsigned char m,unsigned n)
{
    
		unsigned int result=1;
	  while(n--)
			result *=m;
		return result;

}

//显示数字
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size )
{
    
		unsigned char t,temp;
	  unsigned char enshow=0;
	
	  for(t=0;t<len;t++)
	  {
    
				temp=(num/OLED_Pow(10,len-t-1))%10;//取出输入数字的每个位,由高到低
			  if(enshow==0&&t<(len-1))//enshow是否为第一个数,t<len-1,判断是否为最后一个数
		    {
    
						if(temp==0)//如果该数为0
						{
    
								OLED_ShowChar(x+(size/2)*t,y,' ');//显示0
							  continue; //跳过剩下语句,避免重复显示
							
						}	else enshow =1;						
				}
				OLED_ShowChar(x+(size/2)*t,y,temp+'0');//显示最后一个位
		}

}

//显示文字
void OLED_ShowChinese(unsigned char x,unsigned char y,unsigned char no)
{
    
		unsigned char t,addr=0;
	  OLED_Set_Pos(x,y);
	  for(t=0;t<16;t++)
	  {
    
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);//画no在数组位置的第一页16列的点
			  addr+=1;//数组地址+1
		}
		OLED_Set_Pos(x,y+1);
		for(t=0;t<16;t++)
		{
    
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);//画no在数组位置的第二页16列的点
				addr+=1;//数组地址+1
		}
		
}




OLED.h

#ifndef _OLED_H_
#define _OLED_H_

#include "stm32f10x.h"

#define OLED_SCLK_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_0)//PB0 SCLK 输出高
#define OLED_SCLK_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_0)//PB1 SCLK 输出低
#define OLED_SDIN_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_1)//PB1 SDA 输出高
#define OLED_SDIN_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_1)//PB1 SDA 输出低
#define OLED_READ_SDIN() GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)//读取PB1(SDA)电平 

#define IIC_ACK 0    //应答
#define IIC_NO_ACK 1 //无应答
#define OLED_CMD 0  //写命令
#define OLED_DATA 1 //写数据
#define SIZE 16 //显示字符大小
#define MAX_Column 128 //最大列数


//static void delay_u(unsigned char num);
//static void delay_ms(unsigned int ms);
static void OLED_IIC_Start(void);
static void OLED_IIC_Stop(void);
static unsigned char I2C_Wait_Ack(void);
static void Write_IIC_Byte(unsigned char IIC_Byte);
static void Write_IIC_Command(unsigned char IIC_Command);
static void Write_IIC_Data(unsigned char IIC_Data);
void OLED_WR_Byte(unsigned char dat,unsigned char cmd);
void OLED_Set_Pos(unsigned char x,unsigned char y);
void OLED_Display_ON(void);
void OLED_Display_OFF(void);
void OLED_Clear(void);
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr);
void OLED_Init(void);
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr);
unsigned int OLED_Pow(unsigned char m,unsigned n);
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size );
void OLED_ShowChinese(unsigned char x,unsigned char y,unsigned char no);




#endif


oledfront.h

#ifndef __OLEDFONT_H
#define __OLEDFONT_H 	   
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
/************************************6*8的点阵************************************/
const unsigned char  F6x8[][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
};
/****************************************8*16的点阵************************************/
const unsigned char  F8X16[]=	  
{
    
  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
};
const unsigned char  Hzk[][32]={
    

{
    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},/*"技",0*/

{
    0x40,0x44,0x54,0x65,0xC6,0x64,0x54,0x44,0x00,0xFC,0x44,0x44,0xC4,0x42,0x40,0x00},
{
    0x20,0x12,0x4A,0x82,0x7F,0x02,0x0A,0x92,0x60,0x1F,0x00,0x00,0xFF,0x00,0x00,0x00},/*"新",1*/

{
    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},/*"电",2*/

{
    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},/*"子",3*/

{
    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},/*"科",4*/

{
    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},/*"技",5*/


{
    0x00,0x00,0x00,0x10,0x20,0x60,0x00,0xFC,0x04,0x40,0xA0,0x98,0x00,0x00,0x00,0x00},
{
    0x00,0x00,0x00,0x01,0x41,0x49,0x49,0x29,0x25,0x25,0x24,0x3F,0x01,0x00,0x00,0x00},/*"当",6*/

{
    0x00,0x20,0x20,0xA0,0xA0,0xA4,0xA8,0x20,0x20,0x98,0x16,0xF0,0x10,0x10,0x10,0x00},
{
    0x00,0x00,0x00,0x1F,0x0A,0x2A,0x7F,0x00,0x00,0x0F,0x20,0x6F,0x30,0x00,0x00,0x00},/*"前",7*/


{
    0x00,0x00,0x40,0x08,0x18,0x00,0x08,0xF8,0xA8,0x68,0x68,0x74,0x18,0x00,0x00,0x00},
{
    0x00,0x00,0x30,0x0E,0x22,0x20,0x3E,0x22,0x1E,0x12,0x2E,0x22,0x1F,0x12,0x00,0x00},/*"温",8*/

{
    0x00,0x00,0x00,0x00,0xF0,0x90,0xB0,0xF0,0x56,0xD8,0x28,0x48,0x00,0x00,0x00,0x00},
{
    0x00,0x20,0x10,0x0C,0x43,0x40,0x40,0x2D,0x13,0x1E,0x22,0x60,0x40,0x40,0x40,0x00},/*"度",9*/


{
    0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{
    0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",10*/

{
    0x00,0x0C,0x12,0x0C,0x00,0xC0,0x70,0x10,0x08,0x08,0x08,0x08,0x10,0x30,0x00,0x00},
{
    0x00,0x00,0x00,0x00,0x00,0x0F,0x18,0x30,0x20,0x20,0x20,0x20,0x30,0x1C,0x00,0x00},/*"℃",11*/

{
    0x00,0x00,0x40,0x08,0x08,0x08,0xF8,0xA8,0xA8,0x58,0x48,0x7C,0x08,0x00,0x00,0x00},
{
    0x00,0x00,0x38,0x06,0x20,0x20,0x2C,0x3D,0x23,0x21,0x3F,0x24,0x23,0x20,0x20,0x00},/*"湿",12*/

{
    0x00,0xF0,0xF8,0x08,0x88,0xF8,0xF0,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x00},
{
    0x00,0x00,0x00,0x21,0x18,0x0C,0x02,0x01,0x00,0x1E,0x3F,0x21,0x21,0x1E,0x1E,0x00},/*"%",13*/

{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",14*/


{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{
    0x00,0x00,0x10,0x30,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",15*/


};

#endif



DHT11.c

#include "stm32f10x.h"
#include "DHT11.h"
#include "delay.h"
#include "stdio.h"


uint16_t Rxbuff[5];

void DHT11_GPIO_Init(void)
{
    
   GPIO_InitTypeDef  GPIO_InitStructure;
	
	 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);

	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,  GPIO_Pin_11);

}

void DHT11_GPIO_Init1(void)
{
    
   GPIO_InitTypeDef  GPIO_InitStructure;
	
	 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE);

	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,  GPIO_Pin_11);

}

static uint8_t DHT11_Back()
{
    
   uint8_t i =200;
	
	 while(read_data && i--); //等待低电平的到来
	 i= 200;
	 while(!read_data && i--); //等待高电平的到来
   return 0;
}

void DHT11_Start(void)
{
    
     data0;
	   delay_ms(20);
	
     data1;
	   delay_us(10);
     DHT11_GPIO_Init1();
     while(DHT11_Back());
}

void DHT11_ReceptionBuff(void)
{
    
   uint8_t y=1;
	 uint16_t i;
	 uint8_t x;
 
   for(x=0;x<5;x++)
	{
    
	    i=0;
		  for(y=1;y<9;y++)
		{
    
		   while(read_data)
			 {
    
			    __nop();
			 
			 }
			 delay_us(40);
			  while(!read_data)
			 {
    
			    __nop();
			 
			 }
		    i= i<<1;
			 delay_us(30);
       if(read_data)
			 {
    
			    i |=1;
			 
			 }
			 while(read_data);
		
		
		}
	
	   Rxbuff[x] =i;
	}

}

void DHT11_UpdateData(void)
{
    
  DHT11_GPIO_Init();
	DHT11_Start();
	DHT11_ReceptionBuff();


}



DHT11.h

#ifndef _DHT11_H
#define _DHT11_H

#include "stm32f10x.h"


#define data1  GPIO_SetBits(GPIOB,  GPIO_Pin_11)
#define data0  GPIO_ResetBits(GPIOB,  GPIO_Pin_11)

#define read_data  GPIO_ReadInputDataBit(GPIOB,  GPIO_Pin_11)





void DHT11_GPIO_Init(void);
void DHT11_GPIO_Init1(void);
void DHT11_Start(void);
void DHT11_ReceptionBuff(void);
void DHT11_UpdateData(void);

extern uint16_t Rxbuff[5];




#endif


delay.c(添加到SYSTEM文件夹中)

#include "delay.h"
#include "stm32f10x.h"

void initSysTick(void)
{
    
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频
    SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;            //使能中断
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;             //开定时器
    SysTick->LOAD = 9;                                    //随意设置一个重装载值
}
/**
 * 功能:微秒级延时函数
 * 参数:xus :具体延时时间  (单位:微秒)
 * 返回值:None
 */
void delay_us(u32 xus)
{
    
    SysTick->LOAD = 9 * xus;                               //计9次为1us,xus则重装载值要*9
    SysTick->VAL = 0;                                      //计数器归零
    while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数完成
}
/**
 * 功能:毫秒级延时函数
 * 参数:xms :具体延时时间  (单位:毫秒)
 * 返回值:None
 */
void delay_ms(u32 xms)
{
    
    SysTick->LOAD = 9000;                                      //计9次为1us,1000次为1ms
    SysTick->VAL = 0;                                          //计数器归零
    while (xms--)
    {
    
        while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待单次计数完成
    }
}

delay.h(添加到SYSTEM文件夹中)

#include "stm32f10x.h"

void initSysTick(void);
void delay_us(u32 xus);
void delay_ms(u32 xms);



main.c

#include "stm32f10x.h"
#include "main.h"
#include "Shake.h"
#include "Relay.h"
#include "sys.h"
#include "oled.h"
#include "delay.h"
#include "main.h"
#include "DHT11.h"


int main(void)
{
    
	 initSysTick();//系统定时器初始化
	 delay_ms(1500);
	 OLED_Init();
	 OLED_Clear();
	 //OLED_ShowChar(30,2,'o');
	 //OLED_ShowChar(38,2,'k');//显示字符
	
	 //OLED_ShowString(30,4,"123");//显示字符串
	
	 OLED_ShowChinese(0,2,6);//当
	 OLED_ShowChinese(16,2,7);//前
   OLED_ShowChinese(32,2,8);//温 
   OLED_ShowChinese(48,2,9);//度
	 OLED_ShowChinese(66,2,10);//:
	 OLED_ShowChinese(90,2,15);//.
   OLED_ShowChinese(112,2,11);//C
	
	 OLED_ShowChinese(16,5,6);//当
	 OLED_ShowChinese(32,5,7);//前
   OLED_ShowChinese(48,5,12);//湿 
   OLED_ShowChinese(64,5,9);//度
   OLED_ShowChinese(80,5,10);//:
	 OLED_ShowChinese(112,5,13);//.
   
    	 

	 while(1)
	 {
    
		  /*OLED_ShowChinese(0,2,6); //显示文字
		  OLED_ShowChinese(16,2,7);
		  OLED_ShowChinese(32,2,8);
		  OLED_ShowChinese(48,2,9); */
		 
		  uint16_t i;
		  uint8_t k;
		  uint8_t kk;
		  uint8_t kkk;
		  DHT11_UpdateData();
		 
		  i= Rxbuff[0]+ Rxbuff[1]+ Rxbuff[2]+ Rxbuff[3];
		  if(Rxbuff[4]==i)
			{
    
					k=Rxbuff[2];
				  kk=Rxbuff[0];
				  kkk=Rxbuff[3];
			    OLED_ShowNum(74,2,k/10,3,3);
				  OLED_ShowNum(82,2,k%10,3,3);
				  OLED_ShowNum(98,2,kkk,3,3);
				  OLED_ShowNum(88,5,kk/10,3,3);
				  OLED_ShowNum(98,5,kkk%10,3,3);
			    delay_ms(2000);
    
	 }
  }
}








版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_72921448/article/details/127600533

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签