STM32 IIC协议与OLED屏幕通信驱动
最近,一直在搞stm32开发板,今天涉及到了OLED屏幕与IIC协议,记录一下学习过程。
I2C总线是一种总线标准,由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据,是一种半双工通信协议。总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机。I2C器件一般采用开漏结构与总线相连,所以I2C_SCL和I2C_SDA均需接上拉电阻,也正因此,当总线空闲时,这两条线路都处于高电平状态,当连到总线上的任一器件输出低电平,都将使总线拉低。
关于具体的读写操作见IIC通信协议_白码王子小张的博客-CSDN博客
关于IIC。
具体代码如下所示(用软件模拟IIC,没有IIC硬件(AT24C02))。
#ifndef __OLED_H
#define __OLED__H
#include "system.h"
#include <inttypes.h>
#define OLED_ADDRESS 0x78 //默认0x78
//定义IIC总线连接的GPIO端口, 用户只需要修改下面代码即可任意改变SCL和SDA的引脚
#define OLED_SCL PBout(6) //SCL引脚
#define OLED_SDA PBout(7) //SDA引脚
#define OLED_SCL_GPIO_PORT GPIOB /* GPIO端口 */
#define OLED_SCL_RCC RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define OLED_SCL_PIN GPIO_Pin_6 /* 连接到SCL时钟线的GPIO */
#define OLED_SDA_GPIO_PORT GPIOB /* GPIO端口 */
#define OLED_SDA_RCC RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define OLED_SDA_PIN GPIO_Pin_7 /* 连接到SDA数据线的GPIO */
#define OLED_IIC_SDA_READ() GPIO_ReadInputDataBit(OLED_SDA_GPIO_PORT, OLED_SDA_PIN) /* 读SDA口线状态 */
extern unsigned int HZ;
unsigned int GB16_NUM(void);
void IIC_GPIO_Config(void);
void IIC_Start(void);
void IIC_Stop(void);
uint8_t IIC_WaitAck(void);
void Write_IIC_Byte(uint8_t _ucByte);
void Write_IIC_Command(u8 IIC_Command);
void OLED_Fill(u8 fill_Data);
void OLED_Set_Pos(u8 x, u8 y);
void OLED_ON(void);
void OLED_OFF(void);
void OLED_Clear(void);
void OLED_ShowChar(u8 x, u8 y, u8 chr);
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 mode);
void OLED_ShowCH(u8 x, u8 y, u8 *chs);
void OLED_Init(void);
void OLED_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1, u8 BMP[]);
#endif
#include "stm32f10x.h"
/**********16*16的点阵字体取模方式:共阴——列行式——逆向输出*********/
/****************************************8*16的点阵************************************/
unsigned char zf[]=
{
/******符号*****/
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,0x00,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
/******A-Z*****/
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
/******a-b*****/
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,0x02,0x01,0x02,0x02,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
unsigned char hz[]={
0x00,0x00,0xFE,0x12,0x92,0xB2,0xD2,0x92,0x92,0x92,0xD2,0xB2,0x9E,0x00,0x00,0x00,
0x40,0x30,0x0F,0x04,0x84,0x64,0x1F,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x00,0x00,//屏
0x00,0x02,0x02,0xFA,0xAA,0xAF,0xAA,0xAA,0xAA,0xAF,0xAA,0xFA,0x02,0x02,0x00,0x00,
0x12,0x12,0x0A,0x7E,0x0A,0x0B,0x0A,0xFE,0x0A,0x2A,0x4A,0x3E,0x0A,0x12,0x12,0x00,//幕
0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
0x40,0x42,0x44,0x58,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x50,0x48,0x46,0x40,0x00,//显
0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00,
0x20,0x10,0x08,0x06,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x02,0x04,0x08,0x30,0x00,//示
0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00,
0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00,//测
0x40,0x40,0x42,0xCC,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x11,0x16,0x10,0x00,
0x00,0x00,0x00,0x3F,0x10,0x28,0x60,0x3F,0x10,0x10,0x01,0x0E,0x30,0x40,0xF0,0x00,//试
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,/*"中"*/
0x04,0x04,0x04,0xC4,0x4F,0x44,0x44,0xF4,0x44,0x44,0x4F,0xC4,0x04,0x04,0x04,0x00,
0x84,0x84,0x44,0x47,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x47,0x44,0x84,0x84,0x00,/*"英"*/
0x08,0x08,0x08,0x38,0xC8,0x08,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x08,0x08,0x00,
0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x40,0x40,0x80,0x80,0x00,/*"文"*/
0x90,0x52,0x34,0x10,0xFF,0x10,0x34,0x52,0x80,0x70,0x8F,0x08,0x08,0xF8,0x08,0x00,
0x82,0x9A,0x56,0x63,0x22,0x52,0x8E,0x00,0x80,0x40,0x33,0x0C,0x33,0x40,0x80,0x00,/*"数"*/
0x10,0x0C,0x04,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x04,0x14,0x0C,0x00,
0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*"字"*/
0x00,0xFE,0x02,0x42,0x22,0x32,0x5E,0x92,0x52,0x32,0x12,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x42,0x42,0x42,0x51,0x55,0x64,0x69,0x41,0x42,0x42,0x42,0xFF,0x00,0x00,/*"图"*/
0x00,0x00,0x00,0xFE,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,/*"片"*/
0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,//温
0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,//湿
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,//度
0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x02,0x00,
0x20,0x3F,0x20,0x1F,0x11,0x11,0x00,0x7F,0x44,0x44,0x44,0x44,0x44,0x47,0x40,0x00,//距
0x04,0x04,0x04,0xF4,0x84,0xD4,0xA5,0xA6,0xA4,0xD4,0x84,0xF4,0x04,0x04,0x04,0x00,
0x00,0xFE,0x02,0x02,0x12,0x3A,0x16,0x13,0x12,0x1A,0x32,0x42,0x82,0x7E,0x00,0x00,//离
0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,//℃
0x80,0x70,0x00,0xFF,0x10,0x08,0xFE,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0xFE,0x00,
0x80,0x60,0x18,0x07,0x08,0x10,0xFF,0x50,0x48,0x46,0x41,0x42,0x4C,0x40,0xFF,0x00,//烟
};
//注意:下面字库声明的汉字顺序必须和取字模的顺序相同,且不能有相同的字
unsigned char hz_index[]={"屏幕显示测试中英文数字图片温湿度距离℃烟"};
char zf_index[]={" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"};
/*****蝴蝶图片*****/
u8 BMP1[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6C,0x7E,0x7A,0x7A,0x7A,0x7A,0x7A,0x74,0x70,0x60,0x60,0xE0,
0xC0,0xC0,0xC0,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,0x80,0x80,0xC0,0xC0,
0xC0,0xE0,0x60,0x60,0x74,0x7E,0x7A,0x7A,0x7A,0x7A,0x7A,0x6C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,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,0xC0,0xC0,0xE0,0xE0,0xF0,
0xF0,0xF8,0xF8,0xF8,0xFC,0xFC,0xFC,0xBE,0xBE,0xFE,0xFE,0xD6,0xDF,0xDF,0xFF,0x7F,
0x7F,0x7F,0xBF,0xFF,0xF7,0xF7,0xFF,0xBF,0x7F,0xFF,0xFE,0xFE,0xEE,0xCE,0xEC,0xFC,
0xFC,0xF8,0xF9,0xB9,0x33,0x73,0x67,0xE6,0xCE,0xCC,0x9C,0x18,0xB0,0xF0,0xE0,0xE0,
0xE0,0xE0,0xE0,0xF0,0x30,0x18,0x9C,0x8C,0xCE,0xE6,0xE7,0x73,0x73,0xB9,0xF9,0xF8,
0xFC,0xFC,0xFC,0xEE,0xCE,0xEE,0xFE,0xFE,0x7F,0xBF,0xFF,0xF7,0xF7,0xFF,0xBF,0x7F,
0x7F,0x7F,0xFF,0xDF,0xDF,0xD7,0xF6,0x7E,0xBE,0xBE,0xFC,0xFC,0xFC,0xF8,0xF8,0xF8,
0xF0,0xF0,0xE0,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xD8,0x9F,0xBF,0xFF,0x7D,0x7D,0xED,0xF3,0xFF,0xFE,0xFF,0xFF,0x76,0x37,0x3B,
0x3F,0x3F,0x3B,0xB9,0xFB,0xDF,0xFF,0xFF,0x3D,0xBE,0xB7,0x77,0x73,0xF7,0xFF,0xFF,
0xFC,0x7F,0x7F,0xF7,0xFE,0x7F,0x7F,0xFF,0xFF,0xF5,0xF3,0x73,0xF7,0xFF,0xFF,0x1F,
0x6D,0x1F,0xFF,0xFF,0xF6,0x77,0xF3,0xF1,0xFF,0xFF,0x7F,0x7F,0xFF,0x73,0x77,0x7F,
0xFC,0xFF,0xFF,0xF7,0x73,0x77,0x37,0xBF,0xBC,0xFF,0xFF,0xDF,0xFB,0xF9,0x3B,0x3F,
0x3F,0x3B,0x37,0x76,0xEF,0xFF,0xFE,0xFF,0xFF,0xE1,0xFD,0x7D,0xFF,0xBF,0x9F,0xD8,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0x0F,0x1F,0x1F,0x1F,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFD,0xBE,0xDB,0xDF,0x9F,
0x3B,0xFB,0xFB,0xF7,0x1F,0xFC,0xF1,0x3F,0xFF,0xFC,0x86,0xB7,0xD3,0x6D,0xED,0xBE,
0xFA,0xFB,0x6D,0xBD,0xF6,0xFB,0x7B,0xBD,0xDD,0xFE,0xFE,0xFE,0xFF,0xFF,0xF0,0x00,
0xF4,0x08,0xF9,0xFF,0xFF,0xFE,0xFE,0x7E,0xDD,0xBD,0x7F,0xFB,0xF6,0xBE,0x6D,0x7B,
0xDB,0xF6,0xF5,0x6D,0xCB,0xFF,0x86,0xFD,0xFE,0x1F,0xF3,0xFC,0x1E,0xE7,0xF7,0xFB,
0x3B,0x9F,0xDF,0xDB,0xBE,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x3F,0x1F,0x1F,0x0F,0x0F,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x07,0x1F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFB,0xF7,0xEF,0xFF,0xFF,0xDF,
0xDC,0xDF,0xDF,0xDF,0xEE,0x77,0xF9,0xFC,0xDF,0xFF,0x6F,0x6F,0x66,0xF3,0xFB,0xDD,
0xCE,0xE6,0x73,0xB9,0x9D,0xCE,0xE7,0xBB,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x06,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xB9,0xF3,0xC6,0x8C,0x19,0x33,0x67,
0xCE,0x9D,0xF9,0xF3,0x67,0x67,0x6D,0x7F,0xDF,0xFC,0xBD,0x7F,0xFF,0xED,0xDF,0xDF,
0xDC,0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x1F,0x0F,0x03,
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,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0xFB,
0xFF,0xFF,0xFF,0xFB,0xFC,0xFF,0xFF,0xFF,0xEE,0xE7,0xE7,0xE7,0x0F,0xFE,0xFC,0xF9,
0xFF,0xFE,0xFD,0xEE,0x67,0xF9,0x7E,0xF7,0xFF,0xCF,0xFF,0xFF,0x01,0xFF,0xFF,0xFE,
0xC0,0xFE,0xFF,0xFF,0x01,0x3F,0xFF,0xEF,0xFF,0xF7,0x6F,0xFD,0xF7,0xEF,0xDD,0xFE,
0xFF,0xB3,0xFD,0xFE,0x8F,0xD7,0xE7,0xE7,0xE6,0xDF,0xFF,0xFF,0xFE,0xF1,0xFF,0xFF,
0xFF,0xFB,0x03,0x03,0x03,0x03,0x03,0x01,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,
0x03,0x0F,0x1F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xE7,0xF7,0xFF,0x8F,0x83,
0xFF,0x7F,0x7F,0xFB,0xFB,0xFB,0xE7,0xFF,0xFE,0xFF,0x3F,0x0C,0x00,0xFF,0xFF,0xFF,
0x03,0xFF,0xFF,0xFF,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xE7,0xFB,0xFB,0xFB,0xFF,0x7F,
0xFF,0x83,0xAF,0xDF,0xFF,0xE7,0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x0F,
0x07,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,0x01,0x03,0x03,0x07,0x0F,0x0F,0x1F,0x1F,0x3F,0x3F,0x7F,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7E,0x7F,0x7F,0x7F,0x3F,0x3F,0x1F,0x07,0x01,
0x00,0x01,0x07,0x0F,0x1F,0x3F,0x7F,0x7F,0x7F,0x7E,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,
0x7F,0x7F,0x3F,0x3F,0x1F,0x1F,0x0F,0x0F,0x07,0x03,0x03,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,
};
#include "oled.h"
#include "SysTick.h"
#include "oledfont.h"
#include "string.h"
unsigned int HZ=0;
//返回GB16字库里汉字个数
unsigned int GB16_NUM(void)
{
unsigned int HZ_NUM;
unsigned char *PT;
PT = hz_index;
while(*PT++ != '\0')
{
HZ_NUM++;
}
return HZ_NUM/2;
}
void IIC_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(OLED_SCL_RCC|OLED_SDA_RCC, ENABLE); /* 打开GPIO时钟 */
GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_Init(OLED_SCL_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = OLED_SDA_PIN;
GPIO_Init(OLED_SDA_GPIO_PORT, &GPIO_InitStructure);
//给一个停止信号, 复位IIC总线上的所有设备到待机模式
IIC_Stop();
}
static void IIC_Delay(void)
{
uint8_t i;
/*
下面的时间是通过逻辑分析仪测试得到的。
工作条件:CPU主频72MHz ,MDK编译环境,1级优化
循环次数为10时,SCL频率 = 205KHz
循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us
循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
*/
for (i = 0; i < 10; i++);
}
/*
*********************************************************************************************************
* 函 数 名: IIC_Start
* 功能说明: CPU发起IIC总线启动信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void IIC_Start(void)
{
/* 当SCL高电平时,SDA出现一个下跳沿表示IIC总线启动信号 */
OLED_SDA=1;
OLED_SCL=1;
IIC_Delay();
OLED_SDA=0;
IIC_Delay();
OLED_SCL=0;
IIC_Delay();
}
/*
*********************************************************************************************************
* 函 数 名: IIC_Start
* 功能说明: CPU发起IIC总线停止信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void IIC_Stop(void)
{
/* 当SCL高电平时,SDA出现一个上跳沿表示IIC总线停止信号 */
OLED_SDA=0;
OLED_SCL=1;
IIC_Delay();
OLED_SDA=1;
}
/*
*********************************************************************************************************
* 函 数 名: IIC_WaitAck
* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
* 形 参:无
* 返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t IIC_WaitAck(void)
{
uint8_t re;
OLED_SDA=1; /* CPU释放SDA总线 */
IIC_Delay();
OLED_SCL=1; /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
IIC_Delay();
if (OLED_IIC_SDA_READ()) /* CPU读取SDA口线状态 */
{
re = 1;
}
else
{
re = 0;
}
OLED_SCL=0;
IIC_Delay();
return re;
}
//向IIC总线写数据,写一个字节
void Write_IIC_Byte(uint8_t _ucByte)
{
uint8_t i;
/* 先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
OLED_SDA=1;
}
else
{
OLED_SDA=0;
}
IIC_Delay();
OLED_SCL=1;
IIC_Delay();
OLED_SCL=0;
if (i == 7)
{
OLED_SDA=1; // 释放总线
}
_ucByte <<= 1; /* 左移一个bit */
IIC_Delay();
}
}
//写命令
void Write_IIC_Command(u8 IIC_Command)
{
IIC_Start();
Write_IIC_Byte(OLED_ADDRESS);//OLED地址
IIC_WaitAck();
Write_IIC_Byte(0x00);//寄存器地址
IIC_WaitAck();
Write_IIC_Byte(IIC_Command);
IIC_WaitAck();
IIC_Stop();
}
//写数据
void Write_IIC_Data(u8 IIC_Data)
{
IIC_Start();
Write_IIC_Byte(OLED_ADDRESS);//OLED地址
IIC_WaitAck();
Write_IIC_Byte(0x40);//寄存器地址
IIC_WaitAck();
Write_IIC_Byte(IIC_Data);
IIC_WaitAck();
IIC_Stop();
}
//OLED全屏填充
void OLED_Fill(u8 fill_Data)
{
u8 m,n;
for(m=0;m<8;m++)
{
Write_IIC_Command(0xb0+m); //page0-page1
Write_IIC_Command(0x00); //low column start address
Write_IIC_Command(0x10); //high column start address
for(n=0;n<130;n++)
{
Write_IIC_Data(fill_Data);
}
}
}
//设置起始点坐标
void OLED_Set_Pos(u8 x, u8 y)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command((((x+2)&0xf0)>>4)|0x10);
Write_IIC_Command(((x+2)&0x0f)|0x01);
}
//将OLED从休眠中唤醒
void OLED_ON(void)
{
Write_IIC_Command(0X8D); //设置电荷泵
Write_IIC_Command(0X14); //开启电荷泵
Write_IIC_Command(0XAF); //OLED唤醒
}
//让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
void OLED_OFF(void)
{
Write_IIC_Command(0X8D); //设置电荷泵
Write_IIC_Command(0X10); //关闭电荷泵
Write_IIC_Command(0XAE); //OLED休眠
}
//清屏
void OLED_Clear(void)
{
OLED_Fill(0x00);
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
void OLED_ShowChar(u8 x, u8 y, u8 chr)
{
u8 c = 0, i = 0;
c = chr - ' '; //得到偏移后的值
if(x > 130 - 1)
{
x = 0;
y = y + 2;
}
OLED_Set_Pos(x, y);
for(i = 0; i < 8; i++)
Write_IIC_Data(zf[c * 16 + i]);
OLED_Set_Pos(x, y + 1);
for(i = 0; i < 8; i++)
Write_IIC_Data(zf[c * 16 + i + 8]);
}
//m^n函数
u32 oled_pow(u8 m, u8 n)
{
u32 result = 1;
while(n--)result *= m;
return result;
}
//显示个数字
//x,y :起点坐标
//len :数字的位数
//num:数值(0~4294967295);
//mode: 为1:显示0 为0:显示空格
//如果检测到数字的开头是多个0,根据mode来判断是不是要修改为空格或者保持不变,如00103,只检测前面的两个0
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len,u8 mode)
{
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)
{
if(mode)
OLED_ShowChar(x + 8*t, y, '0');
else
OLED_ShowChar(x + 8*t, y, ' ');
continue;
}else enshow=1;
}
OLED_ShowChar(x + 8*t, y, temp + '0');
}
}
//显示中英文字符
void OLED_ShowCH(u8 x, u8 y,u8 *chs)
{
u32 i=0;
u32 j;
char* m;
while (*chs != '\0')
{
if (*chs > 0xa0) //汉字内码都是大于0xa0
{
for (i=0 ;i < HZ;i++)
{
if(x>112)
{
x=0;
y=y+2;
}
if ((*chs == hz_index[i*2]) && (*(chs+1) == hz_index[i*2+1]))
{
OLED_Set_Pos(x, y);
for(j=0;j<16;j++)
Write_IIC_Data(hz[i*32+j]);
OLED_Set_Pos(x,y+1);
for(j=0;j<16;j++)
Write_IIC_Data(hz[i*32+j+16]);
x +=16;
break;
}
}
chs+=2;
}
else
{
if(x>122)
{
x=0;
y=y+2;
}
m=strchr(zf_index,*chs);
if (m!=NULL)
{
OLED_Set_Pos(x, y);
for(j = 0; j < 8; j++)
Write_IIC_Data(zf[((u8)*m-' ') * 16 + j]);
OLED_Set_Pos(x, y + 1);
for(j = 0; j < 8; j++)
Write_IIC_Data(zf[((u8)*m-' ') * 16 + j + 8]);
x += 8;
}
chs++;
}
}
}
//初始化SSD1306
void OLED_Init(void)
{
HZ=GB16_NUM();
IIC_GPIO_Config();
Write_IIC_Command(0xAE); //--display off
Write_IIC_Command(0x00); //---set low column address
Write_IIC_Command(0x10); //---set high column address
Write_IIC_Command(0x40); //--set start line address
Write_IIC_Command(0xB0); //--set page address
Write_IIC_Command(0x81); // contract control
Write_IIC_Command(0xFF); //--128
Write_IIC_Command(0xA1); //set segment remap
Write_IIC_Command(0xA6); //--normal / reverse
Write_IIC_Command(0xA8); //--set multiplex ratio(1 to 64)
Write_IIC_Command(0x3F); //--1/32 duty
Write_IIC_Command(0xC8); //Com scan direction
Write_IIC_Command(0xD3); //-set display offset
Write_IIC_Command(0x00); //
Write_IIC_Command(0xD5); //set osc division
Write_IIC_Command(0x80); //
Write_IIC_Command(0xD8); //set area color mode off
Write_IIC_Command(0x05); //
Write_IIC_Command(0xD9); //Set Pre-Charge Period
Write_IIC_Command(0xF1); //
Write_IIC_Command(0xDA); //set com pin configuartion
Write_IIC_Command(0x12); //
Write_IIC_Command(0xDB); //set Vcomh
Write_IIC_Command(0x30); //
Write_IIC_Command(0x8D); //set charge pump enable
Write_IIC_Command(0x14); //
Write_IIC_Command(0xAF); //--turn on oled panel
}
// x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
void OLED_DrawBMP(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])
{
u16 j=0;
u8 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++)
{
Write_IIC_Data(BMP[j++]);
}
}
}
这些时序语句本质就是看图说话,通过利用CPU控制引脚的高低电平,来模拟IIC的通信过程,而不需要IIC硬件接口(AT24C02),有些51单片机就没有硬件接口。
关于OLED屏幕。我用的是四引脚的,用的是IIC通信驱动,即通过IIC协议将OLED与stm32进行通信。
具体连线如下所示。
OLED如何显示汉字。想要显示汉字,需要先创建字库。汉字取模使用PCtoLCD2002完美版,取模时的配置已经标注。
汉字是16*16的形式。在汉字取模工具中得出来表示为两行,每行为16个字节,这样两行也就是16。
汉字取模软件如下图所示。
根据在网上下载的例程的模板,选择对应的模式。
程序如何显示汉字。
这里是直接根据写入的汉字,然后在hz_index[]数组中遍历寻找,所以你要想输出汉字,得现在hz[]和hz_index[]数组中补充。因为一个汉字是占两个字节的,所以,chs和chs+1指向的都是一个汉字中的高低字节。如果在hz_index[]数组中找到了对应的汉字,那就对应地在hz[]数组中找到字节,输出,完成OLED的汉字显示。
附录:
IIC通信协议_白码王子小张的博客-CSDN博客
IIC通信协议 – 为搞钱而写代码 – 博客园 (cnblogs.com)
STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)_stm32 四线oled屏显示例程标准库_小材大用的博客-CSDN博客
STM32外设系列—OLED_stm32 oled_太陈抱不动的博客-CSDN博客(这个看懂,OLED也就懂了)
STM32-OLED屏幕显示教程_stm32 oled_LJX的博客-CSDN博客
嵌入式学习之STM32实现OLED_stm32 oled_Serein1_的博客-CSDN博客
基于STM32进行OLED显示_stm32矩阵键盘输入oled_橙子味的q的博客-CSDN博客
OLED液晶屏如何显示中文呢?_oled显示中文_程序员小哈的博客-CSDN博客
STM32CubeMX驱动OLED屏模块_IIC – 知乎 (zhihu.com)
STM32-OLED屏幕显示教程_stm32 oled_LJX的博客-CSDN博客(很好)
stm32之IIC通讯(详细图解附代码)_stm32 iic_迂回在IT门前的博客-CSDN博客(软件和硬件)
SSD1306(OLED驱动芯片介绍)_光立新的博客-CSDN博客
STM32 0.96寸0.91寸OLED IIC接口_oled地址0x78还是0x3d_CYRIL0124的博客-CSDN博客
12 STM32基础学习– IIC(IO模拟IIC和硬件IIC进行**读写** EEPROM) – 古月居 (guyuehome.com)
作者:小小快刀手