上一篇介绍了SWM221CBT7显示开发板的基本用法,这次来介绍如何用GPIO口以模拟I2C的方式来驱动OLED屏。
常见的OLED屏,有0.91寸和0.96寸这2种,除初始化的函数不同外,其它的基本相同。
为后续实现硬件驱动的方便,这里选取的连接引脚就选用对应的I2C引脚。

图1 I2C引脚
将所用引脚配置为输出模式的函数为:
void oled_config(void)
{
GPIO_Init(GPIOA, PIN6, 1, 0, 0, 0);
GPIO_Init(GPIOA, PIN7, 1, 0, 0, 0);
}
为便于输出高低电平的需要,相应的定义语句为:
#define OLED_SCLK_Clr() GPIO_ClrBit(GPIOA, PIN6)
#define OLED_SCLK_Set() GPIO_SetBit(GPIOA, PIN6)
#define OLED_SDIN_Clr() GPIO_ClrBit(GPIOA, PIN7)
#define OLED_SDIN_Set() GPIO_SetBit(GPIOA, PIN7)
使显示屏工作的参数设置为:
#define OLED_MODE 0
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
#define OLED_CMD 0
#define OLED_DATA 1
使用GPIO口模拟I2C方式发送字节数据的函数为:
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
for(i=0;i<8;i++)
{
m=da;
m=m&0x80;
if(m==0x80)
{
OLED_SDIN_Set();
}
else
{
OLED_SDIN_Clr();
}
da=da<<1;
delay_us(3);
OLED_SCLK_Set();
delay_us(3);
OLED_SCLK_Clr();
delay_us(3);
}
}
对0.91寸屏的初始化函数为:
void OLED_Init(void)
{
Write_IIC_Command(0xAE);
Write_IIC_Command(0x40);
Write_IIC_Command(0xb0);
Write_IIC_Command(0xc8);
Write_IIC_Command(0x81);
Write_IIC_Command(0xff);
Write_IIC_Command(0xa1);
Write_IIC_Command(0xa6);
Write_IIC_Command(0xa8);
Write_IIC_Command(0x1F);
Write_IIC_Command(0xd3);
Write_IIC_Command(0x00);
Write_IIC_Command(0xd5);
Write_IIC_Command(0xf0);
Write_IIC_Command(0xd9);
Write_IIC_Command(0x22);
Write_IIC_Command(0xda);
Write_IIC_Command(0x02);
Write_IIC_Command(0x8d);
Write_IIC_Command(0x14);
Write_IIC_Command(0xdb);
Write_IIC_Command(0x49);
Write_IIC_Command(0xaf);
}
实现驱动测试的主程序为:
int main(void)
{
SystemInit();
GPIO_Init(GPIOA, PIN5, 1, 0, 0, 0);
oled_config();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"SWDM221CBA5",16);
OLED_ShowString(0,2,"jinglixixi",16);
while(1)
{
GPIO_SetBit(GPIOA, PIN5);
delay_ms(300);
GPIO_ClrBit(GPIOA, PIN5);
delay_ms(300);
}
}
经程序的编译和下载,其测试效果如图2所示,说明驱动有效。

图2 测试效果
若变更初始化函数,则可实现0.96寸显示屏的驱动,其初始化函数为:
void OLED_Init(void)
{
Write_IIC_Command(0xAE);
Write_IIC_Command(0x20);
Write_IIC_Command(0x10);
Write_IIC_Command(0xb0);
Write_IIC_Command(0xc8);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
Write_IIC_Command(0x40);
Write_IIC_Command(0x81);
Write_IIC_Command(0xdf);
Write_IIC_Command(0xa1);
Write_IIC_Command(0xa6);
Write_IIC_Command(0xa8);
Write_IIC_Command(0x3F);
Write_IIC_Command(0xa4);
Write_IIC_Command(0xd3);
Write_IIC_Command(0x00);
Write_IIC_Command(0xd5);
Write_IIC_Command(0xf0);
Write_IIC_Command(0xd9);
Write_IIC_Command(0x22);
Write_IIC_Command(0xda);
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb);
Write_IIC_Command(0x20);
Write_IIC_Command(0x8d);
Write_IIC_Command(0x14);
Write_IIC_Command(0xaf);
}
经测试,去显示效果如图3所示,说明驱动有效且成功。

图3 显示效果
我要赚赏金
