引言
本来我是不打算说OLED这个外设的,但我发现好多教程只是在教你原理,而不教你如何构建库。也正是这个原因出现了很多C/V工程师。
目的
在这个章节中我会让你知道这个库如何建立,为什么要这么建立,我自己的库我该如何使用!
注意
当你了解IIC协议,OLED工作原理后再去看!不了解你甚至都不知道在干什么!
一个合格的OLED库
OLED初始化
void OLED_GPIO_Init(void)
{
uint32_t i, j;
for (i = 0; i < 1000; i ++)
{
for (j = 0; j < 1000; j ++);
}
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_6;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
首先解决第一个问题,为什么我要写一个循环,因为在某些硬件上,当OLED或其他设备刚上电时,需要一些时间让其稳定工作。因此,加入这样的延时可以确保在初始化GPIO之前,OLED或其他设备已经准备好。(其实是在给OLED上的VCC引脚充足的时间为其供电)但请注意,这种延时方式并不是最精确的,并且其实际延时时间取决于CPU的速度和编译器优化。但对于我们小工程来说完全可以了哈!
IIC协议设定
void OLED_W_SCL(uint8_t BitValue)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)BitValue);
}
void OLED_W_SDA(uint8_t BitValue)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)BitValue);
}
IIC协议就是控制SCL,SDA两线程的高低电平变化从而达到控制数据的收发功能。所以IIC对高低电平的控制函数就OLED库构建的地基。OLED所有显示函数都少不了对SCL,SDA电平的控制。
具体我就不说了,明天我会主要讲讲IIC协议。
直接看代码!
GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)BitValue);我觉得大家应该都知道,这其实就是将(BitAction)BitValue写入GPIOB的引脚6。这里的问题就是(BitAction)BitValue是什么意思。
(BitAction)BitValue
这里将BitValue
强制转换为BitAction
枚举类型。BitAction
是一个枚举类型,通常定义在STM32的GPIO库中,它有两个可能的值:Bit_RESET
(通常为0)和Bit_SET
(通常为1)。
直接看我们的固件库。
typedef enum
{ Bit_RESET = 0,
Bit_SET
}BitAction;
含义是设定一个枚举类型,名字叫BitAction。它的取值分为0(Bit_RESET)/1(Bit_SET)。
所以说,我这样使用OLED_W_SCL(1)意思就是将SCL拉成高电平!下一个操作SDA的函数同理。