由于开发板先前所配的显示屏在寄出前已被损坏,故利用手头的LCD屏来替代它完成显示功能。
该显示屏采用SPI接口,其显示分辨率为160*80像素点。
为测试对LCD屏的显示驱动能力,它与开发板的连接关系为:
SCLK----PF7
SDIN----PF8
RST----PA8
DC ----PC9
CS ----PF9
对所用引脚的工作模式配置函数为:
void lcd_gpio(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
__HAL_RCC_GPIOF_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
所用引脚输出高低电平的语句定义为:
#define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET)
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET)
#define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET)
#define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET)
#define OLED_RST_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)
#define OLED_RST_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET)
#define OLED_DC_Set() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET)
#define OLED_DC_Clr() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET)
#define OLED_CS_Set() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET)
#define OLED_CS_Clr() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET)
GPIO口模拟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_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_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]);
}
}
在配备字符显示函数的情况下,实现字符串显示的函数为:
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)
{
SystemClock_Config();
lcd_gpio();
Lcd_Init();
BACK_COLOR=RED;
LCD_Clear(RED);
LCD_ShowString(20,5,"STM32F429",YELLOW);
LCD_ShowString(20,25,"0.96'LCD",YELLOW);
LCD_ShowString(20,50,"jinglixixi",YELLOW);
HAL_Delay(2000);
LCD_Clear(RED);
LCD_ShowPictureb(0,0,159,79);
while (1);
}
有了LCD屏的显示支持,后面就可以进行U盘的读写测试了。
图1 显示字符串
图2 显示图像