求51单片机想实现LCD屏字符串续行往上移动的方法
如题,我想在4*4的LCD中实现字符一行一行上移的效果,例如,刚开始时,第0行显示:ABCDEF,第1行显示,GHIJKLMN,第2行显示,OPQRST,第3行显示,123456,下一步中变为,第0行显示,GHIJKLMN,第1行显示,OPQRST,第2行显示,123456,第3行是新输入的,789102,别人提示说是先增设一个N行的输出缓冲区,要输出的内容写到缓冲区,记住缓冲区实际行数,新输出一行时,缓冲区数据行数未满则直接添加一行,如果满则先移动:第二行复制到第一行,第三行复制到第二行...第N行复制到第N-1行,然后新内容写到第N行,但自已具体实现时此终未能写对,各位请指点指点吧,谢谢了,有同类的代码就最好了,呵呵,太菜了没办法啊,
做卷动显示,你的缓冲区有静态显示的二倍即可。用二维数组的思想比较直观,具体代码用指针比较高效。假设你的屏是纯文本屏,有4行,每行16个ASCII字符,则一屏的静态缓冲区是u8 Buf[4][16],
你最好写一个从缓冲区顺序调取数据用来显示的函数,具体实现自己发挥,我就不写了。
void Display(u8* pBuf)
{
}
如果这一步做到了,静态显示的时候执行一次Display(Buf);就可以刷一屏,等效于Display(&Buf[0][0]);
要做垂直卷动显示,将数组扩展为u8 Buf[8][16],并定义一个全局指针u8* pBuffer = Buf,指向缓冲区首字节地址。再定义一个计数变量i。
每次刷屏的时候执行Display(pBuffer+i);
需要卷动n行的时候,令i = n*16。16是每行的字符数。
先让i=0,则显示Buf[0][0]~Buf[3][15]段的数据,也就是头4行。i=16时显示第2~5行,以此类推。当i=16*4的时候,显示第5~8行内容,此时1~4行完全不可见,可以作为双缓冲区域,在后台刷新数据。下次再卷动时令i=0即可。新的第一行内容很容易在表面上看起来像是第9行的,尽管你缓冲区只有8行。所谓混动显示不过如此。
[解决办法]
按行移动就可以了,比如有四行 ,每个节拍下面的行往上移一行,就像移动bit位一样 ,只不过这里需要搬动整行,写一个小小的函数就可以实现,