一、0.96寸 OLED 模块简介
0.96寸 OLED(128×64分辨率)模块,128×64分辨率即 OLED 显示横坐标有 128 个像素格,纵
坐标有 64 个像素格,但是由于 OLED 不能一次控制一个点阵,只能控制 8 个点阵,而且是垂直方
向扫描控制,因此垂直方向坐标可选为 0~7 页(一页 8 个像素格),水平方向可选坐标 0~128。
一般一个中文字体占 16×16 个像素格,字母以及符号占 8×16 个像素格。
二、0.96 寸 OLED 模块接口定义:
SPI接口模块:(更快)
SPI接口一般使用四条信号线通信:
SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)
1、GND 电源地
2、VCC 电源正(3~5.5V)
3、D0 OLED 的 D0 脚,在 SPI通信中为时钟管脚
4、D1 OLED 的 D1 脚,在 SPI通信中为数据管脚
5、CS OLED 的 CS 管脚,片选管脚
6、DC OLED 的 D/C 管脚,数据和命令控制管脚
7、RES OLED 的 RES 管脚,用于复位(低电平)
IIC接口模块:
IIC接口一般使用两条信号线通信:SCL(时钟线),SDA(数据线)
1、GND 电源地
2、VCC 电源正(3~5.5V)
3、SDA OLED 的 D1 脚,在IIC 通信中为数据管脚
4、SCL OLED 的 D0 脚,在IIC 通信中为时钟管脚
三、OLED显示汉字
void OLED_ShowChinese(u8_t x, u8_t y, u8_t no);
使用取字模软件显示汉字:PCtoLCD2002
教你如何用PCtoLCD2002生成字模以及软件的下载_pctolcd2002生成字模下载-CSDN博客
四、SPI&IIC代码修改
1、OLED 驱动库中常用的函数
void OLED_Init(void); // OLED 初始化函数
void OLED_Clear(void); // OLED 清屏函数
void OLED_ShowString(u8_t x, u8_t y, u8_t *char); // 显示英文字符串函数
void OLED_ShowChinese(u8_t x, u8_t y, u8_t no); // 显示中文字符串函数
void OLED_DrawBMP(u8_t x0, u8_t y0, u8_t x1, u8_t y1, u8_t BMP[]); // 显示图片函数
2、main.c中修改使用
//OLED初始化
OLED_Init();
OLED_display_info();
extern unsigned char BMP1[];
//OLED显示函数
void OLED_display_info()
{
OLED_Clear(); //清屏
OLED_ShowString(0, 0, (uint8_t *)"CSDNds"); //显示字符串
OLED_ShowCHinese(40, 0, 0); //显示汉字
OLED_ShowCHinese(80, 0, 1);
OLED_DrawBMP(70, 1, 120, 6, BMP0); //显示图片
}
五、OLED可移植.c
OLED.c
#include "OLED_Font.h"
#include "gpio.h"
/*引脚配置*/
//#define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))//Change
//#define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))//Change
void OLED_W_SCL(GPIO_PinState x){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,x);
}
void OLED_W_SDA(GPIO_PinState x){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,x);
}
/*引脚初始化*/
void OLED_I2C_Init(void)
{
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//Change
//GPIO_InitTypeDef GPIO_InitStructure;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//GPIO_Init(GPIOB, &GPIO_InitStructure);
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//GPIO_Init(GPIOB, &GPIO_InitStructure);
MX_GPIO_Init();
OLED_W_SCL(1);
OLED_W_SDA(1);
}
/**
* @brief //I2C开始
* @param //无
* @retval //无
*/
void OLED_I2C_Start(void)
{
OLED_W_SDA(1);
OLED_W_SCL(1);
OLED_W_SDA(0);
OLED_W_SCL(0);
}
/**
* @brief //I2C停止
* @param //无
* @retval// 无
*/
void OLED_I2C_Stop(void)
{
OLED_W_SDA(0);
OLED_W_SCL(1);
OLED_W_SDA(1);
}
/**
* @brief I2C发送一个字节
* @param Byte 要发送的一个字节
* @retval 无
*/
void OLED_I2C_SendByte(uint8_t Byte)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
OLED_W_SDA(Byte & (0x80 >> i));
OLED_W_SCL(1);
OLED_W_SCL(0);
}
OLED_W_SCL(1); //额外的一个时钟,不处理应答信号
OLED_W_SCL(0);
}
/**
* @brief OLED写命令
* @param Command 要写入的命令
* @retval 无
*/
void OLED_WriteCommand(uint8_t Command)
{
OLED_I2C_Start();
OLED_I2C_SendByte(0x78); //从机地址
OLED_I2C_SendByte(0x00); //写命令
OLED_I2C_SendByte(Command);
OLED_I2C_Stop();
}
/**
* @brief OLED写数据
* @param Data 要写入的数据
* @retval 无
*/
void OLED_WriteData(uint8_t Data)
{
OLED_I2C_Start();
OLED_I2C_SendByte(0x78); //从机地址
OLED_I2C_SendByte(0x40); //写数据
OLED_I2C_SendByte(Data);
OLED_I2C_Stop();
}
/**
* @brief OLED设置光标位置
* @param Y 以左上角为原点,向下方向的坐标,范围:0~7
* @param X 以左上角为原点,向右方向的坐标,范围:0~127
* @retval 无
*/
void OLED_SetCursor(uint8_t Y, uint8_t X)
{
OLED_WriteCommand(0xB0 | Y); //设置Y位