名稱:QuartusLCD1602液晶驅(qū)動(dòng)顯示控制verilog代碼青創(chuàng)QC-FPGA開發(fā)板
軟件:Quartus
語言:Verilog
代碼功能:
LCD1602液晶驅(qū)動(dòng)顯示控制,第一行顯示"HUAWEI NOVA7",?第二行顯示"5Gshouji"。
顯示內(nèi)容可以直接修改以下代碼實(shí)現(xiàn):
parameter? ?Data_First =? "? HUAWEI NOVA7 ",? ? ? ? ? ? ? ? ?//液晶顯示的第一行的數(shù)據(jù)
Data_Second = "? ? 5Gshouji? ?";? ? ? ? ? ? ? ?//液晶顯示的第二行的數(shù)據(jù)
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在青創(chuàng)QC-FPGA開發(fā)板驗(yàn)證,青創(chuàng)QC-FPGA開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. 仿真文件
6. 仿真圖
部分代碼展示:
//?LCD_Driver.v //功能簡(jiǎn)述:在1602液晶模塊上顯示字符串 module?LCD_Driver(clk_LCD,rst,LCD_EN,RS,RW,DB8); input???clk_LCD,rst;????????//rst為全局復(fù)位信號(hào)(高電平有效) output??LCD_EN,RS,RW; //LCD_EN為L(zhǎng)CD模塊的使能信號(hào)(下降沿觸發(fā)) //RS=0時(shí)為寫指令;RS=1時(shí)為寫數(shù)據(jù) //RW=0時(shí)對(duì)LCD模塊執(zhí)行寫操作;RW=1時(shí)對(duì)LCD模塊執(zhí)行讀操作 output??[7:0]?DB8;??????????//8位指令或數(shù)據(jù)總線 reg?????[7:0]?DB8; reg?????[111:0]?Data_First_Buf,Data_Second_Buf;?????//液晶顯示的數(shù)據(jù)緩存 reg?????RS,LCD_EN_Sel; reg?????[3:0]?disp_count; reg?????[3:0]?state; parameter???Clear_Lcd?=?4'b0000,????????????????????????????//清屏并光標(biāo)復(fù)位 ????????????Set_Disp_Mode?=?4'b0001,????????????????????????//設(shè)置顯示模式:8位2行5x7點(diǎn)陣?? ????????????Disp_On?=?4'b0010,??????????????????????????????//顯示器開、光標(biāo)不顯示、光標(biāo)不允許閃爍 ????????????Shift_Down?=?4'b0011,???????????????????????????//文字不動(dòng),光標(biāo)自動(dòng)右移 ????????????Write_Addr?=?4'b0100,???????????????????????????//寫入顯示起始地址 ????????????Write_Data_First?=?4'b0101,?????????????????????//寫入第一行顯示的數(shù)據(jù) ????????????Write_Data_Second?=?4'b0110,????????????????????//寫入第二行顯示的數(shù)據(jù) ????????????Idel?=?4'b0111;?????????????????????????????????//空閑狀態(tài) parameter???Data_First?=??"??HUAWEI?NOVA7?",?????????????????//液晶顯示的第一行的數(shù)據(jù) ????????????Data_Second?=?"????5Gshouji???";???????????????//液晶顯示的第二行的數(shù)據(jù)??? assign??RW?=?1'b0;?????????????????????//RW=0時(shí)對(duì)LCD模塊執(zhí)行寫操作 assign??LCD_EN?=?LCD_EN_Sel???clk_LCD?:?1'b0; //通過LCD_EN_Sel信號(hào)來控制LCD_EN的開啟與關(guān)閉 always?@(posedge?clk_LCD?or?negedge?rst) begin ???if(!rst) ??????begin ??????????state?<=?Clear_Lcd;???????????????????????????????//復(fù)位:清屏并光標(biāo)復(fù)位?? ??????????RS?<=?1'b0;???????????????????????????????????????//復(fù)位:RS=0時(shí)為寫指令;?????????????????????? ??????????DB8?<=?8'b0;??????????????????????????????????????//復(fù)位:使DB8總線輸出全0 ??????????LCD_EN_Sel?<=?1'b1;???????????????????????????????//復(fù)位:開啟夜晶使能信號(hào) ??????????//Data_First_Buf?<=?Data_First; ??????????//Data_Second_Buf?<=?Data_Second; ??????????disp_count?<=?4'b0; ??????end ???else ??????case(state)???????????????????????????????????????????//初始化LCD模塊 ??????Clear_Lcd: ?????????????begin ????????????????state?<=?Set_Disp_Mode; ????????????????DB8?<=?8'b00000001;?????????????????????????//清屏并光標(biāo)復(fù)位?? ?????????????end ??????Set_Disp_Mode: ?????????????begin ????????????????state?<=?Disp_On; ????????????????DB8?<=?8'b00111000;?????????????????????????//設(shè)置顯示模式:8位2行5x8點(diǎn)陣???????? ?????????????end ??????Disp_On: ?????????????begin ????????????????state?<=?Shift_Down; ????????????????DB8?<=?8'b00001100;?????????????????????????//顯示器開、光標(biāo)不顯示、光標(biāo)不允許閃爍??? ?????????????end ??????Shift_Down: ????????????begin ????????????????state?<=?Write_Addr; ????????????????DB8?<=?8'b00000110;?????????????????????????//文字不動(dòng),光標(biāo)自動(dòng)右移??? ????????????end ??????Write_Addr: ????????????begin ????????????????state?<=?Write_Data_First; ????????????????DB8?<=?8'b10000001;?????????????????????????//寫入第一行顯示起始地址:第一行第二個(gè)位置??? ????????????????Data_First_Buf?<=?Data_First;???????????????//將第一行顯示的數(shù)據(jù)賦給Data_First_Buf? ????????????end ??????Write_Data_First:?????????????????????????????????????//寫第一行數(shù)據(jù) ????????????begin ????????????????if(disp_count?==?14)????????????????????????//disp_count等于14時(shí)表示第一行數(shù)據(jù)已寫完 ????????????????????begin ????????????????????????DB8?<=?8'b11000001;?????????????????//送入寫第二行的指令 ????????????????????????RS?<=?1'b0; ????????????????????????disp_count?<=?4'b0; ????????????????????????Data_Second_Buf?<=?Data_Second; ????????????????????????state?<=?Write_Data_Second;?????????//寫完第一行進(jìn)入寫第二行狀態(tài) ????????????????????end ????????????????else ????????????????????begin ????????????????????????DB8?<=?Data_First_Buf[111:104]; ?????????????????????? ????????????????????????RS?<=?1'b1;?????????????????????????//RS=1表示寫數(shù)據(jù) ????????????????????????disp_count?<=?disp_count?+?1'b1; ????????????????????????Data_First_Buf?<=?(Data_First_Buf?<<?8); ????????????????????????state?<=?Write_Data_First; ????????????????????end ????????????end ??????Write_Data_Second:????????????????????????????????????//寫第二行數(shù)據(jù) ????????????begin ????????????????if(disp_count?==?14) ????????????????????begin ????????????????????????LCD_EN_Sel?<=?1'b0; ????????????????????????RS?<=?1'b0; ????????????????????????disp_count?<=?4'b0; ????????????????????????state?<=?Idel;??????????????????????//寫完進(jìn)入空閑狀態(tài) ????????????????????end ????????????????else ????????????????????begin ????????????????????????DB8?<=?Data_Second_Buf[111:104]; ????????????????????? ????????????????????????RS?<=?1'b1; ????????????????????????disp_count?<=?disp_count?+?1'b1; ????????????????????????Data_Second_Buf?<=?(Data_Second_Buf?<<?8); ????????????????????????state?<=?Write_Data_Second; ????????????????????end????????????? ????????????end ??????Idel:???? ????????????begin ????????????????state?<=??Idel;?????????????????????????????//在Idel狀態(tài)循環(huán)? ????????????end ??????default:??state?<=?Clear_Lcd;?????????????????????????//若state為其他值,則將state置為Clear_Lcd ??????endcase end endmodule
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=376