硬汉嵌入式论坛

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

[emWin] 发现OLED使用emWin时,没法使用函数WM_SetCreateFlags(WM_CF_MEMDEV),分享个解决办法

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-10 00:38:16 | 显示全部楼层 |阅读模式
没法使用函数WM_SetCreateFlags(WM_CF_MEMDEV),会导致窗口上刷新控件的时候会闪烁,看着不舒服。

而使用这个函数时,发现显示不正常。

解决办法是每100ms整体刷新一次屏幕即可,平时emWin都是直接操作OLED的显存空间(专门为其开辟一个128*64bit的显存空间)

  1. /*
  2. *********************************************************************************************************
  3. *  函 数 名: _cbTimer
  4. *  功能说明: 定时器回调函数
  5. *  形    参: pTM 消息指针
  6. *  返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void _cbTimer(GUI_TIMER_MESSAGE * pTM)
  10. {
  11.         switch (pTM->Context)
  12.         {
  13.                 case 0x01:
  14.                         /* 100ms刷新一次OLED */
  15.                         OLED_EndDraw();
  16.                         /* 此函数一定要调用,设置重新启动,要不仅执行一次 */
  17.                         GUI_TIMER_Restart(pTM->hTimer);
  18.                         break;
  19.                         
  20.                 default:
  21.                         break;
  22.         }
  23. }
复制代码

  1. /* 创建定时器 */
  2.     hTimer = GUI_TIMER_Create(_cbTimer, /* 回调函数 */
  3.                                   1,       /* 绝对时间,设置系统上电后 1ms 作为溢出时间 */
  4.                                    0x01,   /* 可以认为此参数是区分不同定时器的 ID,方便多个定时使用同一个回调函数 */
  5.                                    0);     /* 保留,暂时未用到 */
  6.         
  7.         /* 设置定时器周期为 1ms */
  8.         GUI_TIMER_SetPeriod(hTimer, 100);
复制代码


回复

使用道具 举报

9

主题

59

回帖

86

积分

初级会员

积分
86
发表于 2019-7-10 10:24:08 | 显示全部楼层
又学到一个新函数。。
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2019-7-10 13:49:57 | 显示全部楼层
我记得裸机模式下,不用emwin这种,一般也都会这样定时刷新
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
 楼主| 发表于 2019-7-10 14:21:27 | 显示全部楼层
myxiaonia 发表于 2019-7-10 13:49
我记得裸机模式下,不用emwin这种,一般也都会这样定时刷新

对,就是把裸机的思路直接用到emWin上了。
回复

使用道具 举报

9

主题

59

回帖

86

积分

初级会员

积分
86
发表于 2019-7-20 14:30:18 | 显示全部楼层
eric2013 发表于 2019-7-10 14:21
对,就是把裸机的思路直接用到emWin上了。

我看过这个移植的代码,没有看到哪里有刷新数据到LCD的函数,EMWIN只是把数据写到了缓存。。

*********************************************************************************************************
*        函 数 名: AppTaskGUIRefresh
*        功能说明: emWin刷新函数                                            
*        形    参:p_arg 是在创建该任务时传递的形参
*        返 回 值: 无
*   优 先 级:OS_CFG_PRIO_MAX - 3u
*********************************************************************************************************
*/
extern __IO uint8_t s_ucRA8875BusyNow;
static void AppTaskGUIRefresh(void *p_arg)
{
        (void)p_arg;                /* 避免编译器告警 */
                 
        while (1)
        {
//             /* RA8875 触摸*/
//                 if (g_ChipID == IC_8875)
//                 {
//                     /* 资源共享标志 */
//                         if(s_ucRA8875BusyNow == 0)
//                         {
//                                 GUI_TOUCH_Exec();       
//                         }
//                 }
//                 /* XPT2046 */
//                 else
//                 {
//                         GUI_TOUCH_Exec();       
//                 }

        BSP_OS_TimeDlyMs(20);
    }                                                 
}

是这个吗硬汉老师,但是确实美看到LCD刷新函数在哪里调用的。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
 楼主| 发表于 2019-7-21 09:28:38 | 显示全部楼层
chenlijian80 发表于 2019-7-20 14:30
我看过这个移植的代码,没有看到哪里有刷新数据到LCD的函数,EMWIN只是把数据写到了缓存。。

******** ...

在这个帖子里面:

http://www.armbbs.cn/forum.php?m ... &highlight=OLED
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 07:10 , Processed in 0.219250 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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