一、0.96寸OLED显示屏及调试
二、常用函数
函数 | 解释 |
OLED_Init(); | 初始化函数 |
OLED_Clear(); | 清屏 |
OLED_Showchar(1,2,'A') | 第1行,第2列,显示字符‘A’ |
OLED_ShowString(1,3,"Hello World!") | 第1行,第3列,显示字符串“Hello World!” |
OLE_ShowNum(2,1,12345,5) | 第2行,第3列,显示十进制数字12345,显示数字长度为5,若显示长度为4,则只会显示1234,长度范围:1~10 |
OLE_ShowSignedNum(2,7,-45,2) | 第2行,第7列,显示有符号十进制数字-45,显示数字长度为2,长度范围:1~10 |
OLE_ShowHexNum(3,1,0xABCD,4) | 第3行,第1列,显示十六进制数字ABCD,长度范围:1~8 |
OLE_ShowBinNum(4,1,0xDCBA,4) | 第4行,第1列,显示十六进制数字DCBA,长度范围:1~8 |
硬件接线图:
1.OLED的GND和VCC需要接电源的负极和正极
2.SCL(时钟线连接PB8) SDA(数据线连接PB9)
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使用GPIOB端口
GPIO_InitTypeDef GPIO_InitStructure; //建立GPIO的结构体,用于储存GPIO_InitStructure的 配置信息(mode模式 pin端口 speed速度 )
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;// 通用推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9; //选择GPIOB 8和9脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//串口速度
GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIO_B配置完成
}
三、OLED的相关函数
OLED的相关使用函数,常用函数中可了解
#include "stm32f10x.h"
#include "OLED_Font.h"
/*需要更改的只有'引脚配置'和'引脚初始化'*/
/*引脚配置, 选择的是你硬件电路把SCL和SDA这两个引脚接在了哪两个端口*/
#define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))
#define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))
/*引脚初始化*/
void OLED_I2C_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
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);
OLED_W_SCL(1);
OLED_W_SDA(1);
}
//下面为 I2C通信的基本时序 和后面OLED用户调用的代码
/**
* @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位置
OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4)); //设置X位置高4位
OLED_WriteCommand(0x00 | (X & 0x0F)); //设置X位置低4位
}
/**
* @brief OLED清屏
* @param 无
* @retval 无
*/
void OLED_Clear(void)
{
uint8_t i, j;
for (j = 0; j < 8; j++)
{
OLED_SetCursor(j, 0);
for(i = 0; i < 128; i++)
{
OLED_WriteData(0x00);
}
}
}
/**
* @brief OLED显示一个字符
* @param Line 行位置,范围:1~4
* @param Column 列位置,范围:1~16
* @param Char 要显示的一个字符,范围:ASCII可见字符
* @retval 无
*/
voi