RA4M2-SENSOR提供了SPI接口,以控制相应的外设,该接口如图1所示。
为保证后续以SPI方式驱动显示屏,先使用该接口以模拟的方式来实现显示屏的驱动。

图1 SPI接口
TFT显示屏与接口的连接关系为:
MOSI----P101
SCK- ---P102
CS----P014
DC----P015
RST----P500
为配置所用的引脚,需所用RASC对引脚加以配置,并生成相应的KEIL工程,见图2所示。

图2 引脚配置
为编译程序设计,对相关引脚输出高低电平的语句定义为:
#define lcd_CS_l()R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_LOW)
#define lcd_CS_h() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH)
#define lcd_RS_l()R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_15, BSP_IO_LEVEL_LOW)
#define lcd_RS_h() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_00_PIN_15, BSP_IO_LEVEL_HIGH)
#define lcd_RST_l()R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_05_PIN_00, BSP_IO_LEVEL_LOW)
#define lcd_RST_h() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_05_PIN_00, BSP_IO_LEVEL_HIGH)
#define lcd_SDI_l()R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_LOW)
#define lcd_SDI_h() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_HIGH)
#define lcd_SCK_l()R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_LOW)
#define lcd_SCK_h() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_02, BSP_IO_LEVEL_HIGH)
模拟SPI方式发送字节数据的函数为:
void LCD_Writ_Bus(unsigned char com)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(com & 0x80)
{
lcd_SDI_h();
}
else
{
lcd_SDI_l();
}
com = com << 1;
lcd_SCK_l();
lcd_SCK_h();
}
}
显示屏的初始化函数为:
void init_lcd(void)
{
lcd_CS_h();
lcd_RST_l();
R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);
lcd_RST_h();
R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);
lcd_write_reg(0x11);
R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS);
lcd_CS_l();
lcd_write_reg(0xB1);
lcd_write_dat8(0x01);
lcd_write_dat8(0x2C);
lcd_write_dat8(0x2D);
lcd_write_reg(0xB2);
lcd_write_dat8(0x01);
lcd_write_dat8(0x2C);
lcd_write_dat8(0x2D);
lcd_write_reg(0xB3);
lcd_write_dat8(0x01);
lcd_write_dat8(0x2C);
lcd_write_dat8(0x2D);
lcd_write_dat8(0x01);
lcd_write_dat8(0x2C);
lcd_write_dat8(0x2D);
lcd_write_reg(0xB4);
lcd_write_dat8(0x07);
lcd_write_reg(0xC0);
lcd_write_dat8(0xA2);
lcd_write_dat8(0x02);
lcd_write_dat8(0x84);
lcd_write_reg(0xC1);
lcd_write_dat8(0xC5);
lcd_write_reg(0xC2);
lcd_write_dat8(0x0A);
lcd_write_dat8(0x00);
lcd_write_reg(0xC3);
lcd_write_dat8(0x8A);
lcd_write_dat8(0x2A);
lcd_write_reg(0xC4);
lcd_write_dat8(0x8A);
lcd_write_dat8(0xEE);
lcd_write_reg(0xC5);
lcd_write_dat8(0x0E);
lcd_write_reg(0x36);
lcd_write_dat8(0xC0);
lcd_write_reg(0xe0);
lcd_write_dat8(0x0f);
lcd_write_dat8(0x1a);
lcd_write_dat8(0x0f);
lcd_write_dat8(0x18);
lcd_write_dat8(0x2f);
lcd_write_dat8(0x28);
lcd_write_dat8(0x20);
lcd_write_dat8(0x22);
lcd_write_dat8(0x1f);
lcd_write_dat8(0x1b);
lcd_write_dat8(0x23);
lcd_write_dat8(0x37);
lcd_write_dat8(0x00);
lcd_write_dat8(0x07);
lcd_write_dat8(0x02);
lcd_write_dat8(0x10);
lcd_write_reg(0xe1);
lcd_write_dat8(0x0f);
lcd_write_dat8(0x1b);
lcd_write_dat8(0x0f);
lcd_write_dat8(0x17);
lcd_write_dat8(0x33);
lcd_write_dat8(0x2c);
lcd_write_dat8(0x29);
lcd_write_dat8(0x2e);
lcd_write_dat8(0x30);
lcd_write_dat8(0x30);
lcd_write_dat8(0x39);
lcd_write_dat8(0x3f);
lcd_write_dat8(0x00);
lcd_write_dat8(0x07);
lcd_write_dat8(0x03);
lcd_write_dat8(0x10);
lcd_write_reg(0x2a);
lcd_write_dat8(0x00);
lcd_write_dat8(0x00);
lcd_write_dat8(0x00);
lcd_write_dat8(0x7f);
lcd_write_reg(0x2b);
lcd_write_dat8(0x00);
lcd_write_dat8(0x00);
lcd_write_dat8(0x00);
lcd_write_dat8(0x9f);
lcd_write_reg(0xF0);
lcd_write_dat8(0x01);
lcd_write_reg(0xF6);
lcd_write_dat8(0x00);
lcd_write_reg(0x3A);
lcd_write_dat8(0x05);
lcd_write_reg(0x29);
}
色彩清除屏幕的函数为:
void Lcd_Clear(Color)
{
uint16_t i,j;
lcd_address_set(0,0,128-1,160-1);
lcd_write_reg(0x2c);
for(i=0;i<128;i++)
{
for(j=0;j<160;j++)
{
lcd_write_dat16(Color);
}
}
}
字符显示函数为:
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
uint8_t temp,sizex,t,m=0;
uint16_t i,TypefaceNum;
uint16_t x0=x;
sizex=sizey/2;
TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
num=num-' ';
lcd_address_set(x,y,x+sizex-1,y+sizey-1);
for(i=0;i<TypefaceNum;i++)
{
if(sizey==16) temp=asc2_1608[num*16+i];
for(t=0;t<8;t++)
{
if(!mode)
{
if(temp&(0x01<<t))lcd_write_dat16(fc);
else lcd_write_dat16(bc);
m++;
if(m%sizex==0)
{
m=0;
break;
}
}
else
{
if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);
x++;
if((x-x0)==sizex)
{
x=x0;
y++;
break;
}
}
}
}
}
字符串显示函数为:
void LCD_ShowString(uint16_t x,uint16_t y,const uint8_t *p,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
while(*p!='\\\\\\\\0')
{
LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
x+=sizey/2;
p++;
}
}
实现显示测试的主程序为:
void hal_entry(void)
{
init_lcd();
Lcd_Clear(RED);
LCD_ShowChar(10,10,'V',YELLOW ,RED,16,0);
LCD_ShowIntNum(20,10,123,3,WHITE,RED,16);
LCD_ShowString(10,30,"RA4M2-SENSOR",YELLOW ,RED,16,0);
LCD_ShowFloatNum1(10,50,30.1415926,4,WHITE,RED,16);
while (1);
}
经程序的编译和下载,其测试效果如图3所示,说明驱动有效。

图3 显示效果