日常在使用STM32做设计时,0.96寸的OLED屏幕是十分常用的显示组件,售价便宜,128*64的像素大小,也能够显示相对较多的内容。
在使用以往的设计库过程中,总结了几点原生库的不足之处。
(1)库文件的IIC驱动函数是共用的标准IIC驱动,若是在同一工程中,使用了多个IIC设备的驱动库,且这些IIC驱动都是独自编写的,则会导致IIC驱动函数重名而无法通过编译,但是只保留其中一份,又可能导致需要对其他库驱动进行修改。增加了工作量,而初学者可能难以从众多驱动代码中完成准确修改。
(2)原先的显示屏初始化文件,引脚没有独立定义,如果所设定的引脚被占用了,则需要在代码中逐一对引脚的初始化以及调用进行修改,这是较为常见的,因为在使用多传感器进行设计时,十分容易出现需要规避引脚的需求。
(3)OLED屏幕在显示ASCII字符时,可以直接调用函数传入字符串,直接显示一大段的内容。但是显示中文时,只能够一个一个显示,并且中文的文字是根据其在字模数组中的位置去写入的,这就到导致了通过看代码无法确定该中文字符究竟是哪个字。修改调试就需要频繁查看字模表,非常不方便。
OLED_ShowCN(i*16+0,2,5,0); // 显示“周”字
unsigned char F16x16[] =
{
0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00,
0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00,/*"周",0*/
}
针对上面的问题,对对驱动库做了一定的增强,主要的改进内容如下,这些改进主要是面向初学者所设定的,需要能够直接调用函数库就实现显示,所以该库则是尽可能简化需要修改的内容,以便做到快速复用。主要改进的内容如下:
(1)IIC引脚宏定义,通过修改总线、时钟、引脚。可直接修改OLED接入STM32的引脚位置。
//修改以下六处,SCL与SDA
#define OLED_SCL_CLK RCC_APB2Periph_GPIOB // SCL
#define OLED_SCL_PORT GPIOB
#define OLED_SCL_PIN GPIO_Pin_12
#define OLED_SDA_CLK RCC_APB2Periph_GPIOB // SDA
#define OLED_SDA_PORT GPIOB
#define OLED_SDA_PIN GPIO_Pin_13
(2)独立IIC驱动,防止与其他库文件发生干扰。以下面两个函数为例,前缀添加OLED。
//函数体
void OLED_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(OLED_SCL_CLK|OLED_SDA_CLK, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN;
GPIO_Init(OLED_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = OLED_SDA_PIN;
GPIO_Init(OLED_SDA_PORT, &GPIO_InitStructure);
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);
}
(3)中英文直接显示,通过调用一个显示函数,可以实现中文、英文、数字、符号等所有字符的同一显示,不需要单独调用中文显示函数去显示一个个的字符。
OLED_Show16(1,1,"你好123abc"); // 在第一行第一列开始显示“你好123abc”
中英文直接显示的原理是通过对字符串的每个字符长度进行判断,若小于128,则表明为ASCII,若是大于128,则为中文字符,随后分别从其字模表中去查询字模数据,此流程无需输入中文字模在的位置。但是中文的字模还是需要使用字模工具去提取的,随后将其放置在代码中即可,无需考虑前后顺序。取字模的格式为阴码、列行式、逆向、十六进制数、输出索引、C51格式。
该库只有OLED.C,OLED.h两个文件,具有较高的移植性和易用性。在使用时修改以下内容即可。
(1)C文件头部的引脚
(2)中文字模表
如需库文件可私信回复获取OLED资源。