硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6646|回复: 9
收起左侧

[emWin] 使用RA8875时,EDIT和SPINBOX控件光标反色和闪烁的问题

[复制链接]

3

主题

31

回帖

13

积分

新手上路

积分
13
发表于 2014-12-13 17:22:50 | 显示全部楼层 |阅读模式
最近在使用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控件遇到光标不反色的问题和解决的办法。
希望能帮到遇到过此问题的坛友。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2014-12-13 17:25:15 | 显示全部楼层
谢谢楼主分享经验,盖章,置酷
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2014-12-13 17:28:46 | 显示全部楼层
[s:151] [s:151] [s:151] [s:151]
代码不规范,亲人两行泪!
回复

使用道具 举报

3

主题

31

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2014-12-13 17:33:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:谢谢楼主分享经验,盖章,置酷&#160;(2014-12-13 17:25)&#160;
[s:142]
回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2015-1-10 21:06:23 | 显示全部楼层
谢谢分享,还没碰到过这样的问题,记号学习
回复

使用道具 举报

2

主题

31

回帖

37

积分

新手上路

积分
37
发表于 2015-1-22 21:13:22 | 显示全部楼层
留个几号,我的也遇到这个问题,明天解决  
多谢楼主。 [s:151]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2015-6-25 11:44:35 | 显示全部楼层
再次感谢楼主。
回复

使用道具 举报

100

主题

275

回帖

575

积分

金牌会员

积分
575
发表于 2015-6-25 14:48:20 | 显示全部楼层
原来这样啊。我上次还问为什么光标不闪烁呢,感谢楼主分享
回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2018-6-1 16:26:35 | 显示全部楼层
本帖最后由 lhb292 于 2018-6-1 17:08 编辑

if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR)显示有乱码
QQ截图20180601170809.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2018-6-2 01:35:03 | 显示全部楼层
lhb292 发表于 2018-6-1 16:26
if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR)显示有乱码

已经修正了。

也可以从论坛置顶帖V5开发板网盘里面任意下载一个emWin例子,已经修正这个问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 17:09 , Processed in 0.188315 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表