逆向学习物联网-感知层设计-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 |