|
最近在使用SPINBOX控件和EDIT控件的时候,遇到了光标不反色和不跳动的问题。当时想到读点函数的问题,就测试了读点函数
读点
经过验证,没有问题。
后面仿真的时候,SPINBOX控件和EDIT控件显示自始至终都没有调用这个函数。
这时候就肯定是移植的时候底层接口函数有问题。底层接口实际上只使用读点画点函数就够了,为了速度,也优化了好几个函数,参考了armfly的代码。
于是关掉优化,只使用读点画点函数测试,读点函数就被正常的调用了,反色正常,光标闪烁也正常了。但是速度就不尽人意了。另外发现光标部分是通过 _FillRect调用读点函数的。
所以问题极有可能出现在 _FillRect函数里。
下面的就是我使用的 _FillRect矩形填充函数,使用了8875的BTE功能
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
#if EMWIN_OPTIMIZE
u8 v;
s_ucRA8875BusyNow = 1;
RA8875->REG = 0x41;
v = RA8875->RAM;
if((v & 0x01)==0)
BTE_SetTarBlock(x0, y0, y1-y0+1, x1-x0+1, 0);
else
BTE_SetTarBlock(x0, y0, y1-y0+1, x1-x0+1, 1);
BTE_SetOperateCode(0x0C);
RA8875_SetFrontColor(LCD_COLORINDEX);
BTE_Start();
BTE_Wait();
s_ucRA8875BusyNow = 0;
#else
LCD_PIXELINDEX PixelIndex;
int x;
PixelIndex = LCD__GetColorIndex();
if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
for (; y0 <= y1; y0++) {
for (x = x0; x <= x1; x++) {
_XorPixel(pDevice, x, y0);
}
}
} else {
for (; y0 <= y1; y0++) {
for (x = x0; x <= x1; x++) {
_SetPixelIndex(pDevice, x, y0, PixelIndex);
}
}
}
#endif
}
仔细看了下,问题就出在这个函数。
眼尖同仁的也应该看出来了,GUI自带的部分,在操作之前,会有个判断GUI_pContext->DrawMode & LCD_DRAWMODE_XOR,需要异或就进_XorPixel(),另一种不需要就进画点函数_SetPixelIndex(),显然,我这里不做判断直接使用BTE对该区域全部纯色填充,肯定有问题。修改后,代码如下:
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
#if EMWIN_OPTIMIZE
u8 v;
#endif
LCD_PIXELINDEX PixelIndex;
int x;
PixelIndex = LCD__GetColorIndex();
if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
for (; y0 <= y1; y0++) {
for (x = x0; x <= x1; x++) {
_ XorPixel(pDevice, x, y0);
}
}
} else {
#if EMWIN_OPTIMIZE
s_ucRA8875BusyNow = 1;
RA8875->REG = 0x41;
v = RA8875->RAM;
if((v & 0x01)==0)
BTE_SetTarBlock(x0, y0, y1-y0+1, x1-x0+1, 0);
else
BTE_SetTarBlock(x0, y0, y1-y0+1, x1-x0+1, 1);
BTE_SetOperateCode(0x0C);
RA8875_SetFrontColor(LCD_COLORINDEX);
BTE_Start();
BTE_Wait();
s_ucRA8875BusyNow = 0;
#else
for (; y0 <= y1; y0++) {
for (x = x0; x <= x1; x++) {
_SetPixelIndex(pDevice, x, y0, PixelIndex);
}
}
#endif
}
}
更改后,仿真调式,光标正常了,填充的速度也快了。
这就是我使用SPINBOX控件和EDIT控件遇到光标不反色的问题和解决的办法。
希望能帮到遇到过此问题的坛友。 |
|