第七九天 2015年10月14日 周三 主题:TFTLCD打包
一、重要结构体
[mw_shl_code=c,true]//LCD重要参数集
typedef struct
{
u16 width; //LCD 宽度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
u16 wramcmd; //开始写gram指令
u16 setxcmd; //设置x坐标指令
u16 setycmd; //设置y坐标指令
}_lcd_dev; [/mw_shl_code]
该结构体将屏幕相关使用、控制信息组合到一块进行管理,首先读取id信息,根据id对应相应手册进行寄存器控制;然后通过dir控制屏幕方向,width、height则根据id、dir分别赋值,将可显示区域界定下来;随后setxcmd、setycmd分别对应x、y坐标寄存器指令;最后,wramcmd控制gram的写入/读出。
二、打点函数实现过程
1.打点函数
[mw_shl_code=c,true]/*********************************************************************
功能 :画点
********************************************************************************************/
void LCD_DrawPoint(uint x, uint y)
{
LCD_SetCursor(x, y);
LCD_WriteRAM_Prepare();
LCD->LCD_RAM = POINT_COLOR;
}[/mw_shl_code]
2.其中,①LCD_SetCursor(x, y);设置光标函数(即打点位置)
[mw_shl_code=c,true]/*********************************************************************
功能 :设置光标位置
********************************************************************************************/
void LCD_SetCursor(uint Xpos, uint Ypos)
{
if(lcddev.id==0x9341 || lcddev.id==0x5310)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(Xpos >> 8);
LCD_WR_DATA(Xpos & 0xff);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos >> 8);
LCD_WR_DATA(Ypos & 0xff);
}
else if(lcddev.id==0x6804)
{
if(lcddev.dir == 1) //横屏时处理
{
Xpos = lcddev.width - 1 - Xpos;
}
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(Xpos >> 8);
LCD_WR_DATA(Xpos & 0xff);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos >> 8);
LCD_WR_DATA(Ypos & 0xff);
}
else if(lcddev.id==0x5510)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(Xpos >> 8);
LCD_WR_REG(lcddev.setxcmd+1);
LCD_WR_DATA(Xpos & 0xff);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos >> 8);
LCD_WR_REG(lcddev.setycmd+1);
LCD_WR_DATA(Ypos & 0xff);
}
else
{
if(lcddev.dir==1) //横屏其实就是调转x,y坐标
{
Xpos = lcddev.width - 1 - Xpos;
}
LCD_WriteReg(lcddev.setxcmd, Xpos);
LCD_WriteReg(lcddev.setycmd, Ypos);
}
}[/mw_shl_code]
②LCD_WriteRAM_Prepare();即写入GRAM命令
[mw_shl_code=c,true]/*********************************************************************
功能 :开始写GRAM
********************************************************************************************/
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG = lcddev.wramcmd;
}[/mw_shl_code]
③LCD->LCD_RAM=POINT_COLOR;即写入颜色。
2.基础函数,向TFTLCD写入数据,一般都是先写入寄存器命令,然后送入数据,七个基础函数如下
[mw_shl_code=c,true]/*********************************************************************
功能 :写寄存器函数
********************************************************************************************/
void LCD_WR_REG(vu16 regval)
{
regval = regval; //使用-O2优化的时候,必须插入的延时
LCD->LCD_REG = regval;
}
/*********************************************************************
功能 :写LCD数据
********************************************************************************************/
void LCD_WR_DATA(vu16 data)
{
data = data;
LCD->LCD_RAM = data;
}
/*********************************************************************
功能 :读LCD数据
********************************************************************************************/
uint LCD_RD_DATA(void)
{
uint ram;
ram = LCD->LCD_RAM;
return ram;
}
/*********************************************************************
功能 :向指定寄存器写
********************************************************************************************/
void LCD_WriteReg(vu16 LCD_Reg, vu16 LCD_RegValue)
{
LCD->LCD_REG = LCD_Reg;
LCD->LCD_RAM = LCD_RegValue;
}
/*********************************************************************
功能 :读指定寄存器
********************************************************************************************/
uint LCD_ReadReg(vu16 LCD_Reg)
{
LCD_WR_REG(LCD_Reg);
delay_us(5);
return LCD_RD_DATA();
}
/*********************************************************************
功能 :开始写GRAM
********************************************************************************************/
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG = lcddev.wramcmd;
}
/*********************************************************************
功能 :写入GRAM颜色
********************************************************************************************/
void LCD_WriteRAM(uint RGB_Code)
{
LCD->LCD_RAM = RGB_Code;
}[/mw_shl_code]
3.画线、圆等都是在打点的基础上进行操作,通过控制点阵的显示得到预期效果,同理,字符也是通过对点的控制来进行显示;每个点有16位真彩色,通过对需要显示点写入不同彩色值,从而呈现不同色彩线、圆、字符等效果。 |