关于 ucgui 的 lcd 驱动
ucgui 是一个分层结构的gui系统,大概可以分为以下几个层次
1、设备驱动层(LCD,键盘触摸屏等设备驱动)
2、基本显示层
3、在基本显示层上搭建的api层,字体等的显示
4、窗口管理和控件层
5、ap层
这里主要记录显示驱动层的相关事项.
ucgui的显示驱动层是显示的最下层,用户基本不用直接调用该层的接口,只有在移植和优化时要考虑修改和配置该层。ucgui的lcd 驱动层是支持多lcd显示的,GUI_NUM_LAYERS 宏来配置,GUI_NUM_LAYERS 最大为 5.
一、lcd驱动层的主要配置参数
#define LCD_XSIZE (640) /* lcd 的 X 方向的像素点数 */
#define LCD_YSIZE (480) /* lcd 的 Y 方向的像素点数 */
#define LCD_BITSPERPIXEL (8) /* lcd 上每个像素点占的位数 */
#define LCD_CONTROLLER 1375 /* lcd 控制器id号 */
#define GUI_NUM_LAYERS /* lcd 的分层数目 */
GUI_NUM_LAYERS 这个参数是分层显示的层数,ucgui中层可以是虚拟的显示层,也可以是实际的lcd屏。这取决于各个层的接口函数。
二、lcd驱动需要提供的函数接口
lcd驱动层要实现以下类型的接口函数
typedef LCD_COLOR tLCDDEV_Index2Color (int Index);
typedef unsigned int tLCDDEV_Color2Index (LCD_COLOR Color);
typedef unsigned int tLCDDEV_GetIndexMask (void);
typedef void tLCDDEV_DrawBitmap (int x0, int y0, int xsize, int ysize,
int BitsPerPixel, int BytesPerLine,
const U8 GUI_UNI_PTR * pData, int Diff,
const void* pTrans); /* Really LCD_PIXELINDEX, but is void to avoid compiler warnings*/
typedef void tLCDDEV_DrawHLine (int x0, int y0, int x1);
typedef void tLCDDEV_DrawVLine (int x , int y0, int y1);
typedef void tLCDDEV_FillRect (int x0, int y0, int x1, int y1);
typedef unsigned int tLCDDEV_GetPixelIndex(int x, int y);
typedef void tLCDDEV_SetPixelIndex(int x, int y, int ColorIndex);
typedef void tLCDDEV_XorPixel (int x, int y);
typedef void tLCDDEV_FillPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
typedef void tLCDDEV_FillPolygonAA(const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
typedef void tLCDDEV_GetRect (LCD_RECT*pRect);
typedef int tLCDDEV_Init (void);
typedef int tLCDDEV_ReInit (void);
typedef void tLCDDEV_On (void);
typedef void tLCDDEV_Off (void);
typedef void tLCDDEV_SetLUTEntry (U8 Pos, LCD_COLOR color);
lcd驱动各个类型的接口函数的功能
tLCDDEV_On 打开 lcd
tLCDDEV_Off 关闭 lcd
tLCDDEV_ReInit 重新初始化 lcd,不清除lcd显示内容
tLCDDEV_Init 初始化lcd,该是在初始化时被调用的,调用路径为GUI_Init->LCD_Init->LCD_L0_Init
typedef void tLCDDEV_DrawBitmap(int x0, int y0, int xsize, int ysize,
int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR * pData, int Diff, const void* pTrans);
功能:绘制位图
参数:
x0, y0 位图的左上角坐标
xsize, ysize 位图宽度和高度
BitsPerPixel 位图每个像素点占的位数
BytesPerLine 位图每行的字节数
pData 位图数据指针
Diff 从左侧开始跳过的像素数
pTrans 颜色转换表
typedef LCD_COLOR tLCDDEV_Index2Color (int Index);
将颜色索引转换成颜色值
typedef unsigned int tLCDDEV_Color2Index (LCD_COLOR Color);
将颜色值转换成颜色索引
typedef unsigned int tLCDDEV_GetIndexMask (void);
得到颜色索引的屏蔽字
typedef void tLCDDEV_DrawHLine (int x0, int y0, int x1);
功能:画一条水平线
参数:
x0 起点x坐标
x1 终点x坐标
y0 横线的y坐标
typedef void tLCDDEV_DrawVLine (int x , int y0, int y1);
功能:画一条垂直线
参数:
x 垂直线的x坐标
y0 起点y坐标
y1 终点y坐标
typedef void tLCDDEV_FillRect (int x0, int y0, int x1, int y1);
功能:填充一个矩形
参数:
x0 , y0 矩形的左上角坐标
x1 , y1 矩形的右上角坐标
typedef unsigned int tLCDDEV_GetPixelIndex(int x, int y);
读取给定点的颜色的索引
typedef void tLCDDEV_SetPixelIndex(int x, int y, int ColorIndex);
以给定的颜色在指定的点画一个像素点
typedef void tLCDDEV_XorPixel (int x, int y);
反现指定点的像素
typedef void tLCDDEV_FillPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
填充一个多边形
typedef void tLCDDEV_FillPolygonAA(const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
带抗锯齿功能的填充多边形
typedef void tLCDDEV_GetRect (LCD_RECT*pRect);
得到lcd的显示区域
typedef void tLCDDEV_SetLUTEntry (U8 Pos, LCD_COLOR color);
修改lcd控制器的LUT条目
lcd 信息函数接口,每个显示层都应该提供lcd信息函数
lcd 0层信息接口函数名如下:
int LCD_GetXSize(void)
读取lcd的物理宽度(像素值)
int LCD_GetYSize(void)
读取lcd的物理高度(像素值)
int LCD_GetVXSize(void)
读取lcd的虚拟宽度
int LCD_GetVYSize(void)
读取lcd的虚拟高度
int LCD_GetBitsPerPixel(void)
读取lcd每个像素的位数
U32 LCD_GetNumColors(void)
读取lcd颜色的数目
int LCD_GetYMag(void)
读取lcd虚拟高度的放大因子
int LCD_GetXMag(void)
读取lcd虚拟宽度的放大因子
int LCD_GetFixedPalette(void)
读取固定调试板的模式
lcd 1-4层信息函数接口名如下:?=1,2,3,4
int LCD_GetXSize_?(void)
int LCD_GetYSize_?(void)
int LCD_GetVXSize_?(void)
int LCD_GetVYSize_?(void)
int LCD_GetBitsPerPixel_?(void)
U32 LCD_GetNumColors_?(void)
int LCD_GetYMag_?(void)
int LCD_GetXMag_?(void)
int LCD_GetFixedPalette_?(void)
三、lcd驱动的多屏显示支持
ucgui有支持多屏显示的能力,最多可以支持5个显示屏,当GUI_NUM_LAYERS=1时,只有一个显示层,这时接口函数
直接调用第0层的函数,当GUI_NUM_LAYERS>1时,相应层要提供一个接口结构体,每个结构体包含一层的显示函数指针,
所有层的结构组成一个数组,通过显示层的索引了确定调用那个层的接口显示