天津工业大学本科毕业论文 第四章 [XXXX...]
? 游标和显示控制(对应状态机状态为SHIFT)选择AC=AC+1,因此对应
DB7~DB0数据为00010100,RS,RW为0;
? 功能设定(对应状态机状态为SETFUNCTION)选择8为数据线接口,以及基
本指令集动作,因此对应DB7~DB0数据为00110000,RS,RW为0; ? DDRAM(对应状态机状态为SETDDRAM)地址的设定则根据需要设定,对
应DB7~DB0数据为10000000~10011111之间,RS为1,RW为0;
另外,根据模块引脚说明,FPGA还需要同时控制其他几个引脚。其中,为了选择并行的数据发送模式,PSB引脚应为H。RET引脚则由FPGA控制在经过一段时间的L复位后跳为H。 初始数据的赋值: psb<='1';
rs<='1' when state = WRITERAM or state = READRAM else '0'; -- 当状态为读写RAM时,RS为1
rw<='0' when state = CLEAR or state = RETURNCURSOR or state = SETMODE or state = SWITCHMODE or state = SHIFT or state = SETFUNCTION
or state = SETCGRAM or state = SETDDRAM or state = WRITERAM
else '1'; --当状态为如上时,RW为0
data<=\
\ \
\
SWITCHMODE else
\
\
SETFUNCTION else
\……
4.1.4 图片显示前初始化模块的设计
1、图片显示初始化的状态机设计
图片显示时需要用到扩充指令集。在基本指令集设置的时候需要将
SETFUNCTION,功能设计,中的RE设为1. 而在扩充指令集的功能设定中也要将RE设为1,同时在显示模块写入图片数据时,需要将图片显示关闭,然后转入基本指令集进行数据的写入,直至写入数据完毕再使用扩充指令集,打开图片
天津工业大学本科毕业论文 第四章 [XXXX...]
显示。
因此,其状态机设计与字符显示不同的部分如下: …
when SHIFT=> --游标和显示移位,这一部和字符显示部分一样
state<=SETFUNCTION1;
when SETFUNCTION1=> --设置8位数据传输方式 state<=SETFUNCTION2;
when SETFUNCTION2=> --启用特殊指令集
if flag_p='0' then --这个选择结构用于选择打开或者关闭显示,
state<=DRAWFUNOFF; --默认为关闭显示,只有当图像数据写入完成 else --才会使flag_p等于1,这时打开显示。 state<=DRAWFUNON; end if;
when DRAWFUNOFF=> --关闭显示 state<=SETGDRAM; …
when SETGDRAM=> --设置GDRAM起始地址 state<=DRAWFUNR;
when DRAWFUNR=> --在使用写入数据命令前,必须转会常规指令集
state<=CLEARRAM; --使GDRAM中数据清0 …
2、 图片显示初始化数据的选择
其中与字符显示不同的指令集数据如下:
? 功能设定1(对应状态机状态为SETFUNCTION1)选择8为数据线接口,以及
特殊指令集动作,因此对应DB7~DB0数据为00110100,RS,RW为0;(由于对此指令集的更改,改动了2个数据,需要2个时钟周期,因此增加一个同样的状态SETFUNCTION2)
? 特殊功能设定(对应状态机状态为DRAWFUNR)选择绘图显示关,以及基
本指令集动作,因此对应DB7~DB0数据为00110000,RS,RW为0; ? 绘图显示开(对应状态机状态为DRAWFUNON)选择绘图显示开,以及特
殊指令集动作,因此对应DB7~DB0数据为00110100,RS,RW为0; ? 绘图显示关(对应状态机状态为DRAWFUNOFF)选择绘图显示关,以及基
天津工业大学本科毕业论文 第四章 [XXXX...]
本指令集动作,因此对应DB7~DB0数据为00110100,RS,RW为0; 对应的赋值部分程序如下: …. Data<=
\SETFUNCTION else
\SETFUNCTION1 else
\SETFUNCTION2 else
\ \ \ \
4.2 写入数据模块设计 4.2.1英文字符部分的数据模块
由于12864-12模块提供了从02H到7FH的半宽字符,包括英文大小写以及数字和符号,因此,需要编写合适的程序已方便使用者方便地调用以及使用。
设计采用访问RAM的方式对英文字符进行调用。显示控制模块在每一个时钟信号来的时候输出一个地址,这个地址在每一个时钟信号过后都自动加1.而这个地址则作为RAM的输入地址。相应的RAM返回给显示控制模块所对应的数据。
模块设计示意图如图4-5所示:
天津工业大学本科毕业论文 第四章 [XXXX...]
图4-5写入数据模块设计示意图(字符)
而RAM在设计的时候采用函数的方式,函数将负责自动辨识用户输入的英文符号,并将其转换为对应数据。如下程序所示,若想改变显示的内容只需要改变进程中每一行末尾char_to_integer函数括号中的内容即可。
函数中包括所需要显示的字符,即26个小写英文字符及26个大写英文字符和部分标点符号,以及其所对应的数据。
函数程序如下
function char_to_integer(indata : character) return integer is variable result : integer range 0 to 16#FF#; begin
case indata is
when ' ' => result := 16#20#; when '.' => result := 16#2E#; when ':' => result := 16#3A#; when 'a' => result := 16#61#; when 'b' => result := 16#62#; when 'c' => result := 16#63#; when 'd' => result := 16#64#; ...
when 'X' => result := 16#58#; when 'Y' => result := 16#59#;
天津工业大学本科毕业论文 第四章 [XXXX...]
when 'Z' => result := 16#5A#; when others => result := 16#20#; end case; return result; end function;
当程序运行时,每当一个时钟信号来临,显示控制模块的输出地址自动加1,并且把地址传输到输入字符模块,模块通过输入地址的加1,从第一个字符数据开始输出对应数据,直到控制模块所设定的输出字符数为止。其中对没有在模块中定义的地址,一致输出“ ”所对应的数据,即16*8的空白。
以显示“This is a simple test for LCD Display.”为例核心程序如下: if(clk2'event and clk2='0') then case address is
when \ when \ when \ when \ when \ when \
…
when \ when \ when \ when \ when \ when others =>data<=conv_std_logic_vector (char_to_integer (' '),8); end case; end if; …
模块示意图如图4-6所示: