uC/GUI是Micrium公司的用户图形界面。它给可以方便的移植到基于uC/OS程序上。uC/GUI提供了2D图形库,字库,视窗管理器WM,PC外观控件,以及鼠标与触摸屏的支持。对于一些简单的基于嵌入式平台的应用程序设计可以采用它。
下面我来谈谈移植的过程:
1. 虽然uC/GUI可以使用在单任务环境中,但是它可以很好的和uC/OS兼容,所以我推荐先将uC/OS移植好。我的另一篇文章有实践的说明。
2. 写一个没有操作系统下的LCD驱动,我使用的是NEC的NL2432DR22-12B。我博客也有相关的介绍。
这里我再强调一下要点,因为GUI移植成败与它直接相关:
1) 初始化LCD的IO口
2) 开启LCD的背光
3) 配置LCDCON1,他主要设置的是vclk(hclk/(clkval+1)*2,clkval自定义),vclk‘一般应该大于6.5M。设置选择了TFT,16bbp的颜色深度等等
4) 配置LCDCON2,3,4。根据时序图(与LCD液晶datasheet相关)例如:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
设置:一下的字域:他们直接影响屏幕的偏移,可以手动慢慢调试也可以计算:
#define VFPD (1) //垂直同步信号的前肩
#define VSPW (1) //垂直同步信号的脉宽
#define HBPD (22) //水平同步信号的后肩
#define HFPD (18) //水平同步信号的前肩
#define HSPW (18) //水平同步信号的脉宽
方法如下:
VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。
VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,
是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。
VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。如图,VSPW=t2/t6=0.06 ms/31.77μs=2。
HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,如图,VBPD=t7×VCLK=1.89 μs×25MHz=47。
HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz="24"。
HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz="94"。
3.正式开始移植uC/GUI:
1)配置config下的LCDConf.h。设置LCD的Xsize和Ysize:
#define LCD_XSIZE (320) /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE (240) /* Y-resolution of LCD, Logical coor. */
设置LCD的总线宽度,等宏
还有一些其他设置,与具体LCD相关。
2) 配置config下的GUIConf.h:
设置GUI的支持,如是否用到WM等。
设置默认字体,背景色,前景色等。
3)将已经调试成功的裸机下的LCD移植进来,改写LCDDriver下的LCDSLin.c。
并且完成GUI要求的借口函数:
LCD_L0_SetPixelIndex
LCD_L0_GetPixelIndex
LCD_L0_XorPixel
LCD_L0_DrawHLine
LCD_L0_DrawVLine
LCD_L0_FillRect
LCD_L0_DrawBitmap
LCD_L0_SetOrg
LCD_L0_Init
LCD_On
LCD_Off
示例:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {
PutPixel(x,y,PixelIndex);
}
static void PutPixel(U32 x,U32 y,U<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />32 c)
{
if ( (x < SCR_XSIZE_TFT_240320) && (y < SCR_YSIZE_TFT_240320) )
LCD_BUFER[(y)][(x)] = c;
}
void LCD_L0_DrawHLine (int x0, int y, int x1) {
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
for (; x0 <= x1; x0++) {
LCD_L0_XorPixel(x0, y);
}
} else {
for (; x0 <= x1; x0++) {
LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);
}
}
}
完成这些借口函数后,设置相关宏使其可以被LCD_Private.h正常条用,驱动函数应该接入LCD.c下对应的函数中。可以仿真调试看LCD.c中GUI的一些常用绘图函数能否正常的调用自己写的驱动函数。如果可以经正常调用,那么驱动就基本移植成功了。
效果图:
用户539229 2009-5-23 14:01
用户192790 2009-5-21 16:11