[MCU] 【小华HC32F448测评】+TFT屏显示驱动

jinglixixi   2023-8-20 09:57 楼主

尽管OLED屏能满足一定的显示需要,但要进行图片显示等就非TFT屏不可了。

为了省去连线的麻烦,可借用开发板上的显示接口,见图1所示。

image.png  

图1 显示接口

 

TFT屏与开发板的连接关系为:

BLK:PB10

SCK:PA12

DSI:PC4

D/C:PE12

RST:PE14

CS :PC7

 

为输出高低电平所作的引脚定义为:

#define LCD_CS_High()     GPIO_SetPins(GPIO_PORT_C, GPIO_PIN_07)   //CS

#define LCD_CS_Low()     GPIO_ResetPins(GPIO_PORT_C, GPIO_PIN_07)

#define LCD_REST_High()   GPIO_SetPins(GPIO_PORT_E, GPIO_PIN_14)   //RES

#define LCD_REST_Low()   GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_14)

#define LCD_DC_High()    GPIO_SetPins(GPIO_PORT_E, GPIO_PIN_12)  //DC

#define LCD_DC_Low()     GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_12)

#define LCD_SDI_High()    GPIO_SetPins(GPIO_PORT_C, GPIO_PIN_04)   //DIN

#define LCD_SDI_Low()    GPIO_ResetPins(GPIO_PORT_C, GPIO_PIN_04)

#define LCD_SCK_High()   GPIO_SetPins(GPIO_PORT_A, GPIO_PIN_12)   //CLK

#define LCD_SCK_Low()    GPIO_ResetPins(GPIO_PORT_A, GPIO_PIN_12)

#define LCD_LED_High()   GPIO_SetPins(GPIO_PORT_B, GPIO_PIN_10)   //BLK

 

对TFT屏所用引脚进行配置的函数为:

void Init_TFT (void)
{
    stc_gpio_init_tstcGpioInit;
    (void)GPIO_StructInit(&stcGpioInit);
    stcGpioInit.u16PinState = PIN_STAT_RST;
    stcGpioInit.u16PinDir = PIN_DIR_OUT;
    (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_12, &stcGpioInit);
	(void)GPIO_Init(GPIO_PORT_B, GPIO_PIN_10, &stcGpioInit);
	(void)GPIO_Init(GPIO_PORT_C, GPIO_PIN_04, &stcGpioInit);
	(void)GPIO_Init(GPIO_PORT_C, GPIO_PIN_07, &stcGpioInit);
	(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_12, &stcGpioInit);
	(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_14, &stcGpioInit);
}

 

以模拟SPI方式发送字节数据的函数为:

void LCD_Writ_Bus(unsigned char com) 
{
  unsigned char uci;
  for(uci=0;uci<8;uci++)
  {
     if(com & 0x80)
     {
         LCD_SDI_High();
     }
     else
     {
         LCD_SDI_Low();
     }
     com = com << 1;
     LCD_SCK_Low();
     LCD_SCK_High();
  }
}

 

实现以指定色彩擦除屏幕的函数为:

void LCD_Clear(unsigned int Color)
{
    char VH,VL;
    unsigned int i,j;
    VH=Color>>8;
    VL=Color;	
    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_DATA8(VH);
         LCD_WR_DATA8(VL);	
      }
    }
}

 

实现字符串显示的函数为:

void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
{
    while(*p!='\0')
    {
        if(x>LCD_W-16){x=0;y+=16;}
        if(y>LCD_H-16){y=x=0;}
        LCD_ShowChar(x,y,*p,0);
        x+=8;
        p++;
    }
}

 

实现图标显示的函数为:

void show_tb(unsigned int x,unsigned int y,unsigned int n) //200*200
{
  unsigned int i,j,k;
  unsigned int da;
  k=0;
  for(i=0;i<50;i++)
  {
    for(j=0;j<50;j++)
    {
       if(n==0) da=gImage_tb[k*2];
       ...
       da=da<<8;
       if(n==0) da|=gImage_tb[k*2+1];
       ...
       POINT_COLOR=da;
       LCD_DrawPoint(x-j,y+i);
       k++;
    }
  }
}

 

实现显示测试的主程序为:

int32_t main(void)
{
    LL_PERIPH_WE(LL_PERIPH_GPIO);
    LED_Init();
	Init_TFT();
	tft_Init();
    BACK_COLOR=RED;
    POINT_COLOR=WHITE;
    LCD_Clear(RED);
    LCD_ShowString(80,10,"HC32F448");
	LCD_ShowString(80,40,"2.2' TFT");
	LCD_DrawLine(0,60, 239, 60);
	LCD_DrawLine(0,290, 239, 290);
	LCD_ShowString(80,295,"jinglixixi");
    show_tb(50,5,0);
    LL_PERIPH_WP(LL_PERIPH_GPIO);
    for (;;) {
        LED_G_TOGGLE();
        DDL_DelayMS(DLY_MS);
    }
}

 

经程序的编译和下载,其测试结果如图2所示,说明功能正确。

image.png  

图2  显示效果

 

回复评论 (2)

经程序的编译和下载,其测试结果如图2所示,说明功能正确。

大佬的帖子永远这么优秀!

点赞  2023-8-20 13:39

省去连线的麻烦,可借用开发板上的显示接口,这是高手

点赞  2023-8-20 21:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复