在STM32F407开发板上提供了TFT屏的接口,其接口如图1所示。
由资料可知它所支持的显示屏驱动IC型号有:ILI9341/NT35310/NT35510/SSD1963/ST7789等,屏幕的尺寸为:2.8寸/3.5寸/4.3寸/7寸,所采用的驱动方式为并行方式。
图1 接口电路
自己手头的显示屏为2.2寸屏,其驱动IC为:ILI9341,经测试其似乎并不在其支持的范围内。
该显示屏的接口电路如图2所示,它支持以SPI方式进行驱动。
图2 接口电路
该显示屏与开发板的连接关系为:
CS ----PG12
RS ----PF12 (GND)
WR ----PD5
RD ----PD4
(GND)
RST ----RST
SDA ----PF11
BKL ----PB15
为以GPIO口模拟SPI,其实现高低电平输出的语句定义为:
#define CLR_CLK()
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET)
#define SET_CLK()
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET) //CLK
#define CLR_SDA() HAL_GPIO_WritePin(GPIOF,GPIO_PIN_11,GPIO_PIN_RESET)
#define SET_SDA()
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_11,GPIO_PIN_SET) //DIN
#define CLR_CS()
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12,GPIO_PIN_RESET)
#define SET_CS()
HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12,GPIO_PIN_SET) //CS
#define CLR_BKL()
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET)
#define SET_BKL()
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET) //BKL
#define CLR_RS()
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_12,GPIO_PIN_RESET)
#define SET_RS()
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_12,GPIO_PIN_SET) //RS
#define CLR_RD()
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET)
#define SET_RD()
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET) //RD
对所用引脚的配置函数为:
void LCD_Init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE();
gpio_init_struct.Pin= GPIO_PIN_1;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &gpio_init_struct);
gpio_init_struct.Pin = GPIO_PIN_15;
HAL_GPIO_Init(GPIOB, &gpio_init_struct); gpio_init_struct.Pin = GPIO_PIN_5|GPIO_PIN_12;
HAL_GPIO_Init(GPIOD, &gpio_init_struct); gpio_init_struct.Pin= GPIO_PIN_11| GPIO_PIN_12;
HAL_GPIO_Init(GPIOF, &gpio_init_struct);
gpio_init_struct.Pin= GPIO_PIN_12;
HAL_GPIO_Init(GPIOG, &gpio_init_struct); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_12, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15, GPIO_PIN_SET);
}
以GPIO口模拟SPI方式方式字节数据的函数为:
void send_byte(uint8_t data)
{
uint8_t count;
for(count = 0; count < 8; count++)
{
CLR_CLK();
if(data & 0x80)
{
SET_SDA();
}
else
{
CLR_SDA();
}
data <<= 1;
SET_CLK();
}
}
以色彩清屏屏幕的函数为:
void ili9341_clear(int c)
{
uint32_t index=0;
set_cursor(0x00, 0x0000);
gram_prepare();
for(index = 0; index < (320*240); index++)
{
write_data(c >> 8);
write_data(c);
}
}
实现字符显示的函数为:
void_GUI_DispChar(char c, int x, int y, const char *pdata, int font_xsize, int font_ysize, int fcolor, int bcolor)
{
uint8_t j,pos,t;
uint8_t temp;
uint8_t XNum;
uint32_t base;
XNum = (font_xsize/8) + 1;
if(font_ysize%8 == 0)
{
XNum--;
}
if(c < ' ')
{
return;
}
c = c - ' ';
base = (c*XNum*font_ysize);
for(j = 0; j < XNum; j++)
{
for(pos = 0; pos < font_ysize;pos++)
{
temp = (uint8_t)pdata[base + pos +j*font_ysize];
if(j < XNum)
{
for(t = 0; t < 8; t++)
{
if((temp>>t)&0x01)
{
ili9341_draw_pixel(fcolor, x+t, y+pos);
}
else
{
ili9341_draw_pixel(bcolor,x+t, y+pos);
}
}
}
else
{
for(t = 0; t < font_xsize%8;t++)
{
if((temp >> t) &0x01)
{
ili9341_draw_pixel(fcolor, x+t,y+pos);
}
else
{
ili9341_draw_pixel(bcolor, x+t, y+pos);
}
}
}
}
x+= 8;
}
}
实现汉字显示的函数为:
void showhanzi16(unsigned int x,unsigned int y,unsigned char index, int fcolor, intbcolor)
{
unsigned char i,j,k;
unsigned char *temp=hanzi16;
temp+=index*32;
for(j=0;j<16;j++)
{
for(k=0;k<2;k++)
{
for(i=0;i<8;i++)
{
if((*temp&(1<<i))!=0)
{
ili9341_draw_pixel(fcolor, x+i+k*8, y+j);
}
else
{
ili9341_draw_pixel(bcolor, x+i+k*8, y+j);
}
}
temp++;
}
}
}
实现用法50*50像素点图标的显示函数为:
void showimage(unsigned int x,unsigned int y)
{
int i,j;
set_cursor(x,y);
gram_prepare();
for(j=0;j<50;j++)
{
set_cursor(x,y+j);
gram_prepare();
for(i=0;i<50;i++)
{
write_data(gImage_tb[(j*50+i)*2]);
write_data(gImage_tb[(j*50+i)*2+1]);
}
}
}
实现图3所示效果的主程序为:
int main(void)
{
HAL_Init();
sys_stm32_clock_init(336, 8, 2, 7);
delay_init(168);
LCD_Init();
delay_ms(10);
ili9341_init();
ili9341_clear(RED);
BACK_COLOR=RED;
POINT_COLOR=YELLOW;
LCD_ShowString(30,17,"MDM-2802& STM32F407");
LCD_ShowString(60,300,"BY:jinglixixi");
showhanzi16(60,57,32, YELLOW, RED);
showhanzi16(80,57,33, YELLOW, RED);
showhanzi16(100,57,34, YELLOW, RED);
showhanzi16(120,57,35, YELLOW, RED);
showhanzi16(140,57,36, YELLOW, RED);
showimage(80,100);
LCD_DrawLine(WHITE ,80, 100, 80, 150);
LCD_DrawLine(WHITE ,0, 35, 239, 35);
LCD_DrawLine(WHITE ,0, 295, 239, 295);
while(1);
}
图3 接口电路
这样在ST M32F407开发板上就具备了图像的表现能力,也为后续的测评打好了基础。