|
本帖最后由 yunjie167 于 2014-11-21 21:13 编辑
滚动字幕以前在16x16点阵上做过实验,可后来想把移到液晶屏上面.之前算法已经完全过时了,那究竟怎么才能写个通用算法呢?
以下提供一种思路(ps.是我按照自己的想法实现的,因为我也不知道实现它的最佳算法是什么)
以16x16汉字点阵为例
若想汉字滚动,我觉得若我们有个显示缓存那就方便多了,先通过画点函数在缓存里把要显示的字符点阵存进去.
例如定义- static char VirDispRAM[FONTSIZE][192]; //构建一个虚拟显示器缓存,用于显示滚动字幕
复制代码
还需要一个结构体
- /*
- x,y表示想在屏幕某个位置显示字符
- xsize表示长度,例如是80
- ysize其实就是你的字体宽度FONTSIZE
- endX是你要显示字符串的最大列下标
- 例如显示"这个滚动字幕测试程序hello"
- 那么endX就是10个汉字和5个ASCII字符的宽度等于25*8=200再减1
- spaceN表示当字符串尾与字符串头之间的空列的数目
- */
- struct RollStr_T {
- short x,y,xsize,ysize;
- short virX;
- short endX;
- short decS;
- short spaceN;
- u16 bkcolor;
- u16 frcolor;
- };
复制代码
因此我们得需要一个函数负责把字符串填充到VirDispRAM数组中
- 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, 杜汶泽)
|