逆向学习物联网-感知层设计-06GPIO宏,DHT11,LAMP,OLED驱动程序设计

 

 1.0      GPIO宏定义 sys.h

#ifndef _SYS_H
#define _SYS_H
#include "stm32f1xx_hal.h"

//////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////
//定义一些常用的数据类型短关键字
typedef int32_t  s32;
typedef int16_t s16;
typedef int8_t  s8;

typedef const int32_t sc32;
typedef const int16_t sc16;
typedef const int8_t sc8;

typedef __IO int32_t  vs32;
typedef __IO int16_t  vs16;
typedef __IO int8_t   vs8;

typedef __I int32_t vsc32;
typedef __I int16_t vsc16;
typedef __I int8_t vsc8;

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

typedef const uint32_t uc32;
typedef const uint16_t uc16;
typedef const uint8_t uc8;

typedef __IO uint32_t  vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t  vu8;

typedef __I uint32_t vuc32;
typedef __I uint16_t vuc16;
typedef __I uint8_t vuc8;


//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入



#endif

 

 

1.1    Drv_delay驱动程序设计

 

Drv_Delay.h

#ifndef _DELAY_H

#define _DELAY_H

 

 

void delay_us(uint16_t nus);

void delay_ms(u32 nms);

#endif

Drv_Delay.c

#include "main.h"

#include "sys.h"

#include "tim.h"

 

#include "drv_delay.h"

 

 

uint32_t gg_time = 0;

 

 

//延时nus

//nus为要延时的us数.

//nus:0~65535

#define DLY_TIM_Handle (&htim2)

void delay_us ( uint16_t nus )

{

    __HAL_TIM_SET_COUNTER ( DLY_TIM_Handle, 0 );

    __HAL_TIM_ENABLE ( DLY_TIM_Handle );

    while ( __HAL_TIM_GET_COUNTER ( DLY_TIM_Handle ) < nus )

    {

    }

    __HAL_TIM_DISABLE ( DLY_TIM_Handle );

}

 

 

void delay_ms ( u32 nms )

{

    u32 i;

    for ( i = 0; i < nms; i++ )

    {

        delay_us ( 1000 );

    }

}

 

3)验证程序

 

void mytest()

{

              DHT11_IO_OUT();        //设置为输出

              while(1)

              {

                     DHT11_DQ_OUT = 0; //拉低DQ

                     delay_ms ( 20 );         //拉低至少18ms

                     DHT11_DQ_OUT = 1; //DQ=1

                    

                     delay_ms ( 20 );         //拉低至少18ms

             

                    

              }

}

 

 

 

 

1.2    Drv_Lamp灯驱动程序设计

 

1)在drv_lamp.C中增加程序代码

 

 

#include "main.h"

#include "sys.h"

#include "tim.h"

#include "drv_delay.h"

 

#define PIN_LAMP   PAout(1)

static int gg_Lamp;

 

void Lamp_Set ( int on1off0 )

{

    PIN_LAMP = on1off0;

 

    //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,(GPIO_PinState)on1off0);

 

    gg_Lamp = on1off0;

}

 

int Lamp_Get ( void )

{

    return gg_Lamp;

}

 

 

2) 在drv_lamp.h中增加代码

 

#ifndef __LAMP_H

#define __LAMP_H

 

void Lamp_Set ( int on1off0 );

int Lamp_Get ( void );

 

 

#endif

 

 

1.3    Drv_DHT11驱动程序设计

1)      Drv_dht11.c

 

#include "main.h"

#include "tim.h"

#include "sys.h"

 

#include "drv_delay.h"

#include "drv_dht11.h"

 

 

////IO操作函数

#define  DHT11_DQ_OUT    PBout(7)//数据端口 PB12

#define  DHT11_DQ_IN     PBin(7) //数据端口    PB12

 

 

void DHT11_IO_IN ( void )

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

 

    GPIO_InitStruct.Pin = GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init ( GPIOB, &GPIO_InitStruct );

}

void DHT11_IO_OUT ( void )

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

 

    GPIO_InitStruct.Pin = GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init ( GPIOB, &GPIO_InitStruct );

}

 

void mytest()

{

    DHT11_IO_OUT();        //设置为输出

    while ( 1 )

    {

        DHT11_DQ_OUT = 0; //拉低DQ

        delay_ms ( 20 );         //拉低至少18ms

        DHT11_DQ_OUT = 1; //DQ=1

 

        delay_ms ( 20 );         //拉低至少18ms

 

 

    }

}

 

 

//复位DHT11

void DHT11_Rst ( void )

{

    DHT11_IO_OUT();        //设置为输出

    DHT11_DQ_OUT = 0; //拉低DQ

    delay_ms ( 20 );         //拉低至少18ms

    DHT11_DQ_OUT = 1; //DQ=1

    delay_us ( 30 );         //主机拉高20~40us

}

 

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

u8 DHT11_Check ( void )

{

    u8 retry = 0;

    DHT11_IO_IN();      //设置为输出

    while ( DHT11_DQ_IN && retry < 100 ) //DHT11会拉低40~80us

    {

        retry++;

        delay_us ( 1 );

    };

    if ( retry >= 100 )

    {

        return 1;

    }

    else

    {

        retry = 0;

    }

    while ( !DHT11_DQ_IN && retry < 100 ) //DHT11拉低后会再次拉高40~80us

    {

        retry++;

        delay_us ( 1 );

    };

    if ( retry >= 100 )

    {

        return 1;

    }

    return 0;

}

 

//从DHT11读取一个位

//返回值:1/0

u8 DHT11_Read_Bit ( void )

{

    u8 retry = 0;

    while ( DHT11_DQ_IN && retry < 100 ) //等待变为低电平

    {

        retry++;

        delay_us ( 1 );

    }

    retry = 0;

    while ( !DHT11_DQ_IN && retry < 100 ) //等待变高电平

    {

        retry++;

        delay_us ( 1 );

    }

    delay_us ( 40 ); //等待40us

    if ( DHT11_DQ_IN )

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

 

//从DHT11读取一个字节

//返回值:读到的数据

u8 DHT11_Read_Byte ( void )

{

    u8 i, dat;

    dat = 0;

    for ( i = 0; i < 8; i++ )

    {

        dat <<= 1;

        dat |= DHT11_Read_Bit();

    }

    return dat;

}

 

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

u8 DHT11_Read_Data ( u8 *temperature, u8 *humidity )

{

    u8 buf[5];

    u8 i;

    DHT11_Rst();

    if ( DHT11_Check() == 0 )

    {

        for ( i = 0; i < 5; i++ ) //读取40位数据

        {

            buf[i] = DHT11_Read_Byte();

        }

        if ( ( buf[0] + buf[1] + buf[2] + buf[3] ) == buf[4] )

        {

            *humidity = buf[0];

            *temperature = buf[2];

        }

    }

    else

    {

        return 1;

    }

    return 0;

}

 

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在

u8 DHT11_Init ( void )

{

 

    DHT11_Rst();

    return DHT11_Check();

}

 

 

2)drv_dht11.h

 

#ifndef __DHT11_H

#define __DHT11_H

 

 

u8 DHT11_Init ( void ); //初始化DHT11

u8 DHT11_Read_Data ( u8 *temp, u8 *humi ); //读取温湿度

 

 

#endif

 

 

1.1    OLED驱动程序设计

1)      定义字库文件

#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

};

unsigned char  Hzk[][32] =

{

 

    {0x00, 0x00, 0xF0, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00},

    {0x00, 0x00, 0x0F, 0x04, 0x04, 0x04, 0x04, 0xFF, 0x04, 0x04, 0x04, 0x04, 0x0F, 0x00, 0x00, 0x00}, /*"中",0*/

 

    {0x40, 0x40, 0x40, 0x5F, 0x55, 0x55, 0x55, 0x75, 0x55, 0x55, 0x55, 0x5F, 0x40, 0x40, 0x40, 0x00},

    {0x00, 0x40, 0x20, 0x0F, 0x09, 0x49, 0x89, 0x79, 0x09, 0x09, 0x09, 0x0F, 0x20, 0x40, 0x00, 0x00}, /*"景",1*/

 

    {0x00, 0xFE, 0x02, 0x42, 0x4A, 0xCA, 0x4A, 0x4A, 0xCA, 0x4A, 0x4A, 0x42, 0x02, 0xFE, 0x00, 0x00},

    {0x00, 0xFF, 0x40, 0x50, 0x4C, 0x43, 0x40, 0x40, 0x4F, 0x50, 0x50, 0x5C, 0x40, 0xFF, 0x00, 0x00}, /*"园",2*/

 

    {0x00, 0x00, 0xF8, 0x88, 0x88, 0x88, 0x88, 0xFF, 0x88, 0x88, 0x88, 0x88, 0xF8, 0x00, 0x00, 0x00},

    {0x00, 0x00, 0x1F, 0x08, 0x08, 0x08, 0x08, 0x7F, 0x88, 0x88, 0x88, 0x88, 0x9F, 0x80, 0xF0, 0x00}, /*"电",3*/

 

    {0x80, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xE2, 0xA2, 0x92, 0x8A, 0x86, 0x82, 0x80, 0x80, 0x00},

    {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"子",4*/

 

    {0x24, 0x24, 0xA4, 0xFE, 0xA3, 0x22, 0x00, 0x22, 0xCC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00},

    {0x08, 0x06, 0x01, 0xFF, 0x00, 0x01, 0x04, 0x04, 0x04, 0x04, 0x04, 0xFF, 0x02, 0x02, 0x02, 0x00}, /*"科",5*/

 

    {0x10, 0x10, 0x10, 0xFF, 0x10, 0x90, 0x08, 0x88, 0x88, 0x88, 0xFF, 0x88, 0x88, 0x88, 0x08, 0x00},

    {0x04, 0x44, 0x82, 0x7F, 0x01, 0x80, 0x80, 0x40, 0x43, 0x2C, 0x10, 0x28, 0x46, 0x81, 0x80, 0x00}, /*"技",6*/

 

};

#endif

 

 

 

2)      定义drv_oled.c

#include "main.h"

 

#include "i2c.h"

 

#include "stdlib.h"

#include "sys.h"

 

#include "drv_oled.h"

 

#include "drv_delay.h"

#include "drv_oledfont.h"

 

 

#define OLED_CMD  0       //写命令

#define OLED_DATA 1 //写数据

#define OLED_MODE 0

 

#define Max_Column  128

#define Max_Row        64

#define X_WIDTH        128

#define Y_WIDTH        64

 

 

#define ADDR_OLED_Write  0x78

#define ADDR_OLED_Read   0x79

 

 

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

 

/**********************************************

// IIC Write Command

**********************************************/

//UINT8 I2SendStr(UINT8 sla,UINT16 suba,UINT8 *s,UINT16 no,UINT8 flag) ;

void Write_IIC_Command ( unsigned char IIC_Command )

{

    u8 s[2];

    s[0] = IIC_Command;

 

    HAL_I2C_Mem_Write ( &hi2c1, ADDR_OLED_Write, 0x00, I2C_MEMADD_SIZE_8BIT, &s[0], 1, 1000 );

 

 

}

/**********************************************

// IIC Write Data

**********************************************/

void Write_IIC_Data ( unsigned char IIC_Data )

{

    u8 s[2];

    s[0] = IIC_Data;

 

    HAL_I2C_Mem_Write ( &hi2c1, ADDR_OLED_Write, 0x40, I2C_MEMADD_SIZE_8BIT, &s[0], 1, 1000 );

 

 

 

}

void OLED_WR_Byte ( unsigned dat, unsigned cmd )

{

    if ( cmd )

    {

        Write_IIC_Data ( dat );

    }

    else

    {

        Write_IIC_Command ( dat );

    }

}

 

//坐标设置

void OLED_Set_Pos ( unsigned char x, unsigned char y )

{

    OLED_WR_Byte ( 0xb0 + y, OLED_CMD );

    OLED_WR_Byte ( ( ( x & 0xf0 ) >> 4 ) | 0x10, OLED_CMD );

    OLED_WR_Byte ( ( x & 0x0f ), OLED_CMD );

}

//开启OLED显示

void OLED_Display_On ( void )

{

    OLED_WR_Byte ( 0X8D, OLED_CMD ); //SET DCDC命令

    OLED_WR_Byte ( 0X14, OLED_CMD ); //DCDC ON

    OLED_WR_Byte ( 0XAF, OLED_CMD ); //DISPLAY ON

}

//关闭OLED显示

void OLED_Display_Off ( void )

{

    OLED_WR_Byte ( 0X8D, OLED_CMD ); //SET DCDC命令

    OLED_WR_Byte ( 0X10, OLED_CMD ); //DCDC OFF

    OLED_WR_Byte ( 0XAE, OLED_CMD ); //DISPLAY OFF

}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!

void OLED_Clear ( void )

{

    u8 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 );

        }

    } //更新显示

}

void OLED_On ( void )

{

    u8 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 ( 1, OLED_DATA );

        }

    } //更新显示

}

//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示

//size:选择字体 16/12

void OLED_ShowChar ( u8 x, u8 y, u8 chr, u8 Char_Size )

{

    unsigned char c = 0, i = 0;

 

    c = chr - ' '; //得到偏移后的值

 

    if ( x > Max_Column - 1 )

    {

        x = 0;

        y = y + 2;

    }

 

    if ( Char_Size == 16 )

    {

        OLED_Set_Pos ( x, y );

        for ( i = 0; i < 8; i++ )

        {

            OLED_WR_Byte ( F8X16[c * 16 + i], OLED_DATA );

        }

        OLED_Set_Pos ( x, y + 1 );

        for ( i = 0; i < 8; i++ )

        {

            OLED_WR_Byte ( F8X16[c * 16 + i + 8], OLED_DATA );

        }

    }

    else

    {

        OLED_Set_Pos ( x, y );

        for ( i = 0; i < 6; i++ )

        {

            OLED_WR_Byte ( F6x8[c][i], OLED_DATA );

        }

    }

}

//m^n函数

u32 oled_pow ( u8 m, u8 n )

{

    u32 result = 1;

    while ( n-- )

    {

        result *= m;

    }

    return result;

}

//显示2个数字

//x,y :起点坐标

//len :数字的位数

//size:字体大小

//mode:模式 0,填充模式;1,叠加模式

//num:数值(0~4294967295);

void OLED_ShowNum ( u8 x, u8 y, u32 num, u8 len, u8 size2 )

{

    u8 t, temp;

    u8 enshow = 0;

    for ( t = 0; t < len; t++ )

    {

        temp = ( num / oled_pow ( 10, len - t - 1 ) ) % 10;

        if ( enshow == 0 && t < ( len - 1 ) )

        {

            if ( temp == 0 )

            {

                OLED_ShowChar ( x + ( size2 / 2 ) *t, y, ' ', size2 );

                continue;

            }

            else

            {

                enshow = 1;

            }

 

        }

        OLED_ShowChar ( x + ( size2 / 2 ) *t, y, temp + '0', size2 );

    }

}

//显示一个字符号串

void OLED_ShowString ( u8 x, u8 y, u8 *chr, u8 Char_Size )

{

    unsigned char j = 0;

    while ( chr[j] != '\0' )

    {

        OLED_ShowChar ( x, y, chr[j], Char_Size );

        x += 8;

        if ( x > 120 )

        {

            x = 0;

            y += 2;

        }

        j++;

    }

}

//显示汉字

void OLED_ShowCHinese ( u8 x, u8 y, u8 no )

{

    u8 t, adder = 0;

    OLED_Set_Pos ( x, y );

    for ( t = 0; t < 16; t++ )

    {

        OLED_WR_Byte ( Hzk[2 * no][t], OLED_DATA );

        adder += 1;

    }

    OLED_Set_Pos ( x, y + 1 );

    for ( t = 0; t < 16; t++ )

    {

        OLED_WR_Byte ( Hzk[2 * no + 1][t], OLED_DATA );

        adder += 1;

    }

}

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/

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_Set_Pos ( x0, y );

        for ( x = x0; x < x1; x++ )

        {

            OLED_WR_Byte ( BMP[j++], OLED_DATA );

        }

    }

}

 

//初始化SSD1306

void OLED_Init ( void )

{

 

    OLED_WR_Byte ( 0xAE, OLED_CMD ); //--display off

    OLED_WR_Byte ( 0x00, OLED_CMD ); //---set low column address

    OLED_WR_Byte ( 0x10, OLED_CMD ); //---set high column address

    OLED_WR_Byte ( 0x40, OLED_CMD ); //--set start line address

    OLED_WR_Byte ( 0xB0, OLED_CMD ); //--set page address

    OLED_WR_Byte ( 0x81, OLED_CMD ); // contract control

    OLED_WR_Byte ( 0xFF, OLED_CMD ); //--128

    OLED_WR_Byte ( 0xA1, OLED_CMD ); //set segment remap

    OLED_WR_Byte ( 0xA6, OLED_CMD ); //--normal / reverse

    OLED_WR_Byte ( 0xA8, OLED_CMD ); //--set multiplex ratio(1 to 64)

    OLED_WR_Byte ( 0x3F, OLED_CMD ); //--1/32 duty

    OLED_WR_Byte ( 0xC8, OLED_CMD ); //Com scan direction

    OLED_WR_Byte ( 0xD3, OLED_CMD ); //-set display offset

    OLED_WR_Byte ( 0x00, OLED_CMD ); //

 

    OLED_WR_Byte ( 0xD5, OLED_CMD ); //set osc division

    OLED_WR_Byte ( 0x80, OLED_CMD ); //

 

    OLED_WR_Byte ( 0xD8, OLED_CMD ); //set area color mode off

    OLED_WR_Byte ( 0x05, OLED_CMD ); //

 

    OLED_WR_Byte ( 0xD9, OLED_CMD ); //Set Pre-Charge Period

    OLED_WR_Byte ( 0xF1, OLED_CMD ); //

 

    OLED_WR_Byte ( 0xDA, OLED_CMD ); //set com pin configuartion

    OLED_WR_Byte ( 0x12, OLED_CMD ); //

 

    OLED_WR_Byte ( 0xDB, OLED_CMD ); //set Vcomh

    OLED_WR_Byte ( 0x30, OLED_CMD ); //

 

    OLED_WR_Byte ( 0x8D, OLED_CMD ); //set charge pump enable

    OLED_WR_Byte ( 0x14, OLED_CMD ); //

 

    OLED_WR_Byte ( 0xAF, OLED_CMD ); //--turn on oled panel

 

    OLED_Clear()       ;

}

 

 

void oled_test ( void )

{

    //???OLED

    OLED_Clear()       ;

 

 

    OLED_ShowCHinese ( 0, 0, 0 ); //?

    OLED_ShowCHinese ( 18, 0, 1 ); //?

    OLED_ShowCHinese ( 36, 0, 2 ); //?

    OLED_ShowCHinese ( 54, 0, 3 ); //?

    OLED_ShowCHinese ( 72, 0, 4 ); //?

    OLED_ShowCHinese ( 90, 0, 5 ); //?

    OLED_ShowCHinese ( 108, 0, 6 ); //?

 

    OLED_ShowString ( 0, 2, ( u8 * ) "2017.06.18 20:28", 16 );

 

}

 

 

 

3)      定义drv_oled.h

#ifndef __OLED_H

#define __OLED_H

 

 

//OLED控制用函数

extern void OLED_Init ( void );

 

extern void OLED_Display_On ( void );

extern void OLED_Display_Off ( void );

 

extern void OLED_Clear ( void );

 

 

extern void OLED_ShowChar ( u8 x, u8 y, u8 chr, u8 Char_Size );

extern void OLED_ShowNum ( u8 x, u8 y, u32 num, u8 len, u8 size );

extern void OLED_ShowString ( u8 x, u8 y, u8 *p, u8 Char_Size );

extern void OLED_ShowCHinese ( u8 x, u8 y, u8 no );

extern void OLED_DrawBMP ( unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[] );

 

extern void oled_test ( void );

 

 

#endif

posted @ 2021-11-03 23:26  cqmcu_yth  阅读(116)  评论(0编辑  收藏  举报