天津工业大学本科毕业论文 第四章 [XXXX...]
因此,图像显示的程序设计示意图大体如图4-10所示:
图4-10 图片显示流程图
在实际操作时,发现GDRAM的显示方式与DATASHEET上不同。 首先,直接将数据给GDRAM并将其显示后发现屏幕上有非常多的杂点,因此在对其进行写入正式数据前,必须将其清0。
其次当将32个8位数据写入GDRAM后,Y地址不变,需要人为将其设定为下一行,X地址自动加1。但是之后X地址并不是从0开始到15,而是从1开始到15,在跳到0。第三行的情况则是X从2到15,然后是0-1。因此发现X的地址不断在往前移位。
同时,由于GDRAM缓冲区特殊的分行显示方式,和普通取模软件从图片最上开始直接到最底部的取模方式不同。
若初始的数据如图4-11所示:
天津工业大学本科毕业论文 第四章 [XXXX...]
0 10 20 30 …. 1 1 1 1 12 22 32 2 13 23 33 3 14 24 34 4 15 25 35
5 16 26 36 6 17 27 37 7 18 28 38 8 19 29 39 9 123 图4-11 欲显示数据
则直接按普通寻址方式输入数据后,显示的结果如图4-12所示:
0 39 … 10 29 … 0 1 31 0 12 32 1 21 13 33 2 22 14 34 3 23 15 35 4 24 16 36 5 25 17 37 6 26 18 38 7 27 19 38 28 19 2图4-12 实际显示数据
这显然不是我们要的结果,因此,如果想让图片在LCD上正常显示,有两种方式。
第一种是在图片进行取模后,通过电脑中编写的特殊程序对其进行处理。但是这种方法有可能使之后的开发过于依赖上位机,因此这里采用第二种方法。
第二种方法是将图片取模后的数据直接放入ROM中,但是在对ROM进行读取数据时,按照特定的算法进行读取,最后使图片正常显示。
天津工业大学本科毕业论文 第四章 [XXXX...]
具体操作方式如下 A)换行的算法:
设定一个计数器counter,使其每次进行写RAM操作时加1。当counter等于31+j的时候则进入设置GDRAM的换行状态,同时j加32。如此久完成了换行的过程。
B)上下半屏的合并算法:
再设置另一个0到31的计数器r_counter,每次进行写RAM操作时加1。J1为另一个计数器。寻址的地址为r_counter与j1的和。当r_counter在0到15时,则正常寻址,每换一行j1需要加16。如果r_counter大于15,那么寻址时C需要在原来的基础上加上512-16。同理,在换行后,寻址时j1也要再加上16。
C)X地址向前移位的处理:
同样的计数器r_counter,每次换行后在原来的基础上加上2,如此即可解决所有问题。
程序设计示意图如图4-13所示,其中,r_counter为5位的2进制数,范围为0到31
图4-13 改进后的图片显示控制流程图
特殊寻址的核心程序如下:
char_address<= conv_std_logic_vector(j1,10)+r_counter when state = WRITERAM and r_counter<\
天津工业大学本科毕业论文 第四章 [XXXX...]
conv_std_logic_vector(j1+496,10)+r_counter when state = WRITERAM and r_counter>\…
进程部分:
首先要对DDRAM进行清0,这个步骤只需要考虑换行,不需要对X的地址的移位做考虑: …
when CLEARRAM=>
if counter1=j+31 then --由于X地址范围0到16每一位地址包含2个8位
state<=SETGDRAMY; --2进制数据,因此每32个数据Y地址加1 counter1<=counter1+1; --清0计数器,共计1024次 j<=j+32; --换行指示器 gd_addr<=gd_addr+1; --Y地址加1 flag_r<='0'; elsif counter1<1024 then
state<=CLEARRAM; counter1<=counter1+1; else
counter1<=0; r_counter<=\j<=0; gd_addr<=0; flag_r<='1';
state<=SETGDRAM1; end if;
以上为清0程序。
以下为正式的图像写入程序: when WRITERAM=>
if counter=j+31 then --同清0程序一样原理,当J为32的倍数时换行
state<=SETGDRAMY; j<=j+32;
j1<=j1+16; --J1用作寻址时的累加器
counter<=counter+1; --COUNTER共1024次,共需写入1024个数
据
天津工业大学本科毕业论文 第四章 [XXXX...]
gd_addr<=gd_addr+1; --Y地址加1 flag_r<='1'; i<=\
r_counter<=r_counter+1; --5位的R_COUNTER解决了X地址移位的问
题
elsif counter<1024 then
state<=WRITERAM; r_counter<=r_counter+1; counter<=counter+1; else
counter<=0; flag_p<='1';
state<=SETFUNCTION1; end if;
when SETGDRAM2=> state<=SETGDRAMY;
when SETGDRAMY=> --换行状态 if flag_r='1' then
state<=WRITERAM;
r_counter<=r_counter+”10”; --R_COUNTER每当Y地址加1也跟随往 else --前移2位,使得ROM的数据与屏幕
state<=CLEARRAM; --同步 end if; …
通过这系列算法的调整,可以使任意128*64像素的图片在取模后正常在LCD上显示。
4.4字符显示及图片显示整体模块设计
字符显示的整体模块的功能包括任意中文字符及英文字符在12864-12屏幕上的任意位置的显示,同时还要显示动态数据的变动。这里的动态数据为一个0到15的计数器。字符显示整体模块的BLOCK DIAGRAM如图4-14所示: