【正文】
B7~DB0數(shù)據(jù)為00001100,RS,RW為0;l 游標和顯示控制(對應狀態(tài)機狀態(tài)為SHIFT)選擇AC=AC+1,因此對應DB7~DB0數(shù)據(jù)為00010100,RS,RW為0;l 功能設定(對應狀態(tài)機狀態(tài)為SETFUNCTION)選擇8為數(shù)據(jù)線接口,以及基本指令集動作,因此對應DB7~DB0數(shù)據(jù)為00110000,RS,RW為0;l DDRAM(對應狀態(tài)機狀態(tài)為SETDDRAM)地址的設定則根據(jù)需要設定,對應DB7~DB0數(shù)據(jù)為10000000~10011111之間,RS為1,RW為0;另外,根據(jù)模塊引腳說明,F(xiàn)PGA還需要同時控制其他幾個引腳。其中,為了選擇并行的數(shù)據(jù)發(fā)送模式,PSB引腳應為H。RET引腳則由FPGA控制在經(jīng)過一段時間的L復位后跳為H。初始數(shù)據(jù)的賦值:psb=39。139。rs=39。139。 when state = WRITERAM or state = READRAM else 39。039。 當狀態(tài)為讀寫RAM時,RS為1rw=39。039。 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 39。139。 當狀態(tài)為如上時,RW為0data=00000001 when state = CLEAR else 00000010 when state = RETURNCURSOR else 00000110 when state = SETMODE else 00001amp。open_displayamp。open_curamp。blank_cur when state = SWITCHMODE else 00010100 when state = SHIFT else 001amp。datawidth8 amp。 39。039。 amp。 exinstruction_offamp。00 when state = SETFUNCTION else 10000000 when state = SETDDRAM else 圖片顯示前初始化模塊的設計圖片顯示初始化的狀態(tài)機設計圖片顯示時需要用到擴充指令集。在基本指令集設置的時候需要將SETFUNCTION,功能設計,中的RE設為1. 而在擴充指令集的功能設定中也要將RE設為1,同時在顯示模塊寫入圖片數(shù)據(jù)時,需要將圖片顯示關閉,然后轉入基本指令集進行數(shù)據(jù)的寫入,直至寫入數(shù)據(jù)完畢再使用擴充指令集,打開圖片顯示。因此,其狀態(tài)機設計與字符顯示不同的部分如下:when SHIFT= 游標和顯示移位,這一部和字符顯示部分一樣state=SETFUNCTION1。when SETFUNCTION1= 設置8位數(shù)據(jù)傳輸方式state=SETFUNCTION2。when SETFUNCTION2= 啟用特殊指令集if flag_p=39。039。 then 這個選擇結構用于選擇打開或者關閉顯示,state=DRAWFUNOFF。 默認為關閉顯示,只有當圖像數(shù)據(jù)寫入完成else 才會使flag_p等于1,這時打開顯示。state=DRAWFUNON。end if。when DRAWFUNOFF= 關閉顯示 state=SETGDRAM?!瓀hen SETGDRAM= 設置GDRAM起始地址state=DRAWFUNR。when DRAWFUNR= 在使用寫入數(shù)據(jù)命令前,必須轉會常規(guī)指令集 state=CLEARRAM。 使GDRAM中數(shù)據(jù)清0圖片顯示初始化數(shù)據(jù)的選擇其中與字符顯示不同的指令集數(shù)據(jù)如下:l 功能設定1(對應狀態(tài)機狀態(tài)為SETFUNCTION1)選擇8為數(shù)據(jù)線接口,以及特殊指令集動作,因此對應DB7~DB0數(shù)據(jù)為00110100,RS,RW為0;(由于對此指令集的更改,改動了2個數(shù)據(jù),需要2個時鐘周期,因此增加一個同樣的狀態(tài)SETFUNCTION2)l 特殊功能設定(對應狀態(tài)機狀態(tài)為DRAWFUNR)選擇繪圖顯示關,以及基本指令集動作,因此對應DB7~DB0數(shù)據(jù)為00110000,RS,RW為0;l 繪圖顯示開(對應狀態(tài)機狀態(tài)為DRAWFUNON)選擇繪圖顯示開,以及特殊指令集動作,因此對應DB7~DB0數(shù)據(jù)為00110100,RS,RW為0;l 繪圖顯示關(對應狀態(tài)機狀態(tài)為DRAWFUNOFF)選擇繪圖顯示關,以及基本指令集動作,因此對應DB7~DB0數(shù)據(jù)為00110100,RS,RW為0;對應的賦值部分程序如下:….Data= 001amp。datawidth8 amp。 39。039。 amp。 exinstruction_offamp。00 when state = SETFUNCTION else 001amp。datawidth8 amp。 39。039。 amp。 exinstruction_onamp。00 when state = SETFUNCTION1 else 001amp。datawidth8 amp。 39。039。 amp。 exinstruction_onamp。00 when state = SETFUNCTION2 else 00110amp。exinstruction_off amp。 00 when state = DRAWFUNR else 00110amp。exinstruction_on amp。 10 when state = DRAWFUNON else 00110amp。exinstruction_on amp。 00 when state = DRAWFUNOFF else 10000000 when state = SETGDRAM else 寫入數(shù)據(jù)模塊的設計 英文字符部分的數(shù)據(jù)模塊由于1286412模塊提供了從02H到7FH的半寬字符,包括英文大小寫以及數(shù)字和符號,因此,需要編寫合適的程序已方便使用者方便地調(diào)用以及使用。設計采用訪問RAM的方式對英文字符進行調(diào)用。顯示控制模塊在每一個時鐘信號來的時候輸出一個地址。相應的RAM返回給顯示控制模塊所對應的數(shù)據(jù)。模塊設計示意圖如下: 寫入數(shù)據(jù)模塊設計示意圖(字符)而RAM在設計的時候采用函數(shù)的方式,函數(shù)將負責自動辨識用戶輸入的英文符號,并將其轉換為對應數(shù)據(jù)。如下程序所示,若想改變顯示的內(nèi)容只需要改變進程中每一行末尾char_to_integer函數(shù)括號中的內(nèi)容即可。函數(shù)中包括所需要顯示的字符,即26個小寫英文字符及26個大寫英文字符和部分標點符號,以及其所對應的數(shù)據(jù)。函數(shù)程序如下function char_to_integer(indata : character) return integer isvariable result : integer range 0 to 16FF。begin case indata is when 39。 39。 = result := 1620。 when 39。.39。 = result := 162E。 when 39。:39。 = result := 163A。 when 39。a39。 = result := 1661。 when 39。b39。 = result := 1662。 when 39。c39。 = result := 1663。 when 39。d39。 = result := 1664。... when 39。X39。 = result := 1658。 when 39。Y39。 = result := 1659。 when 39。Z39。 = result := 165A。 when others = result := 1620。 end case。 return result。end function。當程序運行時,每當一個時鐘信號來臨,顯示控制模塊的輸出地址自動加1,并且把地址傳輸?shù)捷斎胱址K,模塊通過輸入地址的加1,從第一個字符數(shù)據(jù)開始輸出對應數(shù)據(jù),直到控制模塊所設定的輸出字符數(shù)為止。其中對沒有在模塊中定義的地址,一致輸出“ ”所對應的數(shù)據(jù),即16*8的空白。以顯示“This is a simple test for LCD Display.”為例核心程序如下:if(clk239。event and clk2=39。039。) then case address is when 000000 =data=conv_std_logic_vector (char_to_integer (39。T39。),8)。 when 000001 =data=conv_std_logic_vector (char_to_integer (39。h39。),8)。 when 000010 =data=conv_std_logic_vector (char_to_integer (39。i39。),8)。 when 000011 =data=conv_std_logic_vector (char_to_integer (39。s39。),8)。 when 000100 =data=conv_std_logic_vector (char_to_integer (39。 39。),8)。 when 000101 =data=conv_std_logic_vector (char_to_integer (39。i39。),8)。 when 110001 =data=conv_std_logic_vector (char_to_integer (39。p39。),8)。 when 110010 =data=conv_std_logic_vector (char_to_integer (39。l39。),8)。 when 110011 =data=conv_std_logic_vector (char_to_integer (39。a39。),8)。 when 110100 =data=conv_std_logic_vector (char_to_integer (39。y39。),8)。 when 110101 =data=conv_std_logic_vector (char_to_integer (39。.39。),8)。 when others =data=conv_std_logic_vector (char_to_integer (39。 39。),8)。 end case。 end if。 中文字符部分的數(shù)據(jù)模塊中文部分的實現(xiàn)原理與英文部分大體相同,但是由于VHDL中無法識別中文,因此在使用上不可能做到和英文一樣方便。使用時需要參照中文字符表,將需要的字符所對應的數(shù)據(jù)輸入RAM,然后通過和英文模塊不重復的符號來實現(xiàn)對其的調(diào)用。如 “測”這個中文字符,所對應的數(shù)據(jù)為16B2E2,因此在函數(shù)部分應為: when 39。@39。 = result := 16B2。 when 39。39。 = result := 16E2。調(diào)用時的只需將@和這兩個符號來代替中文字符即可when 000000 =data=conv_std_logic_vector (char_to_integer (39。@39。),8)。when 000001 =data=conv_std_logic_vector (char_to_integer (39。39。),8)。圖片部分的數(shù)據(jù)模塊采用ROM的形式對其進行存放和讀取。ROM為QUARTUS II的自帶模塊,大小為8*1024位,含一個使能端。ROM中的圖像數(shù)據(jù)需要通過圖像取模軟件對圖像進行取模,然后把取模得到的數(shù)據(jù)以MIF文件的形式賦給ROM。然后通過顯示控制模塊對ROM進行讀取操作。文本顯示RAM(DDRAM)提供8X4行的漢字空間。每個單元所對應的DDRAM值如下: DDRAM相應值對應屏幕位置在設定完起始的DDRAM值后,使用了一個計數(shù)器COUNTER,每經(jīng)過一個寫RAM狀態(tài),COUNTER自動加1。這個COUNTER經(jīng)過轉換后作為寫入數(shù)據(jù)模塊的RAM的輸入地址,同時將這個COUNTER映射到DDRAM上。隨著COUNTER的不斷加1操作,寫入數(shù)據(jù)模塊的RAM中的內(nèi)容被一個個輸出到DDRAM所對應的屏幕的相應位置,而屏幕中的位置也在不斷移動。這樣一組數(shù)據(jù)就可以完整地顯示在LCD現(xiàn)實屏上了。如果需要顯示多組數(shù)據(jù)在屏幕的不同位置,則需要提前計算好每組字符的字數(shù),然后設定當字符數(shù)達到要求后,跳轉至設定DDRAM值的,也就是屏幕上所對應位置的狀態(tài),然后如此反復就可以講所需內(nèi)容完整地顯示出來。對應的程序設計示意圖如下:(字符)假定要在屏幕上顯示1組4個漢字組成的字符以及2組8個英文字符組成的字符,則程序如下when SETDDRAM1=state=WRITERAM。when WRITERAM=if counter