在掌握了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
图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);
}
图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);
}
图3 显示效果
由显示效果看,其性能该是较为令人满意的,有了TFT屏的显示功能,再进行程序方面的测试就会方便许多。
后续的任务就是完成串口的测试与使用及ADC的数据采集功能,是开发板的功能得以较全面的体现。