基于STM32F103C8T6的IIC通信协议和OLED温度显示项目详解

#一、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);
        
    	 }
      }
    }
    
    
    
    
    
    
    
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于STM32F103C8T6的IIC通信协议和OLED温度显示项目详解

    发表评论