LCD1602液晶顯示實驗_第1頁
LCD1602液晶顯示實驗_第2頁
LCD1602液晶顯示實驗_第3頁
LCD1602液晶顯示實驗_第4頁
LCD1602液晶顯示實驗_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實 驗 報 告實驗名稱: LCD1602液晶顯示實驗姓 名: 學 號: 指導教師: 實驗時間: 2013年6月15日 信息與通信工程學院LCD1602液晶顯示實驗1.實驗原理1.1 基本原理1.1.1 1602字符型LCD簡介 字符型液晶顯示模塊是一種專門用于顯示字母、數字、符號等點陣式LCD,目前常用16*1,16*2,20*2和40*2行等的模塊。1.1.2 1602LCD的基本參數及引腳功能 1602LCD分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應用中并無差別,兩者尺寸差別如下圖1-2所示:圖1-2 1602LCD尺寸圖1.1602L

2、CD主要技術參數:顯示容量: 16×2個字符芯片工作電壓: 4.55.5V工作電流: 2.0mA(5.0V)模塊最佳工作電壓: 5.0V字符尺寸: 2.95×4.35(W×H)mm2.引腳功能說明:1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表: 表1-3引腳接口說明表編號符號引腳說明編號符號引腳說明1VSS電源地9D2數據2VDD電源正極10D3數據3VL液晶顯示偏壓11D4數據4RS數據/命令選擇12D5數據5R/W讀/寫選擇13D6數據6E使能信號14D7數據7D0數據15BLA背光源正極8D1數據16BLK背光源負極1.

3、1.3 1602LCD的指令說明及時序1602液晶模塊內部的控制器共有11條控制指令,如表1-4所示:表1-4 控制命令表序號指令RSR/WD7D6D5D4D3D2D1D01清顯示00000000012光標返回000000001*3置輸入模式00000001I/DS4顯示開/關控制0000001DCB5光標或字符移位000001S/CR/L*6置功能00001DLNF*7置字符發生存貯器地址0001字符發生存貯器地址8置數據存貯器地址001顯示數據存貯器地址9讀忙標志或地址01BF計數器地址10寫數到CGRAM或DDRAM)10要寫的數據內容11從CGRAM或DDRAM讀數11讀出的數據內容1

4、602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。(說明:1為高電平、0為低電平)讀寫操作時序如圖1-5和1-6所示:圖1-5 讀操作時序圖1-6 寫操作時序1.1.4 1602LCD的RAM地址映射及標準字庫表液晶顯示模塊是一個慢顯示器件,所以,在執行每條指令之前,一定要確認模塊的忙標志為低電平,表示不忙,否則此指令失效。要顯示字符時,要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖1-7是1602的內部顯示地址。圖1-7 1602LCD內部顯示地址例如,第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標定位在第二行第一個字符的位置呢?這樣不行,因為寫

5、入顯示地址時要求最高位D7恒定為高電平1,所以實際寫入的數據應該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在對液晶模塊的初始化中,要先設置其顯示模式,在液晶模塊顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態。1602液晶模塊內部的字符發生存儲器(CGROM)已經存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們

6、就能看到字母“A”因為1602識別的是ASCII碼,試驗可以用ASCII碼直接賦值,編程中還可以用字符型常量或變量賦值,如“A”。1602通過D0D7的8位數據端傳輸數據和指令。1.1.5 1602LCD的一般初始化(復位)過程延時15mS寫指令38H(不檢測忙信號)延時5mS寫指令38H(不檢測忙信號)延時5mS寫指令38H(不檢測忙信號)以后每次寫指令、讀/寫數據操作均需要檢測忙信號寫指令38H:顯示模式設置寫指令08H:顯示關閉寫指令01H:顯示清屏寫指令06H:顯示光標移動設置寫指令0CH:顯示開及光標設置1.2 任務1及其原理任務1:更改lcd上顯示的字符。通過更改wire 127:

7、0 row1_val,wire 127:0 row2_val的賦值即可,注意保證“”內的字符數包括空格共16位。1.3 任務2及其原理任務2:將“LCD1602驅動模塊”文件與“LCD1602驅動測試模塊”文件合并成為一個verilog文件。首先,新建一個頂層VerilogHDL文件,將兩個文件的輸入,內容合并,調試新的模塊,然后將管腳連接在一起,從而完成合并。1.4 任務3及其原理任務3:實現液晶屏的某一位完成09的循環變換,并且設置復位鍵,在循環過程中按下復位鍵循環可從0重新開始。完成本次的實驗想法是將“LCD1602驅動測試模塊”文件中wire 127:0 row1_val,wire 1

8、27:0 row2_val變量進行改動,將row1_val原本賦予的字符替換為一個變量,設定新的時鐘,即循環變換的間隔時間,再通過條件語句控制循環。使能鍵的控制原理是通過對循環變換的條件進行操作實現的,即當按鍵使能時循環開始,反之,則從0開始。2. 實驗流程圖09循環變換流程圖3.實驗程序3.1 任務1程序 程序更改部分:wire 127:0 row1_val = " liu wupeng " wire 127:0 row2_val = " 2009081206 "3.2 任務2程序 將測試模塊中的驅動部分,兩個文件的對應命名只留其一,合并兩文件,即以下

9、部分 / 例化LCD1602驅動 lcd1602_drive u0( .clk(CLOCK_50M), .rst_n(Q_KEY), .row1_val(row1_val), .row2_val(row2_val), .lcd_data(LCD1602_DATA), .lcd_e(LCD1602_E), .lcd_rs(LCD1602_RS), .lcd_rw(LCD1602_RW);完整程序請參見附件:13.3 任務3程序 改動模塊:LCD1602驅動測試模塊,加重處為修改、添加部分module lcd1602_test( input CLOCK_50M, / 板載時鐘25MHz input

10、 Q_KEY, / 板載按鍵RST output 7:0 LCD1602_DATA, / LCD1602數據總線 output LCD1602_E, / LCD1602使能 output LCD1602_RS, / LCD1602指令數據選擇 output LCD1602_RW, / LCD1602讀寫選擇 output SEL0, / LCD1602讀寫選擇 output SEL1, / LCD1602讀寫選擇 output SEL2 / LCD1602讀寫選擇 input key, /使能控制鍵 );reg 127:0 row1_val; /將原本的wire型改為reg型,保證其可變wir

11、e 127:0 row2_val = " " /將第二行賦值都是空格,實驗時顯示為空reg 7:0 a; /a變化控制reg 127:0 row1_valreg 3:0 i; reg 25:0 cnt; /分頻用reg en; /使能控制assign SEL0 = 1'b0; assign SEL1 = 1'b0; assign SEL2 = 1'b1; always (posedge CLOCK_50M,negedge Q_KEY) if (!Q_KEY) cnt <= 0; else cnt <= cnt + 1'b1;wir

12、e lcd_clk = cnt25; /分頻模塊always (a) begin row1_val7:0<=a; end /將a賦給 row1_val7:0的低8位 always (negedge key) begin if (en=0) en<=1; else en<=0; end /使能控制模塊,下降沿有效 always (posedge lcd_clk) if (en) if(i<=8) begin a=a+1; i=i+1; end else begin i=0; a=8'h30; endelse a=8'h30; /通過條件控制語句實現09的循

13、環變換 / 例化LCD1602驅動 lcd1602_drive u0( .clk(CLOCK_50M), .rst_n(Q_KEY), / LCD1602 Input Value .row1_val(row1_val), .row2_val(row2_val), / LCD1602 Interface .lcd_data(LCD1602_DATA), .lcd_e(LCD1602_E), .lcd_rs(LCD1602_RS), .lcd_rw(LCD1602_RW);endmodule4.管腳分配4.1 任務2管教分配4.2 任務3管教分配5. 實驗結果5.1 任務1實驗結果 修改程序后,液

14、晶屏第一行顯示" liu wupeng ",第二行顯示" 2009081206 "。5.2 任務2實驗結果 文件合并后,顯示內容仍與原始程序相同。5.3 任務3實驗結果 液晶屏第一行最后一位可實現09的循環變換,撥動復位鍵,計數從0重新開始。6.實驗心得通過本次實驗,我了解了LCD-1602的構成及使用方法,能夠通過編程顯示字符。在完成課堂任務“實現某一位09循環變換”時,起初由于沒有掌握LCD的工作原理,出現了問題,即09快速變化,無法控制其速度,經過對程序及實驗原理的研究,最后完成了任務。FPGA實驗是鍛煉編程能力、邏輯思維能力的一門很好的課程,我現

15、在所欠缺的便是縝密的思維及查錯的能力,還望在以后實驗中提高。通過這次實驗,學到了很多東西,體會到了自己實現一個程序功能的小小喜悅,也認識到了自己只是FPGA道路上的新手,還有很多未知的知識需要學習。真正學習的歷程需要在課下多下功夫,希望通過這學期的學習自己能熟練掌握一些編程的技術,培養良好的思維模式。附件:1module hebing( input clk, / 50MHz時鐘 input rst_n, / 復位信號 input 127:0 row1_val, / 第一行字符 input 127:0 row2_val, / 第二行字符 / LCD1602 Interface output SE

16、L0, / LCD1602讀寫選擇 output SEL1, / LCD1602讀寫選擇 output SEL2, / LCD1602讀寫選擇 / LCD1602 Interface output reg 7:0 lcd_data, / 數據總線 output lcd_e, / 使能信號 output reg lcd_rs, / 指令、數據選擇 output lcd_rw / 讀、寫選擇);/ 0 (8*16-1) = 128/ 16bits -> 0123456789ABCDEF <-wire 127:0 row1_val = " liu wupeng "wi

17、re 127:0 row2_val = " 2009081206 "assign SEL0 = 1'b0; assign SEL1 = 1'b0; assign SEL2 = 1'b1; / +/ 分頻模塊 開始/ +reg 15:0 cnt; / 計數子always (posedge clk, negedge rst_n) if (!rst_n) cnt <= 0; else cnt <= cnt + 1'b1;/ 500Khz 1MHz 皆可wire lcd_clk = cnt15; / (215 / 50M) = 1.31m

18、s / -/ 分頻模塊 結束/ -/ +/ LCD1602驅動模塊 開始/ +/ 格雷碼編碼:共40個狀態parameter IDLE = 8'h00;/ 寫指令,初始化parameter DISP_SET = 8'h01; / 顯示模式設置parameter DISP_OFF = 8'h03; / 顯示關閉parameter CLR_SCR = 8'h02; / 顯示清屏parameter CURSOR_SET1 = 8'h06; / 顯示光標移動設置parameter CURSOR_SET2 = 8'h07; / 顯示開及光標設置/ 顯示第一

19、行parameter ROW1_ADDR = 8'h05; / 寫第1行起始地址parameter ROW1_0 = 8'h04;parameter ROW1_1 = 8'h0C;parameter ROW1_2 = 8'h0D;parameter ROW1_3 = 8'h0F;parameter ROW1_4 = 8'h0E;parameter ROW1_5 = 8'h0A;parameter ROW1_6 = 8'h0B;parameter ROW1_7 = 8'h09;parameter ROW1_8 = 8'

20、;h08;parameter ROW1_9 = 8'h18;parameter ROW1_A = 8'h19;parameter ROW1_B = 8'h1B;parameter ROW1_C = 8'h1A;parameter ROW1_D = 8'h1E;parameter ROW1_E = 8'h1F;parameter ROW1_F = 8'h1D;/ 顯示第二行parameter ROW2_ADDR = 8'h1C; / 寫第2行起始地址parameter ROW2_0 = 8'h14;parameter ROW

21、2_1 = 8'h15;parameter ROW2_2 = 8'h17;parameter ROW2_3 = 8'h16;parameter ROW2_4 = 8'h12;parameter ROW2_5 = 8'h13;parameter ROW2_6 = 8'h11;parameter ROW2_7 = 8'h10;parameter ROW2_8 = 8'h30;parameter ROW2_9 = 8'h31;parameter ROW2_A = 8'h33;parameter ROW2_B = 8

22、9;h32;parameter ROW2_C = 8'h36;parameter ROW2_D = 8'h37;parameter ROW2_E = 8'h35;parameter ROW2_F = 8'h34;reg 5:0 current_state, next_state; / 現態、次態/ FSM: always1always (posedge lcd_clk, negedge rst_n) if(!rst_n) current_state <= IDLE; else current_state <= next_state;/ FSM: al

23、ways2alwaysbegin case(current_state) IDLE : next_state = DISP_SET; / 寫指令,初始化 DISP_SET : next_state = DISP_OFF; DISP_OFF : next_state = CLR_SCR; CLR_SCR : next_state = CURSOR_SET1; CURSOR_SET1 : next_state = CURSOR_SET2; CURSOR_SET2 : next_state = ROW1_ADDR; / 顯示第一行 ROW1_ADDR : next_state = ROW1_0; R

24、OW1_0 : next_state = ROW1_1; ROW1_1 : next_state = ROW1_2; ROW1_2 : next_state = ROW1_3; ROW1_3 : next_state = ROW1_4; ROW1_4 : next_state = ROW1_5; ROW1_5 : next_state = ROW1_6; ROW1_6 : next_state = ROW1_7; ROW1_7 : next_state = ROW1_8; ROW1_8 : next_state = ROW1_9; ROW1_9 : next_state = ROW1_A; R

25、OW1_A : next_state = ROW1_B; ROW1_B : next_state = ROW1_C; ROW1_C : next_state = ROW1_D; ROW1_D : next_state = ROW1_E; ROW1_E : next_state = ROW1_F; ROW1_F : next_state = ROW2_ADDR; / 顯示第二行 ROW2_ADDR : next_state = ROW2_0; ROW2_0 : next_state = ROW2_1; ROW2_1 : next_state = ROW2_2; ROW2_2 : next_sta

26、te = ROW2_3; ROW2_3 : next_state = ROW2_4; ROW2_4 : next_state = ROW2_5; ROW2_5 : next_state = ROW2_6; ROW2_6 : next_state = ROW2_7; ROW2_7 : next_state = ROW2_8; ROW2_8 : next_state = ROW2_9; ROW2_9 : next_state = ROW2_A; ROW2_A : next_state = ROW2_B; ROW2_B : next_state = ROW2_C; ROW2_C : next_sta

27、te = ROW2_D; ROW2_D : next_state = ROW2_E; ROW2_E : next_state = ROW2_F; ROW2_F : next_state = ROW1_ADDR; / default : next_state = IDLE ; endcaseend/ FSM: always3always (posedge lcd_clk, negedge rst_n)begin if(!rst_n) begin lcd_rs <= 0; lcd_data <= 8'hxx; end else begin / 寫lcd_rs case(next

28、_state) IDLE : lcd_rs <= 0; / 寫指令,初始化 DISP_SET : lcd_rs <= 0; DISP_OFF : lcd_rs <= 0; CLR_SCR : lcd_rs <= 0; CURSOR_SET1 : lcd_rs <= 0; CURSOR_SET2 : lcd_rs <= 0; / 寫數據,顯示第一行 ROW1_ADDR : lcd_rs <= 0; ROW1_0 : lcd_rs <= 1; ROW1_1 : lcd_rs <= 1; ROW1_2 : lcd_rs <= 1; ROW1

29、_3 : lcd_rs <= 1; ROW1_4 : lcd_rs <= 1; ROW1_5 : lcd_rs <= 1; ROW1_6 : lcd_rs <= 1; ROW1_7 : lcd_rs <= 1; ROW1_8 : lcd_rs <= 1; ROW1_9 : lcd_rs <= 1; ROW1_A : lcd_rs <= 1; ROW1_B : lcd_rs <= 1; ROW1_C : lcd_rs <= 1; ROW1_D : lcd_rs <= 1; ROW1_E : lcd_rs <= 1; ROW1

30、_F : lcd_rs <= 1; / 寫數據,顯示第二行 ROW2_ADDR : lcd_rs <= 0; ROW2_0 : lcd_rs <= 1; ROW2_1 : lcd_rs <= 1; ROW2_2 : lcd_rs <= 1; ROW2_3 : lcd_rs <= 1; ROW2_4 : lcd_rs <= 1; ROW2_5 : lcd_rs <= 1; ROW2_6 : lcd_rs <= 1; ROW2_7 : lcd_rs <= 1; ROW2_8 : lcd_rs <= 1; ROW2_9 : lcd_r

31、s <= 1; ROW2_A : lcd_rs <= 1; ROW2_B : lcd_rs <= 1; ROW2_C : lcd_rs <= 1; ROW2_D : lcd_rs <= 1; ROW2_E : lcd_rs <= 1; ROW2_F : lcd_rs <= 1; endcase / 寫lcd_data case(next_state) IDLE : lcd_data <= 8'hxx; / 寫指令,初始化 DISP_SET : lcd_data <= 8'h38; DISP_OFF : lcd_data &l

32、t;= 8'h08; CLR_SCR : lcd_data <= 8'h01; CURSOR_SET1 : lcd_data <= 8'h06; CURSOR_SET2 : lcd_data <= 8'h0C; / 寫數據,顯示第一行 ROW1_ADDR : lcd_data <= 8'h80; ROW1_0 : lcd_data <= row1_val127:120; ROW1_1 : lcd_data <= row1_val119:112; ROW1_2 : lcd_data <= row1_val111:104; ROW1_3 : lcd_data <= row1_val103: 96; ROW1_4 : lcd_data <= row1_val 95: 88; ROW1_5 : lcd_data <= row1_val 87: 80; ROW1_6 : lcd_data <= row1_val 79: 72; ROW1_7 : lcd_data <= row1_val 71: 64; ROW1_8 : lcd_data <= row1_val 63: 56; ROW1_9

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論