LCD1602液晶显示实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LCD1602液晶显示实验报告
一、实验目的
(1)了解LCD1602的基本原理,掌握其基本的工作流程。

(2)学习用Verilog HDL语言编写LCD1602的控制指令程序,能够在液晶屏上显示出正确的符号。

(3)能够自行改写程序,并实现符号的动态显示。

二、实验设备与器件
Quartus II 软件、EP2C8Q208C8实验箱
三、实验方案设计
1.实验可实现的功能
可以实现在LCD1602液晶屏第一行左侧第一位的位置循环显示0~9,并且可以用一个拨码开关BM8实现显示的复位功能。

2.LCD1602基本知识
LCD1602液晶能够同时显示16x02即32个字符,模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如“A”。

1602通过D0~D7的8位数据端传输数据和指令。

3.系统工作原理
系统的状态转换流程图如图3.1.1所示。

通过状态流程图可以看到,LCD1602液晶屏的状态是不断更新的,依次完成液晶的初始化和0~9的动态显示过程,并且过程可由开关控制。

if (!rst_n)
cnt <= 0;
else
cnt <= cnt + 1'b1;
wire lcd_clk = cnt[23]; // (2^23 / 50M)=0.168s always@(posedge lcd_clk)
if(cnt1>=24'd2)
begin
reg lcd_clk1;
lcd_clk1=1;
cnt1=0;
end
else
begin
cnt1=cnt1+1; //cnt1对lcd_clk二分频
lcd_clk1=0;
end
always@(posedge lcd_clk1)
begin
row1_val<=8'h30;//设初值
case(row1_val) //数字0~9循环显示8'h30: row1_val<=8'h31;
8'h31: row1_val<=8'h32;
8'h32: row1_val<=8'h33;
8'h33: row1_val<=8'h34;
8'h34: row1_val<=8'h35;
8'h35: row1_val<=8'h36;
8'h36: row1_val<=8'h37;
8'h37: row1_val<=8'h38;
8'h38: row1_val<=8'h39;
8'h39: row1_val<=8'h30;
default: row1_val<=8'h30;
endcase
end
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; // 显示开及光标设置parameter ROW1_ADDR = 8'h05; // 写第1行起始地址parameter ROW1_0 = 8'h04;
reg [5:0] current_state, next_state; // 现态、次态
always @ (posedge lcd_clk, negedge rst_n)
if(!rst_n) current_state <= IDLE;
else current_state <= next_state;//在时钟信号作用期间,次态重复
的赋给现态
always
begin
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;
ROW1_0 : next_state = ROW1_ADDR;
default : next_state = IDLE ;
endcase
end
always @ (posedge lcd_clk, negedge rst_n)
begin
if(!rst_n)
begin
lcd_rs <= 0;
lcd_data <= 8'hxx;
end
else
begin
case(next_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;
endcase
case(next_state)
IDLE : lcd_data <= 8'hxx;
DISP_SET : lcd_data <= 8'h38;
DISP_OFF : lcd_data <= 8'h08;
CLR_SCR : lcd_data <= 8'h01;
CURSOR_SET1 : lcd_data <= 8'h04;
CURSOR_SET2 : lcd_data <= 8'h0C;
ROW1_ADDR : lcd_data <= 8'h80;
ROW1_0 : lcd_data <= row1_val[127:120];
endcase
end
end
assign lcd_e = lcd_clk; // 数据在时钟高电平被锁存
assign lcd_rw = 1'b0; // 只写
endmodule
5.下载电路及引脚分配设计
设计中用实验箱自带的50MHz时钟信号作为输入端,用sel0、sel1、sel2三个使能端选通LCD1602液晶屏,EP2C8Q208C8就会工作在给液晶下命令的状态,使得点阵正常工作,如图3.5.1所示。

图3.5.1 输入输出端口电路
引脚分配设计如图3.5.2所示。

图3.5.2 引脚分配
四、实验仿真及结论
1.液晶显示仿真波形
液晶显示仿真波形如图4.1.1所示。

图4.1.1 仿真波形
通过仿真可以看到,液晶的状态转换是:DISP_SET(38H)显
显示清屏
显示开关及光标设置
写第一行起始地址
后面的数字就可依次循环了,直到拨码开关复位后停止显示,回到DISP_SET(38H)显示模式设置的状态。

而lcd_rw一直为低电平处于写状态,并且当lcd_rs为高电平时lcd_data送的是数字,低电平时写第一行的地址。

显示过程中偶数的显示时间是奇数显示时间的二倍。

2.实验结论
本次设计实验完成了LCD1602液晶显示实验的原程序中,顶层文件与子模块的合并,实现了液晶屏第一行首个字符位置处0~9的循环显示,并且可以用一个拨码开关控制现实的复位功能。

仿真结果与实验现象均说明了,程序设计的功能和时序基本无误,整个系统功能已实现,实验目的基本达到。

五、实验总结与体会
1.实验总结
这是FPGA第二次课的实验,到这次课编程的知识学得还不是很透彻,虽然程序写的比较吃力,但最终还是实现了要求的功能,现在我先说一说在实验时主要遇到的问题。

最开始的时候程序写好了,下载试验箱上却没有任何反应,我还以为程序有问题,仔细查了一遍才想起来,BM8拨码开关一直是处于复位状态的,再次下载后,使拨码开关置高,显示屏果然显示数字了。

但是另外一问题又出现了,就是这些数字是随机出现的,毫无规律可言,与0~9依次循环的顺序相差甚大,初步判断应该是lcd_data赋值的程序段有问题。

再仔细检查这段程序,发现此时的赋值程序应该由时钟控制,而不是一股脑的全部赋值。

我用lcd_clk脉冲信号的二分频信号lcd_clk1控制赋值的速度,编译下载后,液晶就能正常显示了。

2.实验体会
通过这次实验,我了解了LCD1602的基本原理,学习了用Verilog HDL语言编程控制液晶的静态和动态字符显示,这为我在后面的综合实验中,给蜂鸣器音乐发生器实验增加功能提供了思路。

总体来说,这次实验让我在第一次实验的基础上又学到了很多东西,我感到受益匪浅。

相关文档
最新文档