FM33LGxx开发板提供了2个SPI扩展接口,见图1所示,在连接SPI器件时可直接使用这个接口。
图1 SPI接口
为了驱动一款0.96寸的彩色LCD屏,正好可以用到它。这里所用的是SPI1,由于LCD屏至少要用5个GPIO引脚,故还要从其他地方借用一个GPIO引脚,为此就从DAC接口借用了PC5。
为此,该LCD屏与开发板的连接关系为:
SSN---PD2---CS
SCK---PD3---SCL
MISO---PD4---RES
MOSI---PD5---SDA
DAC---PC5 ---DC
图2 界面显示效果
图3 图像显示效果
这里仍以GPIO口模拟SPI的方式来实现LCD屏的显示驱动,其输出高低电平的引脚定义为:
#define
OLED_SCLK_Set()
FL_GPIO_SetOutputPin(GPIOD, FL_GPIO_PIN_3) //CLK
#define
OLED_SCLK_Clr() FL_GPIO_ResetOutputPin(GPIOD,
FL_GPIO_PIN_3)
#define
OLED_SDIN_Set()
FL_GPIO_SetOutputPin(GPIOD, FL_GPIO_PIN_5) //DIN
#define
OLED_SDIN_Clr()
FL_GPIO_ResetOutputPin(GPIOD, FL_GPIO_PIN_5)
#define
OLED_RST_Set()
FL_GPIO_SetOutputPin(GPIOD, FL_GPIO_PIN_4) //RES
#define
OLED_RST_Clr()
FL_GPIO_ResetOutputPin(GPIOD, FL_GPIO_PIN_4)
#define
OLED_DC_Set()
FL_GPIO_SetOutputPin(GPIOC, FL_GPIO_PIN_5) //DC
#define
OLED_DC_Clr()
FL_GPIO_ResetOutputPin(GPIOC, FL_GPIO_PIN_5)
#define
OLED_CS_Set() FL_GPIO_SetOutputPin(GPIOD,
FL_GPIO_PIN_2) //CS
#define
OLED_CS_Clr()
FL_GPIO_ResetOutputPin(GPIOD, FL_GPIO_PIN_2)
对LCD屏所使用的引脚,其配置函数为:
void
lcd_app(void)
{
FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
FL_GPIO_ResetOutputPin(GPIOD,
FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_5);
GPIO_InitStruct.pin =
FL_GPIO_PIN_2|FL_GPIO_PIN_3|FL_GPIO_PIN_4|FL_GPIO_PIN_5;
GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.outputType =FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
FL_GPIO_Init(GPIOD,&GPIO_InitStruct);
FL_GPIO_ResetOutputPin(GPIOC,
FL_GPIO_PIN_5);
GPIO_InitStruct.pin = FL_GPIO_PIN_5;
GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.outputType =
FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
FL_GPIO_Init(GPIOC,
&GPIO_InitStruct);
}
LCD屏的初始化函数为:
void Lcd_Init(void)
{
OLED_RST_Clr();
FL_DelayMs(200);
OLED_RST_Set();
FL_DelayMs(200);
LCD_WR_REG(0x11);
FL_DelayMs(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);
}
实现字符串显示的函数为:
voidLCD_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++;
}
}
实现图片显示的函数为:
voidLCD_ShowPictureb(u16 x1,u16 y1,u16 x2,u16 y2)
{
int i;
LCD_Address_Set(x1,y1,x2,y2);
for(i=0;i<12800;i++)
{
LCD_WR_DATA8(gImage_RW[i*2]);
LCD_WR_DATA8(gImage_RW[i*2+1]);
}
}
该LCD屏实现图2和图3显示效果的主程序为:
int main(void)
{
MF_Clock_Init();
MF_SystemClock_Config();
FL_Init();
MF_Config_Init();
UserInit();
key_int();
led_int();
lcd_app();
Lcd_Init();
LCD_Clear(BLACK);
LCD_ShowPictureb(0,0,159,79);
BACK_COLOR=RED;
FL_DelayMs(2000);
LCD_Clear(RED);
LCD_ShowString(20,10,"FM33LG0XX
TEST",YELLOW);
LCD_ShowString(20,30,"jinglixixi",YELLOW);
while(1)
{
if(FL_GPIO_GetInputPin(GPIOD,
FL_GPIO_PIN_9)==0)
{
FL_GPIO_ResetOutputPin(GPIOC, FL_GPIO_PIN_1);
}
else
{
FL_GPIO_SetOutputPin(GPIOC, FL_GPIO_PIN_1);
}
FL_DelayMs(200);
}
}
这样在以前OLED屏的显示基础上,又向前迈进了一步色彩显示问题已不在话下。
此外,它在色彩识别与标识上也有很好的表现力,见图4所示。
图4 色彩识别与标识