根据原子哥的自己动手写了个如下:
typedef struct
{
u16 CMD; //写命令
u16 DATA; //写数据
}RS;
#define LCD ((RS *)((u32)(0x6c0007fe)))
void LCD_WR_CMD(u16 cmd)
{
LCD->CMD=cmd;
}
void LCD_WR_DATA(u16 data)
{
LCD->DATA=data;
}
u16 LCD_RD_DATA(void)
{
return LCD->DATA;
}
void LCD_WR_Register(u16 cmd,u16 data)
{
LCD->CMD=cmd;
LCD->DATA=data;
}
void Write_RAM_Start(void)
{
LCD_WR_CMD(0x2c);
}
//LCD Display Status
void LCD_Display(u8 dis)
{
switch(dis)
{
case 0 CD_WR_CMD(0x29);break;//Display ON
case 1 CD_WR_CMD(0x28);break;//Display OFF
default:break;
}
}
void LCD_SetCursor(u16 xpos,u16 ypos)//定点函数
{
LCD_WR_CMD(0x2a);
LCD_WR_DATA(xpos>>8);
LCD_WR_DATA(xpos&0xff);
LCD_WR_CMD(0x2b);
LCD_WR_DATA(ypos>>8);
LCD_WR_DATA(ypos&0xff);
}
void LCD_Scan_Direction(void) //GRAM 显示方向 (LCD扫描方向)左到右 上到下(默认竖屏)
{
LCD_WR_Register(0x36,0x0a);
LCD_WR_CMD(0x2a);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((320-1)>>8);LCD_WR_DATA((320-1)&0XFF);
LCD_WR_CMD(0x2b);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((480-1)>>8);LCD_WR_DATA((480-1)&0XFF);
}
void LCD_DrawPoint(u16 xpos,u16 ypos,u16 color)//画点
{
LCD_SetCursor(xpos,ypos);
Write_RAM_Start();
LCD_WR_DATA(color);
}
void LCD_Init(void)
{
……
//这里省略一些寄存器配置和驱动初始化代码
LCD_Scan_Direction();
BackLight=1;
LCD_Clear(WHITE); //这里有问题了
}
void LCD_Clear(u16 color)//清屏函数
{
u16 i;
LCD_SetCursor(0x0000,0x0000);
Write_RAM_Start();
for(i=0;i<320*480;i++)
{
LCD->DATA=color;
}
}
其他函数略
上电调试发现,LCD初始化函数中执行清屏函数的时候,如上面红字部分出问题了,用j-link仿真发现for循环一直在进行不能结束,初步怀疑是GRAM显示方向函数(LCD扫描)有问题,
但这个函数(如上绿色部分)是根据原子哥的简化而来,不知道哪里有问题,求大神指导!
|