【文章內(nèi)容簡(jiǎn)介】
00000~10011111之間,RS為1,RW為0;另外,根據(jù)模塊引腳說(shuō)明,F(xiàn)PGA還需要同時(shí)控制其他幾個(gè)引腳。其中,為了選擇并行的數(shù)據(jù)發(fā)送模式,PSB引腳應(yīng)為H。RET引腳則由FPGA控制在經(jīng)過(guò)一段時(shí)間的L復(fù)位后跳為H。初始數(shù)據(jù)的賦值:psb=39。139。rs=39。139。 when state = WRITERAM or state = READRAM else 39。039。 當(dāng)狀態(tài)為讀寫(xiě)RAM時(shí),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。 當(dāng)狀態(tài)為如上時(shí),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…… 圖片顯示前初始化模塊的設(shè)計(jì)圖片顯示初始化的狀態(tài)機(jī)設(shè)計(jì)圖片顯示時(shí)需要用到擴(kuò)充指令集。在基本指令集設(shè)置的時(shí)候需要將SETFUNCTION,功能設(shè)計(jì),中的RE設(shè)為1. 而在擴(kuò)充指令集的功能設(shè)定中也要將RE設(shè)為1,同時(shí)在顯示模塊寫(xiě)入圖片數(shù)據(jù)時(shí),需要將圖片顯示關(guān)閉,然后轉(zhuǎn)入基本指令集進(jìn)行數(shù)據(jù)的寫(xiě)入,直至寫(xiě)入數(shù)據(jù)完畢再使用擴(kuò)充指令集,打開(kāi)圖片顯示。因此,其狀態(tài)機(jī)設(shè)計(jì)與字符顯示不同的部分如下:…when SHIFT= 游標(biāo)和顯示移位,這一部和字符顯示部分一樣state=SETFUNCTION1。when SETFUNCTION1= 設(shè)置8位數(shù)據(jù)傳輸方式state=SETFUNCTION2。when SETFUNCTION2= 啟用特殊指令集if flag_p=39。039。 then 這個(gè)選擇結(jié)構(gòu)用于選擇打開(kāi)或者關(guān)閉顯示,state=DRAWFUNOFF。 默認(rèn)為關(guān)閉顯示,只有當(dāng)圖像數(shù)據(jù)寫(xiě)入完成else 才會(huì)使flag_p等于1,這時(shí)打開(kāi)顯示。state=DRAWFUNON。end if。when DRAWFUNOFF= 關(guān)閉顯示 state=SETGDRAM?!瓀hen SETGDRAM= 設(shè)置GDRAM起始地址state=DRAWFUNR。when DRAWFUNR= 在使用寫(xiě)入數(shù)據(jù)命令前,必須轉(zhuǎn)會(huì)常規(guī)指令集 state=CLEARRAM。 使GDRAM中數(shù)據(jù)清0… 圖片顯示初始化數(shù)據(jù)的選擇其中與字符顯示不同的指令集數(shù)據(jù)如下:l 功能設(shè)定1(對(duì)應(yīng)狀態(tài)機(jī)狀態(tài)為SETFUNCTION1)選擇8為數(shù)據(jù)線接口,以及特殊指令集動(dòng)作,因此對(duì)應(yīng)DB7~DB0數(shù)據(jù)為00110100,RS,RW為0;(由于對(duì)此指令集的更改,改動(dòng)了2個(gè)數(shù)據(jù),需要2個(gè)時(shí)鐘周期,因此增加一個(gè)同樣的狀態(tài)SETFUNCTION2)l 特殊功能設(shè)定(對(duì)應(yīng)狀態(tài)機(jī)狀態(tài)為DRAWFUNR)選擇繪圖顯示關(guān),以及基本指令集動(dòng)作,因此對(duì)應(yīng)DB7~DB0數(shù)據(jù)為00110000,RS,RW為0;l 繪圖顯示開(kāi)(對(duì)應(yīng)狀態(tài)機(jī)狀態(tài)為DRAWFUNON)選擇繪圖顯示開(kāi),以及特殊指令集動(dòng)作,因此對(duì)應(yīng)DB7~DB0數(shù)據(jù)為00110100,RS,RW為0;l 繪圖顯示關(guān)(對(duì)應(yīng)狀態(tài)機(jī)狀態(tài)為DRAWFUNOFF)選擇繪圖顯示關(guān),以及基本指令集動(dòng)作,因此對(duì)應(yīng)DB7~DB0數(shù)據(jù)為00110100,RS,RW為0;對(duì)應(yīng)的賦值部分程序如下:….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 寫(xiě)入數(shù)據(jù)模塊設(shè)計(jì)由于1286412模塊提供了從02H到7FH的半寬字符,包括英文大小寫(xiě)以及數(shù)字和符號(hào),因此,需要編寫(xiě)合適的程序已方便使用者方便地調(diào)用以及使用。設(shè)計(jì)采用訪問(wèn)RAM的方式對(duì)英文字符進(jìn)行調(diào)用。顯示控制模塊在每一個(gè)時(shí)鐘信號(hào)來(lái)的時(shí)候輸出一個(gè)地址。相應(yīng)的RAM返回給顯示控制模塊所對(duì)應(yīng)的數(shù)據(jù)。模塊設(shè)計(jì)示意圖如圖45所示:圖45寫(xiě)入數(shù)據(jù)模塊設(shè)計(jì)示意圖(字符)而RAM在設(shè)計(jì)的時(shí)候采用函數(shù)的方式,函數(shù)將負(fù)責(zé)自動(dòng)辨識(shí)用戶(hù)輸入的英文符號(hào),并將其轉(zhuǎn)換為對(duì)應(yīng)數(shù)據(jù)。如下程序所示,若想改變顯示的內(nèi)容只需要改變進(jìn)程中每一行末尾char_to_integer函數(shù)括號(hào)中的內(nèi)容即可。函數(shù)中包括所需要顯示的字符,即26個(gè)小寫(xiě)英文字符及26個(gè)大寫(xiě)英文字符和部分標(biāo)點(diǎn)符號(hào),以及其所對(duì)應(yīng)的數(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。當(dāng)程序運(yùn)行時(shí),每當(dāng)一個(gè)時(shí)鐘信號(hào)來(lái)臨,顯示控制模塊的輸出地址自動(dòng)加1,并且把地址傳輸?shù)捷斎胱址K,模塊通過(guò)輸入地址的加1,從第一個(gè)字符數(shù)據(jù)開(kāi)始輸出對(duì)應(yīng)數(shù)據(jù),直到控制模塊所設(shè)定的輸出字符數(shù)為止。其中對(duì)沒(méi)有在模塊中定義的地址,一致輸出“ ”所對(duì)應(yīng)的數(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