【中科微CSM32RV003绿色开发板免费体验】+TFT屏显示驱动篇 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

【中科微CSM32RV003绿色开发板免费体验】+TFT屏显示驱动篇

在掌握了GPIO口使用的基础上,首先要解决的问题就是为开发板配置一个显示屏。

最先想到的就是I2C接口的OLED屏,它比较节省GPIO口。但经过实际测试,该显示屏虽然能够进行显示,但显示的亮度却很低,无法满足正常显示的需要,这可能与I2C接口需要配置上拉电阻有关,故舍去了这种使用方法。

随后就改为SPI接口的TFT显示屏,该显示屏是一款2.2寸显示屏,其显示分辨率为240*320像素点,其核心芯片是ili9220B。

由于CSM32RV003的芯片引脚本身就不多,再加上有些引脚已被板上的器件所占用,故显示屏所连接的引脚为:

CS ---PA3

RST---PA4

DC ---PA8

SDA---PA9

SCL---PA12

BL ---3.3V

image.png

图1 控制接口

所用引脚输出高低电平的语句定义为:

#define LCD_CS_High()
GPIO_Write(GPIOA,PIN3,GPIO_SET) //CS

#define LCD_CS_Low() GPIO_Write(GPIOA,PIN3,GPIO_RESET)

#define LCD_REST_High() GPIO_Write(GPIOA,PIN4,GPIO_SET) //RES

#define LCD_REST_Low() GPIO_Write(GPIOA,PIN4,GPIO_RESET)

#define LCD_DC_High() GPIO_Write(GPIOA,PIN8,GPIO_SET) //DC

#define LCD_DC_Low() GPIO_Write(GPIOA,PIN8,GPIO_RESET)

#define LCD_SDI_High() GPIO_Write(GPIOA,PIN9,GPIO_SET) //DIN

#define LCD_SDI_Low() GPIO_Write(GPIOA,PIN9,GPIO_RESET)

#define LCD_SCK_High() GPIO_Write(GPIOA,PIN12,GPIO_SET)

//CLK

#define LCD_SCK_Low() GPIO_Write(GPIOA,PIN12,GPIO_RESET)

对所用引脚的功能配置函数为:

void  tft_gpio(void)
{   
GPIO_MODE_Init(GPIOA,PIN3,GPIO_MODE_OUTPUT);   
GPIO_MODE_Init(GPIOA,PIN4,GPIO_MODE_OUTPUT);
GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_OUTPUT);   
GPIO_MODE_Init(GPIOA,PIN9,GPIO_MODE_OUTPUT);   
GPIO_MODE_Init(GPIOA,PIN12,GPIO_MODE_OUTPUT);
}

image.png

图2器件连接

通过gpio口模拟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;
     delay_1us(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++;
    }
}

其显示50*50像素点图标的函数为:

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

其实现图3所示效果的主程序为:

int main(void)
{
    RESET->NRST_EN =0;
    CLIC_Init();
    SysClock_Crystal_Mode_Init(); 
    tft_gpio();
    tft_Init();
    LCD_Clear(RED);
    BACK_COLOR=RED;
    POINT_COLOR=YELLOW;
    LCD_ShowString(80,20,"CSM32RV003TEST");
    LCD_ShowString(80,280,"by:jinglixixi");
    show_tb(150,120,0);
    POINT_COLOR=WHITE;
    LCD_DrawLine(0, 50, 239, 50);
    LCD_DrawLine(0, 270, 239, 270);
    while(1);
}

image.png

图3 显示效果

由显示效果看,其性能该是较为令人满意的,有了TFT屏的显示功能,再进行程序方面的测试就会方便许多。

后续的任务就是完成串口的测试与使用及ADC的数据采集功能,是开发板的功能得以较全面的体现。

更多回帖

×
发帖