LCD1602液晶显示实验要点.pdf

上传人:tbuqq 文档编号:5197357 上传时间:2020-02-19 格式:PDF 页数:15 大小:611.37KB
返回 下载 相关 举报
LCD1602液晶显示实验要点.pdf_第1页
第1页 / 共15页
LCD1602液晶显示实验要点.pdf_第2页
第2页 / 共15页
LCD1602液晶显示实验要点.pdf_第3页
第3页 / 共15页
LCD1602液晶显示实验要点.pdf_第4页
第4页 / 共15页
LCD1602液晶显示实验要点.pdf_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《LCD1602液晶显示实验要点.pdf》由会员分享,可在线阅读,更多相关《LCD1602液晶显示实验要点.pdf(15页珍藏版)》请在三一文库上搜索。

1、实 验 报 告 实验名称: LCD1602 液晶显示实验 姓名: 学号: 指导教师: 实验时间: 2013 年 6 月 15 日 信息与通信工程学院 2 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、2 所示: 图 1-2 1602LCD 尺寸图 1.1602LCD 主要技术参数: 显示容量 : 16 2 个字符 芯片工作电压: 4.55.5V 工作电流 : 2.0mA(5.0V) 模块最佳工作电压: 5.0V 字符尺寸 : 2.95 4.35(W H)mm 2.引脚功能说明: 1602LCD 采用标准的14 脚(无背光)或16 脚(带背光)接口,各引脚接口说明如表: 表 1-3 引脚接口说明表 编 号 符号引脚说明编号符号引脚说明 1 VSS 电源地9 D2 数据 2 VDD 电源正极10 D3 数据 3 VL 液晶显示偏压11 D4 数据 4 RS 数据 /命令选择12 D5 数据 5

3、 R/W 读/写选择13 D6 数据 6 E 使能信号14 D7 数据 7 D0 数据15 BLA 背光源正极 8 D1 数据16 BLK 背光源负极 3 1.1.3 1602LCD 的指令说明及时序 1602 液晶模块内部的控制器共有11 条控制指令,如表1-4 所示: 表 1-4 控制命令表 序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开 /关控制 0 0 0 0 0 0 1 D C B 5 光

4、标或字符移位0 0 0 0 0 1 S/C R/L * * 6 置功能0 0 0 0 1 DL N F * * 7 置字符发生存贮器 地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到 CGRAM 或 DDRAM ) 1 0 要写的数据内容 11 从 CGRAM 或 DDRAM读数 1 1 读出的数据内容 1602 液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、 0 为 低电平)读写操作时序如图1-5 和 1-6 所示: 图 1-5 读操作时序 4 图

5、1-6 写操作时序 1.1.4 1602LCD 的 RAM 地址映射及标准字库表 液晶显示模块是一个慢显示器件,所以,在执行每条指令之前,一定要确认模块的忙标志为低电平, 表示不忙,否则此指令失效。要显示字符时,要先输入显示字符地址,也就是告诉模块在哪里显示字符, 图 1-7 是 1602 的内部显示地址。 图 1-7 1602LCD 内部显示地址 例如, 第二行第一个字符的地址是40H,那么是否直接写入40H 就可以将光标定位在第二行第一个 字符的位置呢?这样不行,因为写入显示地址时要求最高位D7 恒定为高电平1,所以实际写入的数据应 该是 01000000B (40H)+10000000B

6、(80H)=11000000B(C0H)。 在对液晶模块的初始化中,要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需 人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602 液晶模块内部的字符发生存储器(CGROM )已经存储了160 个不同的点阵字符图形,这些字 符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码, 比如大写的英文字母“A” 的代码是01000001B(41H),显示时模块把地址41H 中的点阵字符图形显示出 来,我们就能看到字母“A” 因为 1602 识别的是ASCII 码,试验可以用ASCII 码直接赋值

7、, 编程中还可以用字符型常量或变量赋 值,如“ A”。 1602 通过 D0D7 的 8 位数据端传输数据和指令。 1.1.5 1602LCD 的一般初始化(复位)过程 延时 15mS 5 写指令 38H(不检测忙信号) 延时 5mS 写指令 38H(不检测忙信号) 延时 5mS 写指令 38H(不检测忙信号) 以后每次写指令、读/写数据操作均需要检测忙信号 写指令 38H:显示模式设置 写指令 08H:显示关闭 写指令 01H:显示清屏 写指令 06H:显示光标移动设置 写指令 0CH:显示开及光标设置 1.2 任务 1 及其原理 任务 1:更改 lcd 上显示的字符。通过更改wire 12

8、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驱动测试模块”文件中w

9、ire 127:0 row1_val,wire 127:0 row2_val变量进行改动,将row1_val原本赋予的字符替换为一个变量,设定新的时钟,即循环变换的间 隔时间,再通过条件语句控制循环。使能键的控制原理是通过对循环变换的条件进行操作实现的,即当按 键使能时循环开始,反之,则从0 开始。 6 2. 实验流程图 09 循环变换流程图 开始 定义输入输出变 量及类型 lcd 液晶屏初 始化 是否有按键按 下? 复位键是否启 动? 定义 a=8h30;i=0 将 a赋值给 row1_val低 8位 是否是时钟输入 上升沿? i 0123456789ABCDEF - wire 127:0

10、row1_val = “ liu wupeng “; wire 127:0 row2_val = “ 2009081206 “; assign SEL0 = 1b0; assign SEL1 = 1b0; assign SEL2 = 1b1; / + 11 / 分频模块开始 / + reg 15:0 cnt; / 计数子 always (posedge clk, negedge rst_n) if (!rst_n) cnt = 0; else cnt = cnt + 1b1; / 500Khz 1MHz 皆可 wire lcd_clk = cnt15; / (215 / 50M) = 1.31

11、ms / - / 分频模块结束 / - / + / LCD1602驱动模块开始 / + / 格雷码编码:共40 个状态 parameter IDLE = 8h00; / 写指令,初始化 parameter DISP_SET = 8h01; / 显示模式设置 parameter DISP_OFF = 8h03; / 显示关闭 parameter CLR_SCR = 8h02; / 显示清屏 parameter CURSOR_SET1 = 8h06; / 显示光标移动设置 parameter CURSOR_SET2 = 8h07; / 显示开及光标设置 / 显示第一行 parameter ROW1

12、_ADDR = 8h05; / 写第 1 行起始地址 parameter ROW1_0 = 8h04; parameter ROW1_1 = 8h0C; parameter ROW1_2 = 8h0D; parameter ROW1_3 = 8h0F; parameter ROW1_4 = 8h0E; parameter ROW1_5 = 8h0A; parameter ROW1_6 = 8h0B; parameter ROW1_7 = 8h09; parameter ROW1_8 = 8h08; parameter ROW1_9 = 8h18; parameter ROW1_A = 8h19

13、; parameter ROW1_B = 8h1B; parameter ROW1_C = 8h1A; parameter ROW1_D = 8h1E; parameter ROW1_E = 8h1F; parameter ROW1_F = 8h1D; / 显示第二行 parameter ROW2_ADDR = 8h1C; / 写第 2 行起始地址 parameter ROW2_0 = 8h14; parameter ROW2_1 = 8h15; 12 parameter ROW2_2 = 8h17; parameter ROW2_3 = 8h16; parameter ROW2_4 = 8h

14、12; parameter ROW2_5 = 8h13; parameter ROW2_6 = 8h11; parameter ROW2_7 = 8h10; parameter ROW2_8 = 8h30; parameter ROW2_9 = 8h31; parameter ROW2_A = 8h33; parameter ROW2_B = 8h32; parameter ROW2_C = 8h36; parameter ROW2_D = 8h37; parameter ROW2_E = 8h35; parameter ROW2_F = 8h34; reg 5:0 current_state

15、, next_state; / 现态、次态 / FSM: always1 always (posedge lcd_clk, negedge rst_n) if(!rst_n) current_state = IDLE; else current_state = next_state; / FSM: always2 always begin case(current_state) IDLE : next_state = DISP_SET; / 写指令,初始化 DISP_SET : next_state = DISP_OFF; DISP_OFF : next_state = CLR_SCR; CL

16、R_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_1; ROW1_1 : next_state = ROW1_2; ROW1_2 : next_state = ROW1_3; ROW1_3 : next_state = ROW1_4; ROW1_4 : next_state = ROW1_

17、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; ROW1_A : next_state = ROW1_B; ROW1_B : next_state = ROW1_C; ROW1_C : next_state = ROW1_D; ROW1_D : next_state = ROW1_E; 13 ROW1_E : next_state = RO

18、W1_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_state = 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 : n

19、ext_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_state = ROW2_D; ROW2_D : next_state = ROW2_E; ROW2_E : next_state = ROW2_F; ROW2_F : next_state = ROW1_ADDR; / default : next_state = IDLE ; endca

20、se end / FSM: always3 always (posedge lcd_clk, negedge rst_n) begin if(!rst_n) begin lcd_rs = 0; lcd_data = 8hxx; end else begin / 写 lcd_rs 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

21、 = 0; / 写数据,显示第一行 ROW1_ADDR : lcd_rs = 0; 14 ROW1_0 : lcd_rs = 1; ROW1_1 : lcd_rs = 1; ROW1_2 : lcd_rs = 1; ROW1_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; ROW

22、1_C : lcd_rs = 1; ROW1_D : lcd_rs = 1; ROW1_E : lcd_rs = 1; ROW1_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

23、 = 1; ROW2_9 : lcd_rs = 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 = 8hxx; / 写指令,初始化 DISP_SET : lcd_data = 8h38; DISP_OFF : lcd_data = 8h08; CLR_SCR : lcd_data

24、= 8h01; CURSOR_SET1 : lcd_data = 8h06; CURSOR_SET2 : lcd_data = 8h0C; / 写数据,显示第一行 15 ROW1_ADDR : lcd_data = 8h80; 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; R

25、OW1_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 : lcd_data = row1_val 55: 48; ROW1_A : lcd_data = row1_val 47: 40; ROW1_B : lcd_data = row1_val 39: 32; ROW1_C : lcd_data = row1_val 31: 24; ROW1_

26、D : lcd_data = row1_val 23: 16; ROW1_E : lcd_data = row1_val 15: 8; ROW1_F : lcd_data = row1_val 7: 0; / 写数据,显示第二行 ROW2_ADDR : lcd_data = 8hC0; ROW2_0 : lcd_data = row2_val127:120; ROW2_1 : lcd_data = row2_val119:112; ROW2_2 : lcd_data = row2_val111:104; ROW2_3 : lcd_data = row2_val103: 96; ROW2_4 :

27、 lcd_data = row2_val 95: 88; ROW2_5 : lcd_data = row2_val 87: 80; ROW2_6 : lcd_data = row2_val 79: 72; ROW2_7 : lcd_data = row2_val 71: 64; ROW2_8 : lcd_data = row2_val 63: 56; ROW2_9 : lcd_data = row2_val 55: 48; ROW2_A : lcd_data = row2_val 47: 40; ROW2_B : lcd_data = row2_val 39: 32; ROW2_C : lcd_data = row2_val 31: 24; ROW2_D : lcd_data = row2_val 23: 16; ROW2_E : lcd_data = row2_val 15: 8; ROW2_F : lcd_data = row2_val 7: 0; endcase end end assign lcd_e = lcd_clk; / 数据在时钟高电平被锁存 assign lcd_rw = 1b0; / 只写 / - / LCD1602驱动模块结束 / - endmodule

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1