【GD32L233C-START评测】彩色OLED屏的显示驱动
[复制链接]
除了常规的I2C接口单色OLED屏外,还有一种基于SPI接口的彩色OLED屏,这样就使得其表现力更强,能够实现彩色图片的显示 。
在OLED屏的驱动方式上有2种,即以硬件方式实现和以软件方式实现,相对来讲软件的方式其灵活性更强,移植起来也更方便,故这里也软件的方式来实现。
这里所使用的是0.96寸的OLED屏,其分辨率为80*160,共有8个引脚。
该显示屏与开发板的连接关系为:
SCLK----PB10
SDIN ----PB11
DC ----PB13
RST ----PB14
CS ----PB15
相关引脚输出高低电平的语句定义为:
#define OLED_SCLK_Clr() gpio_bit_reset(GPIOB, GPIO_PIN_10)
#define OLED_SCLK_Set() gpio_bit_set(GPIOB, GPIO_PIN_10)
#define OLED_SDIN_Clr() gpio_bit_reset(GPIOB, GPIO_PIN_11)
#define OLED_SDIN_Set() gpio_bit_set(GPIOB, GPIO_PIN_11)
#define OLED_DC_Clr() gpio_bit_reset(GPIOB, GPIO_PIN_13)
#define OLED_DC_Set() gpio_bit_set(GPIOB, GPIO_PIN_13)
#define OLED_RST_Clr() gpio_bit_reset(GPIOB, GPIO_PIN_14)
#define OLED_RST_Set() gpio_bit_set(GPIOB, GPIO_PIN_14)
#define OLED_CS_Clr() gpio_bit_reset(GPIOB, GPIO_PIN_15)
#define OLED_CS_Set() gpio_bit_set(GPIOB, GPIO_PIN_15)
在软件模拟SPI的过程中,数据传送的函数是十分关键的,该函数的内容为:
void LCD_Writ_Bus(u8 dat)
{
u8 i;
OLED_CS_Clr();
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set();
}
以该函数为基础,实现数据发送和指令发送发送的函数分别为:
void LCD_WR_DATA8(u8 dat)
{
OLED_DC_Set();
LCD_Writ_Bus(dat);
}
void LCD_WR_REG(u8 dat)
{
OLED_DC_Clr();
LCD_Writ_Bus(dat);
}
实现清屏处理的函数为:
void LCD_Clear(u16 Color)
{
u16 i,j;
LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA(Color);
}
}
}
以清屏函数为基础,可方便地完成图片显示函数的编写,其内容为:
void LCD_Picturea(void)
{
int i;
LCD_Address_Set(0,0,79,79);
for(i=0;i<6400;i++)
{
LCD_WR_DATA8(gImage_cgq[i*2]);
LCD_WR_DATA8(gImage_cgq[i*2+1]);
}
}
需要指出的是,待显示的图片数据是保存在数组gImage_cgq[]中,生成该数据时可借助于相应的辅助工具来轻松实现。
实现字符串显示的函数为:
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)
{
while(*p!='\0')
{
if(x>LCD_W-16){x=0;y+=16;}
if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
LCD_ShowChar(x,y,*p,0,color);
x+=8;
p++;
}
}
以上面的功能函数为依托,实现图1和图2显示效果的主程序为:
int main(void)
{
systick_config();
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7 | GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
gpio_bit_reset(GPIOC, GPIO_PIN_6 | GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_10 | GPIO_PIN_11| GPIO_PIN_13| GPIO_PIN_14| GPIO_PIN_15);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11| GPIO_PIN_13| GPIO_PIN_14| GPIO_PIN_15);
delay_1ms(500);
Lcd_Init();
LCD_Clear(BLACK);
LCD_ShowString(10,0,"CSM32RV20",RED);
LCD_ShowString(10,20,"0.96'OLED",RED);
LCD_ShowString(10,40,"jinglixixi",RED);
LCD_ShowString(10,60,"2022.1.12",RED);
delay_1ms(2000);
LCD_Clear(BLACK);
LCD_Picturea();
while(1)
}
经程序的编译和下载,即可见到对应的显示效果。
图1 显示字符串
图2 显示图片
|