这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » AG32VH407下多种显示屏的显示驱动

共2条 1/1 1 跳转至

AG32VH407下多种显示屏的显示驱动

助工
2026-04-07 19:43:51     打赏

为增强表现力和丰富显示内容,给AG32VH407开发板配置一款SPI接口TFT屏是十分必要的显示屏的分辨率为320*240像素点。

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

SCLK----PIN_62

SDIN----PIN_61

RST----PIN_59

DC ----PIN_58

CS ----PIN_57 

为此VE文件中建立的映射关系为:

GPIO5_0 PIN_62 

GPIO5_1 PIN_61 

GPIO5_2 PIN_59

GPIO5_3 PIN_58

GPIO5_4 PIN_57 

为便于向TFT显示屏提供高低电平,所作的语句定义为:

#define LCD_SCLK_Set   GPIO_SetHigh(GPIO5,GPIO_BIT0)

#define LCD_SCLK_Clr   GPIO_SetLow(GPIO5,GPIO_BIT0) 

#define LCD_SDIN_Set   GPIO_SetHigh(GPIO5,GPIO_BIT1)

#define LCD_SDIN_Clr   GPIO_SetLow(GPIO5,GPIO_BIT1) 

#define LCD_RST_Set    GPIO_SetHigh(GPIO5,GPIO_BIT2)

#define LCD_RST_Clr    GPIO_SetLow(GPIO5,GPIO_BIT2) 

#define LCD_DC_Set     GPIO_SetHigh(GPIO5,GPIO_BIT3)

#define LCD_DC_Clr     GPIO_SetLow(GPIO5,GPIO_BIT3) 

#define LCD_CS_Set     GPIO_SetHigh(GPIO5,GPIO_BIT4)

#define LCD_CS_Clr     GPIO_SetLow(GPIO5,GPIO_BIT4)

 对所用引脚配置工作模式函数为:

void TFT_config(void)
{
  SYS_EnableAHBClock(APB_MASK_GPIO5);
  GPIO_SetOutput(GPIO5,GPIO_BIT0);
  GPIO_SetOutput(GPIO5,GPIO_BIT1);
  GPIO_SetOutput(GPIO5,GPIO_BIT2);
  GPIO_SetOutput(GPIO5,GPIO_BIT3);
  GPIO_SetOutput(GPIO5,GPIO_BIT4); 
}

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

void LCD_Writ_Bus(unsigned char dat)
{
    unsigned char i;
    LCD_CS_Clr;
    for(i=0;i<8;i++)
    {
        LCD_SCLK_Clr;
        if(dat&0x80)
           LCD_SDIN_Set;
        else
           LCD_SDIN_Clr;
        LCD_SCLK_Set;
        dat<<=1;
    }
    LCD_CS_Set;
}

TFT屏初始化函数为:

void TFT_Init(void)
{ 
    LCD_RST_Clr;
    UTIL_IdleUs(20e3); 
    LCD_RST_Set;
    UTIL_IdleUs(20e3);
    LCD_CS_Clr; 
    LCD_WR_REG(0xCB);  
    LCD_WR_DATA8(0x39); 
    LCD_WR_DATA8(0x2C); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x34); 
    LCD_WR_DATA8(0x02); 
    LCD_WR_REG(0xCF);  
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0XC1); 
    LCD_WR_DATA8(0X30);  
    LCD_WR_REG(0xE8);  
    LCD_WR_DATA8(0x85); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x78);  
    LCD_WR_REG(0xEA);  
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x00);  
    LCD_WR_REG(0xED);  
    LCD_WR_DATA8(0x64); 
    LCD_WR_DATA8(0x03); 
    LCD_WR_DATA8(0X12); 
    LCD_WR_DATA8(0X81); 
    LCD_WR_REG(0xF7);  
    LCD_WR_DATA8(0x20);   
    LCD_WR_REG(0xC0); 
    LCD_WR_DATA8(0x23); 
    LCD_WR_REG(0xC1); 
    LCD_WR_DATA8(0x10); 
    LCD_WR_REG(0xC5); 
    LCD_WR_DATA8(0x3e);
    LCD_WR_DATA8(0x28);  
    LCD_WR_REG(0xC7); 
    LCD_WR_DATA8(0x86); 
    LCD_WR_REG(0x36); 
    LCD_WR_DATA8(0x48);
    LCD_WR_REG(0x3A);    
    LCD_WR_DATA8(0x55); 
    LCD_WR_REG(0xB1);    
    LCD_WR_DATA8(0x00);  
    LCD_WR_DATA8(0x18);  
    LCD_WR_REG(0xB6); 
    LCD_WR_DATA8(0x08); 
    LCD_WR_DATA8(0x82);
    LCD_WR_DATA8(0x27);   
    LCD_WR_REG(0xF2); 
    LCD_WR_DATA8(0x00);  
    LCD_WR_REG(0x26); 
    LCD_WR_DATA8(0x01);  
    LCD_WR_REG(0xE0); 
    LCD_WR_DATA8(0x0F); 
    LCD_WR_DATA8(0x31); 
    LCD_WR_DATA8(0x2B); 
    LCD_WR_DATA8(0x0C); 
    LCD_WR_DATA8(0x0E); 
    LCD_WR_DATA8(0x08); 
    LCD_WR_DATA8(0x4E); 
    LCD_WR_DATA8(0xF1); 
    LCD_WR_DATA8(0x37); 
    LCD_WR_DATA8(0x07); 
    LCD_WR_DATA8(0x10); 
    LCD_WR_DATA8(0x03); 
    LCD_WR_DATA8(0x0E); 
    LCD_WR_DATA8(0x09); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_REG(0XE1); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x0E); 
    LCD_WR_DATA8(0x14); 
    LCD_WR_DATA8(0x03); 
    LCD_WR_DATA8(0x11); 
    LCD_WR_DATA8(0x07); 
    LCD_WR_DATA8(0x31); 
    LCD_WR_DATA8(0xC1); 
    LCD_WR_DATA8(0x48); 
    LCD_WR_DATA8(0x08); 
    LCD_WR_DATA8(0x0F); 
    LCD_WR_DATA8(0x0C); 
    LCD_WR_DATA8(0x31); 
    LCD_WR_DATA8(0x36); 
    LCD_WR_DATA8(0x0F);  
    LCD_WR_REG(0x11); 
    UTIL_IdleUs(120e3);                 
    LCD_WR_REG(0x29); 
    LCD_WR_REG(0x2c); 
}

 实现色彩清屏处理的函数为:

void LCD_Clear(unsigned int Color)
{
    unsigned int 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_ShowCharh(unsigned int x,unsigned int y,char num,char mode)
{
    char temp;
    char pos,t;
    unsigned int x0=x;
    unsigned int colortemp=POINT_COLOR;    
    if(x>LCD_W-16||y>LCD_H-16)return;                  
    num=num-' ';
    LCD_Address_set(x,y,x+8-1,y+16-1);       
    if(!mode) 
    {
        for(pos=0;pos<16;pos++)
        { 
          temp=asc2_1608[(unsigned int)num*16+pos];
          for(t=0;t<8;t++)
          {                 
            if(temp&0x01) POINT_COLOR=colortemp;
            else POINT_COLOR=BACK_COLOR;
            LCD_DrawPoint(x+pos,y-t);
            temp>>=1; 
          }
        }   
      }
      else
    {
        for(pos=0;pos<16;pos++)
        {
            temp=asc2_1608[(unsigned int)num*16+pos];
            for(t=0;t<8;t++)
            {                 
                if(temp&0x01) LCD_DrawPoint(x+pos,y-t);     
                temp>>=1; 
            }
        }
    }
    POINT_COLOR=colortemp;                    
}

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

void LCD_ShowStringh(unsigned int x,unsigned int y,const char *p)
{         
    while(*p!='\0')
    {       
        LCD_ShowCharh(x,y,*p,0);
        y-=8;
        p++;
    }  
}

 实现汉字显示的函数为:

void showhanzi16h(unsigned int x,unsigned int y,unsigned char index,unsigned char s)    
{  
    unsigned char i,j,k;
    const 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)
                {
                    if(s==0) POINT_COLOR=WHITE; 
                    else POINT_COLOR=RED; 
                } 
                else
                {
                    if(s==0) POINT_COLOR=RED; 
                    else POINT_COLOR=WHITE;
                } 
              LCD_DrawPoint(x+j,y-k*8-i);               
            }  
            temp++;
        }
     }
}

实现TFT显示屏驱动效果测试程序为:

int main(void)
{
   board_init();
   TFT_config();
   TFT_Init();
   LCD_Clear(RED);
   BACK_COLOR=RED;
   POINT_COLOR=WHITE;
   LCD_ShowStringh(10,80," 8:30:00");
   showhanzi16h(10,240,0,0);
   showhanzi16h(10,220,1,0);
   showhanzi16h(10,200,2,0);
   showhanzi16h(10,180,3,0);
   showhanzi16h(10,160,4,0);
   showhanzi16h(10,140,5,0);
   while (1);
}

经程序的编译与烧录,在按图1连接的情况下其测试效果如图2所示。

image.png

1 器件连接

image.png

2 显示效果

其实,该测试的意义还不止于此,在修改显示屏初始化程序和显示屏长宽参数的情况下,它还可以驱动更多的显示屏。

如驱动一款1.8寸显示屏的参数化函数为:


void Lcd_Init(void)
{   
    unsigned int i;
    Lcd_Reset(); 
    LCD_WR_REG(0x11); 
    UTIL_IdleUs(120e3);
    LCD_WR_REG(0xB1); 
    LCD_WR_DATA8(0x01); 
    LCD_WR_DATA8(0x2C); 
    LCD_WR_DATA8(0x2D); 
    LCD_WR_REG(0xB2); 
    LCD_WR_DATA8(0x01); 
    LCD_WR_DATA8(0x2C); 
    LCD_WR_DATA8(0x2D); 
    LCD_WR_REG(0xB3); 
    LCD_WR_DATA8(0x01); 
    LCD_WR_DATA8(0x2C); 
    LCD_WR_DATA8(0x2D); 
    LCD_WR_DATA8(0x01); 
    LCD_WR_DATA8(0x2C); 
    LCD_WR_DATA8(0x2D);     
    LCD_WR_REG(0xB4); 
    LCD_WR_DATA8(0x07); 
    LCD_WR_REG(0xC0); 
    LCD_WR_DATA8(0xA2); 
    LCD_WR_DATA8(0x02); 
    LCD_WR_DATA8(0x84); 
    LCD_WR_REG(0xC1); 
    LCD_WR_DATA8(0xC5); 
    LCD_WR_REG(0xC2); 
    LCD_WR_DATA8(0x0A); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_REG(0xC3); 
    LCD_WR_DATA8(0x8A); 
    LCD_WR_DATA8(0x2A); 
    LCD_WR_REG(0xC4); 
    LCD_WR_DATA8(0x8A); 
    LCD_WR_DATA8(0xEE); 
    LCD_WR_REG(0xC5);  
    LCD_WR_DATA8(0x0E); 
    LCD_WR_REG(0x36);  
    LCD_WR_DATA8(0xC0); 
    LCD_WR_REG(0xe0); 
    LCD_WR_DATA8(0x0f); 
    LCD_WR_DATA8(0x1a); 
    LCD_WR_DATA8(0x0f); 
    LCD_WR_DATA8(0x18); 
    LCD_WR_DATA8(0x2f); 
    LCD_WR_DATA8(0x28); 
    LCD_WR_DATA8(0x20); 
    LCD_WR_DATA8(0x22); 
    LCD_WR_DATA8(0x1f); 
    LCD_WR_DATA8(0x1b); 
    LCD_WR_DATA8(0x23); 
    LCD_WR_DATA8(0x37); 
    LCD_WR_DATA8(0x00);     
    LCD_WR_DATA8(0x07); 
    LCD_WR_DATA8(0x02); 
    LCD_WR_DATA8(0x10); 
    LCD_WR_REG(0xe1); 
    LCD_WR_DATA8(0x0f); 
    LCD_WR_DATA8(0x1b); 
    LCD_WR_DATA8(0x0f); 
    LCD_WR_DATA8(0x17); 
    LCD_WR_DATA8(0x33); 
    LCD_WR_DATA8(0x2c); 
    LCD_WR_DATA8(0x29); 
    LCD_WR_DATA8(0x2e); 
    LCD_WR_DATA8(0x30); 
    LCD_WR_DATA8(0x30); 
    LCD_WR_DATA8(0x39); 
    LCD_WR_DATA8(0x3f); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x07); 
    LCD_WR_DATA8(0x03); 
    LCD_WR_DATA8(0x10);     
    LCD_WR_REG(0x2a);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x7f);
    LCD_WR_REG(0x2b);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x9f);
    LCD_WR_REG(0xF0);   
    LCD_WR_DATA8(0x01); 
    LCD_WR_REG(0xF6);  
    LCD_WR_DATA8(0x00); 
    LCD_WR_REG(0x3A);  
    LCD_WR_DATA8(0x05); 
    LCD_WR_REG(0x29);    
}

将色彩擦除屏幕的函数改为:

void Lcd_Clear(unsigned int Color)           
{   
   unsigned int i,m;
   LCD_Address_set(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1); 
   LCD_WR_REG(0x2C); 
   for(i=0;i<X_MAX_PIXEL;i++)
   {
      for(m=0;m<Y_MAX_PIXEL;m++)
      { 
          LCD_WR_DATA(Color); 
      }  
    } 
}

则经过程序的编译和下载,其测试效果如图3所示。

image.png

3 测试效果 

此外,在修改初始化程序及显示屏参数的情况下,对LCD屏也是起作用的,图4是一款0.96LCD屏,其测试效果见图5所示。

image.png

4 器件连接

image.png

5 测试效果











关键词: AG32VH407    

专家
2026-04-08 07:32:17     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]