搜索
bottom↓
回复: 65

关于滚动字幕算法

  [复制链接]

出0入0汤圆

发表于 2014-11-21 20:47:00 | 显示全部楼层 |阅读模式
本帖最后由 yunjie167 于 2014-11-21 21:13 编辑

滚动字幕以前在16x16点阵上做过实验,可后来想把移到液晶屏上面.之前算法已经完全过时了,那究竟怎么才能写个通用算法呢?
以下提供一种思路(ps.是我按照自己的想法实现的,因为我也不知道实现它的最佳算法是什么)


以16x16汉字点阵为例

若想汉字滚动,我觉得若我们有个显示缓存那就方便多了,先通过画点函数在缓存里把要显示的字符点阵存进去.

例如定义
  1. static char VirDispRAM[FONTSIZE][192]; //构建一个虚拟显示器缓存,用于显示滚动字幕
复制代码

还需要一个结构体

  1. /*
  2. x,y表示想在屏幕某个位置显示字符
  3. xsize表示长度,例如是80
  4. ysize其实就是你的字体宽度FONTSIZE
  5. endX是你要显示字符串的最大列下标
  6. 例如显示"这个滚动字幕测试程序hello"
  7. 那么endX就是10个汉字和5个ASCII字符的宽度等于25*8=200再减1
  8. spaceN表示当字符串尾与字符串头之间的空列的数目
  9. */
  10. struct RollStr_T {
  11.         short x,y,xsize,ysize;
  12.         short virX;
  13.         short endX;
  14.         short decS;
  15.         short spaceN;
  16.   u16   bkcolor;
  17.   u16   frcolor;
  18. };
复制代码


因此我们得需要一个函数负责把字符串填充到VirDispRAM数组中
  1. void DispStringAtVir(u16  x0,u16 y0,u16  xsize,u16  ysize,u16 space, char *p,u16 frColor,u16 bkColor);
复制代码


DispStringAtVir(15,20,100,FONTSIZE,40,"这个滚动字幕测试程序hello",White,Blue);

调用这个函数只把"这个滚动字幕测试程序hello"字符串写入VirDispRAM[FONTSIZE][192]缓存

接下来就重要了也是比较简单的,就是把VirDispRAM一列一列的往屏幕上填充

每次填充完xsize宽度时候整个数据搬运就完成了,下次循环时候就继续下个偏移位置搬移.

贴出图片,其中上面那个"滚动算法#% Roll Alth!XYZ!@#$%^&"是固定的
  DispStringAtVir(15,90,250,16,80,"利用缓冲区实现的屏幕滚动字幕算法 ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?<>/\\",White,Blue);
这个是字符串是滚动显示的.滚动速度通过定时器来控制.


总结下:就是先定义一个缓存,把要显示的字符以点阵形式存放在数组里,然后一列一列往屏幕上搬移就能实现滚动效果了,这样写法很方便移植到其他硬件平台.

如果您有更好的方法,不妨交流下~





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-11-21 21:04:04 | 显示全部楼层
楼主的方法和我的一样,我以前写过PDA上面的,类似的。

出0入0汤圆

发表于 2014-11-21 21:04:33 | 显示全部楼层
算法过期是什么意思啊。

出0入0汤圆

 楼主| 发表于 2014-11-21 21:09:18 | 显示全部楼层
brieve 发表于 2014-11-21 21:04
算法过期是什么意思啊。

我之前老是想1个字节一个字节往屏幕上打印,可是后来我发现有的液晶屏是横向取模有的是纵向,这样话我的算法得重现写了,后来干脆在直接写成打点函数,往屏幕任何位置打点不就不用考虑取模的问题了么.

出0入442汤圆

发表于 2014-11-22 03:20:17 来自手机 | 显示全部楼层
对的。滑动窗口永远都是效率最高的实现方法。

出0入0汤圆

发表于 2014-11-22 07:19:46 来自手机 | 显示全部楼层
一个指针的问题。

出0入0汤圆

发表于 2014-11-22 13:26:49 | 显示全部楼层
定义大数组开辟缓存在PIC16上面是不可以的。但是我是分成两个小的数组来处理。不过效率可低。不知道有没更好的解决办法

出0入4汤圆

发表于 2014-11-22 17:59:29 | 显示全部楼层
参考下,谢谢。

出0入264汤圆

发表于 2014-11-22 18:11:46 | 显示全部楼层
http://v.youku.com/v_show/id_XNzY4MTY0NTU2.html

http://v.youku.com/v_show/id_XNzcyNDc2MTYw.html
试一下,你的滚动算法能否实现上面的上下左右任意方向滚动。

出0入0汤圆

发表于 2014-11-22 19:27:57 | 显示全部楼层
9楼的太强了。

出0入0汤圆

 楼主| 发表于 2014-11-22 20:29:06 | 显示全部楼层
本帖最后由 yunjie167 于 2014-11-22 20:31 编辑
mcu_lover 发表于 2014-11-22 18:11
试一下,你的滚动算法能否实现上面的上下左右任意方向滚动。


挺不错的,你的是在在VC++6.0下仿真的?

出0入0汤圆

发表于 2014-11-22 20:39:33 | 显示全部楼层
9楼说说怎么实现的?

出0入264汤圆

发表于 2014-11-22 22:39:25 | 显示全部楼层
yunjie167 发表于 2014-11-22 20:29
挺不错的,你的是在在VC++6.0下仿真的?

是的,在VC6.0下仿真的。我所有涉及按键/显示 的项目都是直接用VC来写。等业务逻辑开发差不多了,再移植到下位单片机上,只需要改写BSP层即可。这样可以使整个开发时间缩短5~10倍以上。众所周知,调试液晶是个细致绣花活。用VC开发调试仿真相比传统的编译--烧写--看现象 -- 修改 -- 编译-- 烧写,效率实在是高太多太多。

出0入264汤圆

发表于 2014-11-22 23:01:50 | 显示全部楼层
实现的步骤有一个先后顺序。如果不考虑清楚,在后续滚动逻辑会非常混乱。很多显示效果很难实现。
第一步,需要实现任意位置任意大小的矩形区域内,显示任意长度大小的  字符串/位图(字符串与位图等效)
      需要考虑,字符串的对齐方式,水平方向:靠左, 水平居中,靠右  垂直方向:靠上,垂直居中,靠下。
      水平方向与垂直方向的组合对齐方式:共有九种,分别如后面图片所示。
第二步, 考虑字符串的剪裁。即需要显示的字符串/位图 大于我们指定的显示区域,需要将超出部分裁剪掉。
       这里不能用普通的判断当前坐标点是否在绘制矩形区域内,这种简单方法来进行判断。否则效率会降的非常低。
      裁剪需要结合上面的九种对齐方式进行考虑。
第三步,考虑如何实现滚动。实际上,完成了前面2步之后,滚动方式已经自动实现了。不需要额外的思考如何去滚动。
     只需要修改相应的变量即可了。如,向左滚动,则将左滚动指针减1即可。向上滚动,则将上滚动指针减1即可。
最后的问题就变成了6楼网友所说的:一个指针的问题。
楼主位的实现方式,是最容易想到的一种,当然也是效率最低的一种。而且对于上面提出的一二两步中的显示效果,很难实现。
如果有兴趣,可以按照我上面提出的思路步骤去思考如何实现。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-22 23:14:01 来自手机 | 显示全部楼层
楼上大神,标记一下

出0入0汤圆

发表于 2014-11-22 23:30:29 来自手机 | 显示全部楼层
mcu_lover 发表于 2014-11-22 22:39
是的,在VC6.0下仿真的。我所有涉及按键/显示 的项目都是直接用VC来写。等业务逻辑开发差不多了,再移植 ...

如果我要通过ui设置系统参数让下层硬件动作以验证硬件系统是否合格改怎么办呢?

出0入0汤圆

发表于 2014-11-22 23:35:37 | 显示全部楼层
14楼牛X,最近也在弄这个显示特效,可否加一下我的QQ10715693有些问题想请教!

出0入0汤圆

发表于 2014-11-22 23:42:09 | 显示全部楼层
标记  学习

出0入0汤圆

发表于 2014-11-23 08:24:44 | 显示全部楼层
9楼的博客  http://blog.csdn.net/power_mcu

出0入0汤圆

发表于 2014-11-23 11:58:10 | 显示全部楼层
先mark 有时间看看

出0入0汤圆

发表于 2014-11-23 13:44:52 来自手机 | 显示全部楼层
学习一下…

出0入264汤圆

发表于 2014-11-23 14:36:15 | 显示全部楼层
本帖最后由 mcu_lover 于 2014-11-23 14:41 编辑
304301959 发表于 2014-11-22 23:30
如果我要通过ui设置系统参数让下层硬件动作以验证硬件系统是否合格改怎么办呢? ...


上位机上面仿真的是业务逻辑,与底层无关,底层提供接口就好啦。只要上层逻辑OK了,你再调试底层驱动就非常简单了。
因为如果出问题了,肯定是底层驱动的问题,这样问题定位就非常容易了。
如,UI设置EEPROM的值:
提供两个读写EEPROM的驱动函数,保证业务逻辑能够正常的跑起来。

你移植到下位机时候,重写这两个接口函数就可以了。如果你下位机跑起来出现异常。
则就知道可能这两个接口函数可能存在问题了(因为它们与硬件打交道,涉及的东西比较多,出错概率大)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出50入0汤圆

发表于 2014-11-23 15:54:06 来自手机 | 显示全部楼层
厉害

出0入0汤圆

 楼主| 发表于 2014-11-23 16:02:48 | 显示全部楼层
mcu_lover 发表于 2014-11-22 23:01
实现的步骤有一个先后顺序。如果不考虑清楚,在后续滚动逻辑会非常混乱。很多显示效果很难实现。
第一步, ...

想了下你提供的思路,首先第一步我是实现了,可是到了第二步时候我不得不一个一个点绘制,实在想不出一种方法直接for循环指定次数就实现了指定区域的搬移,请多多指点~

出0入0汤圆

发表于 2014-11-23 18:24:49 | 显示全部楼层
nice,mark一下。。

出0入0汤圆

发表于 2014-11-23 19:23:30 | 显示全部楼层
学习学习!

出0入0汤圆

发表于 2014-11-23 21:28:11 | 显示全部楼层
yunjie167 发表于 2014-11-23 16:02
想了下你提供的思路,首先第一步我是实现了,可是到了第二步时候我不得不一个一个点绘制,实在想不出一种方 ...

如果没ram缓存,比较好奇除了打点还有什么办法?

出0入0汤圆

发表于 2014-11-23 22:38:32 | 显示全部楼层
yunjie167 发表于 2014-11-23 16:02
想了下你提供的思路,首先第一步我是实现了,可是到了第二步时候我不得不一个一个点绘制,实在想不出一种方 ...

我的思路,只考虑单色屏幕:

单色屏幕上,点亮就是1,没有点亮就是0。

那么只要左移右移就可以实现了。

上下移动也类似。

出0入0汤圆

发表于 2014-11-23 23:20:09 | 显示全部楼层
mcu_lover 发表于 2014-11-23 14:36
上位机上面仿真的是业务逻辑,与底层无关,底层提供接口就好啦。只要上层逻辑OK了,你再调试底层驱动就非 ...

请问类似EEPROM之类的您在PC上是怎样模拟的?有此地方用到串口也是直接用硬件PC上的串口吗?

出0入264汤圆

发表于 2014-11-23 23:59:44 | 显示全部楼层
ghostxdy 发表于 2014-11-23 23:20
请问类似EEPROM之类的您在PC上是怎样模拟的?有此地方用到串口也是直接用硬件PC上的串口吗?
...

22楼给出的就是EEPROM的在PC上模拟接口程序。其它的FLASH 之类的都类似,用一块内存区域去模拟就可以了。
串口之类的,就用PC的串口代替。按键就用PC的键盘代替。因为我的单片机程序构架是基于消息驱动的。
所以整个单片机程序的业务逻辑都可以在PC上面完成。模拟任何一个事件都只需要投递一个消息到队列即可。
如按键的模拟:
首先捕获PC的按键事件,然后保存到变量:


然后,改写按键扫描函数:


可以看到上面的KeyScan直接读取了变量值。而实际移植到单片机上面时候,这个函数内部改成
扫描单片机IO口即可。与按键相关的其它所有代码都不需要改动。

用PC的定时器事件模拟单片机的主循环:


这样整个系统的业务逻辑就可以在PC上面跑起来了。对于带液晶/按键的案子特别方便。如果不带人机交互,
使用PC模拟的意义就减少了很多了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-24 08:28:32 | 显示全部楼层
mcu_lover 发表于 2014-11-23 23:59
22楼给出的就是EEPROM的在PC上模拟接口程序。其它的FLASH 之类的都类似,用一块内存区域去模拟就可以了。 ...

厉害厉害!
请问怎么用PC来模拟LCD显示屏呢?

出0入0汤圆

发表于 2014-11-24 08:31:52 | 显示全部楼层
谢谢分享,mark

出50入4汤圆

发表于 2014-11-24 08:48:50 来自手机 | 显示全部楼层
学习,一直都觉得玩这种的是牛人

出0入264汤圆

发表于 2014-11-24 11:30:00 | 显示全部楼层
Stargazer-1986 发表于 2014-11-24 08:28
厉害厉害!
请问怎么用PC来模拟LCD显示屏呢?

建立一个与实际LCD DDRAM相对应的FRAME BUFFER 。所有操作LCD的动作,均为操作这块BUFFER。
需要更新时候,根据BUFFER里面每个字节的值,往屏幕上面绘制像素。
第一步:绘制像素到BUFFER



第二步:根据BUFFER里面数据,往PC屏幕上面绘制实际像素




第三步:实际显示像素,利用操作系统提供的绘图函数绘制



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-24 11:49:34 | 显示全部楼层
mcu_lover 发表于 2014-11-24 11:30
建立一个与实际LCD DDRAM相对应的FRAME BUFFER 。所有操作LCD的动作,均为操作这块BUFFER。
需要更新时候 ...

谢谢赐教!大概明白原理了.VC真是一个好东西...

出0入0汤圆

发表于 2014-11-24 11:58:44 | 显示全部楼层
正需要这个东西,谢谢大牛!

出0入0汤圆

发表于 2014-11-24 12:04:48 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-11-24 12:27:44 | 显示全部楼层
mark!......   

出0入0汤圆

发表于 2014-11-24 12:33:10 | 显示全部楼层
学习            

出0入0汤圆

发表于 2014-11-24 13:31:28 | 显示全部楼层
显示的字符以点阵形式存放在数组里

这种做特效,不错,但是这种比较耗CPU资源。 本身 LCD 用一个缓存,单位片机上面还得开辟一个缓存出来,做特效。
128*64/8 = 1K BYTE 占用CPU时间  也是不少的,每次更新,都得整屏去更新数据。

我还碰到过 有LCD显示的时候,还得关中断,才能保证时序正常,这真不行。

出0入0汤圆

发表于 2014-11-24 14:46:49 | 显示全部楼层
谢谢 楼主

出0入0汤圆

发表于 2014-11-25 08:57:19 | 显示全部楼层
红金龙 MCU牛。

出0入0汤圆

发表于 2014-11-25 09:03:30 | 显示全部楼层
mark,收藏需要时再看

出0入0汤圆

发表于 2014-11-25 09:07:51 | 显示全部楼层
不错,学习了

出0入0汤圆

发表于 2014-11-25 09:16:05 | 显示全部楼层
谢谢  等用的时候参考下

出0入0汤圆

发表于 2014-11-25 09:22:55 | 显示全部楼层
看着不错,支持一下

出0入0汤圆

发表于 2014-11-25 09:23:29 | 显示全部楼层
看着不错,支持一下

出0入0汤圆

发表于 2014-11-25 09:37:20 | 显示全部楼层
学习了 谢谢

出0入0汤圆

发表于 2014-11-25 09:49:00 | 显示全部楼层
在PC上怎么仿真,我只用emwin时仿真过,这种12864之类的点阵怎么仿真啊?

出0入0汤圆

发表于 2014-11-25 09:51:14 | 显示全部楼层
谢谢mcu_lover的讲解,很厉害。

出0入0汤圆

发表于 2014-11-25 10:02:28 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-11-25 11:23:06 | 显示全部楼层
必须MARK起来

出0入0汤圆

发表于 2014-11-25 15:00:32 | 显示全部楼层
收藏学习

出0入0汤圆

发表于 2014-11-26 08:34:38 | 显示全部楼层
收藏了,后面学习一下

出0入0汤圆

发表于 2014-11-26 09:59:02 | 显示全部楼层
收藏,以后慢慢研究

出0入0汤圆

发表于 2014-11-26 10:04:15 | 显示全部楼层
谢谢分享,学习下

出0入0汤圆

发表于 2014-11-26 10:17:25 | 显示全部楼层
本帖最后由 机器人天空 于 2014-11-26 10:42 编辑

其实40楼说的很有道理,楼主这种方法太浪费CPU资源。既要向虚拟显存数组更新数据,又要不断的将虚拟显存数组的数据送显示。
不知道怎么在硬件方面加SDRAM来省掉“不断将虚拟显存数组送显示”,这方面不太懂,求大神指点

出0入0汤圆

发表于 2014-11-26 10:54:55 | 显示全部楼层
真正的大牛啊

出0入0汤圆

发表于 2014-11-26 11:03:49 | 显示全部楼层
学习了  很好的思路!

出0入0汤圆

发表于 2014-11-26 11:04:43 | 显示全部楼层
标记  学习

出0入0汤圆

发表于 2014-11-26 11:18:10 | 显示全部楼层
内容buffer-->显示buffer-->显示.

出0入0汤圆

发表于 2014-11-26 12:30:17 | 显示全部楼层
Mark   学习了

出0入0汤圆

发表于 2014-11-26 12:45:11 | 显示全部楼层
大牛 膜拜   

出0入0汤圆

发表于 2014-12-5 11:04:37 | 显示全部楼层
真不错  想多多学习

出85入85汤圆

发表于 2014-12-5 21:54:43 | 显示全部楼层
真心佩服红金龙大师

出0入0汤圆

发表于 2014-12-11 12:49:51 | 显示全部楼层
mcu_lover 发表于 2014-11-23 23:59
22楼给出的就是EEPROM的在PC上模拟接口程序。其它的FLASH 之类的都类似,用一块内存区域去模拟就可以了。 ...

用PC的按键替代单片机的按键 消斗咋弄啊?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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