前面已介绍过一种基于I2C接口的0.91寸的单色OLED屏的显示驱动,这次介绍一种基于SPI接口的0.96寸色彩OLED屏的显示驱动。为了引脚使用上的方便,这次依然采用以GPIO口模拟SPI通讯的方式来进行驱动。
SCL---PB12
SDA-PB13
RST---PB14
DC---PB15
CS---PB16
BLK---PB17
实现高低电平输出的语句定义如下:
#define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET) //CLK
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET)
#define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_SET) //DIN
#define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET)
#define OLED_RST_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14,GPIO_PIN_SET) //RES
#define OLED_RST_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14,GPIO_PIN_RESET)
#define OLED_DC_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET) //DC
#define OLED_DC_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15,GPIO_PIN_RESET)
#define OLED_CS_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_16,GPIO_PIN_SET) //CS
#define OLED_CS_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_16, GPIO_PIN_RESET)
#define OLED_BLK_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_17,GPIO_PIN_SET) //BLK
#define OLED_BLK_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_17,GPIO_PIN_RESET)
OLED屏的初始化函数为:
- void Lcd_Init(void)
- {
- OLED_RST_Clr();
- HAL_Delay(200);
- OLED_RST_Set();
- HAL_Delay(200);
- LCD_WR_REG(0x11);
- HAL_Delay(100);
- LCD_WR_REG(0x21);
- LCD_WR_REG(0xB1);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_REG(0xB2);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_REG(0xB3);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_REG(0xB4);
- LCD_WR_DATA8(0x03);
- LCD_WR_REG(0xC0);
- LCD_WR_DATA8(0x62);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x04);
- LCD_WR_REG(0xC1);
- LCD_WR_DATA8(0xC0);
- LCD_WR_REG(0xC2);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x00);
- LCD_WR_REG(0xC3);
- LCD_WR_DATA8(0x8D);
- LCD_WR_DATA8(0x6A);
- LCD_WR_REG(0xC4);
- LCD_WR_DATA8(0x8D);
- LCD_WR_DATA8(0xEE);
- LCD_WR_REG(0xC5);
- LCD_WR_DATA8(0x0E);
- LCD_WR_REG(0xE0);
- LCD_WR_DATA8(0x10);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x12);
- LCD_WR_DATA8(0x27);
- LCD_WR_DATA8(0x37);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x10);
- LCD_WR_REG(0xE1);
- LCD_WR_DATA8(0x10);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x0F);
- LCD_WR_DATA8(0x06);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x08);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x13);
- LCD_WR_DATA8(0x26);
- LCD_WR_DATA8(0x36);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x10);
- LCD_WR_REG(0x3A);
- LCD_WR_DATA8(0x05);
- LCD_WR_REG(0x36);
- LCD_WR_DATA8(0x78);
- LCD_WR_REG(0x29);
- OLED_BLK_Set();
- }
相应的字符串显示函数为:
- 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++;
- }
- }
显示图片显示的函数为:
- void LCD_Picturea(void)
- {
- int i;
- LCD_Address_Set(0,0,159,79);
- for(i=0;i<12800;i++)
- {
- LCD_WR_DATA8(gImage_YX[i*2]);
- LCD_WR_DATA8(gImage_YX[i*2+1]);
- }
- }
实现图2和图3显示效果的主程序为:
- int main(void)
- {
- SystemClock_Config(CPU_CLK_160M);
- printf("enter mainrn");
- HAL_Init();
- GPIO_Init();
- App_OledInit();
- Lcd_Init();
- LCD_Clear(BLACK);
- LCD_ShowString(20,20,"GD32F303",YELLOW);
- HAL_Delay(2000);
- LCD_Picturea();
- while (1);
- return 0;
- }
经编译,其程序下载的结果如图1所示。
图1 程序下载结果
图2 字符串显示效果
图3 图片显示效果