查看: 4143|回复: 11

[主题月] 【2021年度庆典三】动态显示屏的局部刷新

[复制链接]
  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 1487 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93291
    最后登录
    2024-5-11
    发表于 2021-12-30 18:10:23 | 显示全部楼层 |阅读模式
    本帖最后由 stm1024 于 2021-12-30 18:29 编辑

    又到了年底了,回头看看这一年,感觉又是稀里糊涂中度过的……不过最近各路大佬都踊跃参加活动,也让我见识到了不少大佬的风采,年终庆典说到用显示屏的事儿,我也参与一下,其实总感觉这事儿吧,我也玩不出啥花样出来,有点千篇一律的感觉。但是呢,最近由于自己装逼好为人师,总觉得吧,自己说了又没说清楚,还不如不说,既然这样,我就献丑了。

    故事的起因是看到@jundao721大佬做了一个动态的小广告牌,原链接是:【2021年度庆典三】+ LPC54114 基于u8g2小屏动态广告牌
    他的想法还是很有创意的,但是我就bb说全屏刷新效果不好,建议局部刷新,可能没说的太清楚,所以值此机会,先阐述一下实现方法和显示效果,供大家参考。

    先看两种效果吧:
    全局 00_00_00-00_00_30.gif 局部 00_00_00-00_00_30.gif

    上边的一种是全局刷新,下边一种是局部刷新,这里所说的全局刷新是指的将整个显示屏先清屏,然后再将所有内容重绘;而局部刷新是根据需要更新的区域重绘。两种的更新周期都是100ms,但是实际测试发现全局刷新时,100ms都有点吃力,感觉没有跑出100ms的效果,右边就感觉丝滑很多
    当然,之前使用的是LPC54114,我这里使用的是LPC54608,而且看样子原来使用的是SPI协议,我这里使用的是I2C协议。
    不过咱们抛开事实不谈,呃,抛开硬件差异不谈,就说说原理吧。

    局部刷新实现原理其实也很简单,大概是这么回事儿:
    例如上面的这个图,中间的“淡定”是一直保持不变的,但是这个小X会一直更新,那么我们可以这样:
    先用“橡皮擦”将原来位置的小X清除,然后再在新的位置画X,至于中间的图形,没变化我就不更新,这样数据操作量将会小很多。
    以上面的这个为例,图片尺寸是128*64像素,则需要用的字节数是128*64/8=1024字节。
    如果我只更新这个小X,是一个8*8的小区域,则擦除用到的字节是8*8/8=8字节,再加上绘制新的,也是8字节,则一次操作是16字节。
    相比较而言,可以提高的倍数是1024/16=64。
    现在问题是,那个“橡皮擦”是啥?
    其实你可以把它理解为一个图形,我们看到的像素,1的位置是被点亮,0的位置是熄灭的,那么我们就给指定的区域发送8个0x00的字节,不就把这一块区域清空了嘛。然后我们再在新的位置绘制那个小X,就像是X在移动一样(眼睛被欺骗了)。
    废话这么多,直接上代码:
    首先是全局刷新:
    1. uint8_t cx=0,cy=0,direction=0;//当前的XY值
    2.         SSD1306_ShowImg(0,0,128,8,BMP1);
    3.         SSD1306_ShowImg(cx,cy,cx+8,cy+1,X88);
    4.         while(1)
    5.         {
    6. SSD1306_Clear(); //
    7. SSD1306_ShowImg(0,0,128,8,BMP1);//
    8. //SSD1306_ShowImg(cx,cy,cx+8,cy+1,BLANK88);//clear previous 'X'
    9.                 switch(direction)
    10.                 {
    11.                         case 0://at top, go right
    12.                         {                        
    13.                                 if(cx==120)//right border
    14.                                         direction=1;
    15.                                 else
    16.                                         cx+=8;                                
    17.                                 break;
    18.                         }
    19.                         case 1://at right, go down
    20.                         {
    21.                                 if(cy==7)
    22.                                         direction=2;
    23.                                 else
    24.                                         cy++;
    25.                                 break;
    26.                         }
    27.                         case 2://at bottom,go left
    28.                         {
    29.                                 if(cx==0)
    30.                                         direction=3;
    31.                                 else
    32.                                         cx-=8;                                
    33.                                 break;
    34.                         }
    35.                         case 3://at left, go up
    36.                         {
    37.                                 if(cy==0)
    38.                                         direction=0;
    39.                                 else
    40.                                         cy--;
    41.                                 break;
    42.                         }
    43.                 }
    44.                 SSD1306_ShowImg(cx,cy,cx+8,cy+1,X88);//draw new 'X'
    45.                
    46.                 LED_Toggle(3);
    47.                 **elay_ms(100);
    复制代码
    留意这三行就行了,后面的都是控制下一个X显示的位置的:
    • SSD1306_Clear(); //
    • SSD1306_ShowImg(0,0,128,8,BMP1);//
    • //SSD1306_ShowImg(cx,cy,cx+8,cy+1,BLANK88);//clear previous 'X'
    全局刷新使用了Clear,这样的所有的区域都要重绘,所以会看到左图中的效果,如果把这两行注释掉,再把蓝色的那一会取消注释,就可以实现局部刷新了。

    最后,祝大家虎年都虎起来。
    7b14eaecc46db4f9aecf8809b74000b.jpg





    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 16:53
  • 签到天数: 1338 天

    [LV.10]以坛为家III

    88

    主题

    4296

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9067
    最后登录
    2024-5-11
    发表于 2021-12-30 23:27:35 | 显示全部楼层
    新年快乐
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    91

    主题

    2941

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    7842
    最后登录
    2024-5-11
    发表于 2021-12-31 08:55:05 | 显示全部楼层
    拜读了,又学习了新方法,谢谢,我抓紧时间试一试。
    加油哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3312

    主题

    6566

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32204
    最后登录
    2024-5-11
    发表于 2021-12-31 09:12:49 | 显示全部楼层
    这个小老虎真不错!新年快乐!
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 1487 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93291
    最后登录
    2024-5-11
     楼主| 发表于 2021-12-31 10:33:17 | 显示全部楼层

    新年快乐,同乐同乐~~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 1487 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93291
    最后登录
    2024-5-11
     楼主| 发表于 2021-12-31 10:33:37 | 显示全部楼层
    NXP管管 发表于 2021-12-31 09:12
    这个小老虎真不错!新年快乐!

    新年快乐,同乐同乐~~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 1487 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93291
    最后登录
    2024-5-11
     楼主| 发表于 2021-12-31 10:36:01 | 显示全部楼层
    jundao721 发表于 2021-12-31 08:55
    拜读了,又学习了新方法,谢谢,我抓紧时间试一试。

    大佬以后也教教我搞PCB板子,打算2022年自己做块板子玩一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 1487 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93291
    最后登录
    2024-5-11
     楼主| 发表于 2021-12-31 10:36:02 | 显示全部楼层
    jundao721 发表于 2021-12-31 08:55
    拜读了,又学习了新方法,谢谢,我抓紧时间试一试。

    大佬以后也教教我搞PCB板子,打算2022年自己做块板子玩一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-8 09:39
  • 签到天数: 217 天

    [LV.7]常住居民III

    92

    主题

    1114

    帖子

    29

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7803

    热心会员

    最后登录
    2024-5-6
    发表于 2021-12-31 10:38:57 | 显示全部楼层
    这种方式叫脏矩形吧,好用是好用,不过自己写界面用这个太复杂了,有些gui库有这个支持
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 1487 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93291
    最后登录
    2024-5-11
     楼主| 发表于 2021-12-31 10:40:49 | 显示全部楼层
    az158 发表于 2021-12-31 10:38
    这种方式叫脏矩形吧,好用是好用,不过自己写界面用这个太复杂了,有些gui库有这个支持 ...

    是的,包括windows系统,其实都是用到了类似的原理。当然还有双缓存等,不过在这种嵌入式里面不一定好使。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-11 23:59 , Processed in 0.141818 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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