赞
踩
目录
本工程采用野火征途PRO开发板,外接LCD1602部件进行测试。
VSS | 电源地 |
VDD | 电源正极 |
V0 | 偏压(可不接或接地或接电位器调整电压) |
RS | 寄存器选择(Register Select,选择数据或命令寄存器) |
RW | 读/写 |
E | 使能 |
D0-D7 | 8位数据 |
A | 背光正极 |
K | 背光负极 |
运行时间(250Khz): 1.64 µs
功能:清DDRAM和AC值。
运行时间(250Khz): 1.64 µs
功能:AC= 0, 光标、画面回HOME位。
运行时间(250Khz): 40 µs
功能:设置光标、画面移动方式。
其中:I/D =1: 数据读、写操作后,AC自动增一;
I/D =0: 数据读、写操作后,AC自动减一;
S = 1:数据读、写操作,画面平移;
S = 0: 数据读、写操作,画面不动。
运行时间(250Khz): 40 µs
功能:设置显示、光标及闪烁开关。
其中:D表示显示开关:D = 1为开,D = 0为关;
C表示光标开关:C = 1为开,C = 0为关;
B表示闪烁开关:B = 1为开,B = 0为关。
运行时间(250Khz): 40 µs
功能:光标、画面移动,不影响DDRAM。
其中:S/C = 1: 画面左移一个字符位;
S/C = 0: 画面右移一个字符位;
R/L = 1: 光标左移一个字符位;
R/L = 0:光标右移一个字符位。
运行时间(250Khz): 40 µs
功能:工作方式设置(初始化指令)。
其中:DL = 1:8位数据接口;
DL = 0:4位数据接口;
N = 1:两行显示;
N = 0:一行显示;
F = 1:5 × 10点阵字符;
F = 0:5 × 7点阵字符。
运行时间(250Khz): 40 µs
功能:设置CG RAM地址。A5 ~ A0 = 0 ~ 3FH
运行时间(250Khz): 40 µs
功能:设置DD RAM地址;
N = 0:一行显示,A6 ~ A0 = 0 ~ 4FH
N = 1: 两行显示,首行A6 ~ A0 = 00H ~ 2FH ,次行A6 ~ A0 = 40H ~ 67H
运行时间(250Khz): 40 µs
功能:根据最近设置的地址性质,数据写入DD RAM或CG RAM内。
'h38:功能设置(初始化指令,设置数据接口位数-1.3.6)
'h08:显示关闭(所有显示1.3.4)
'h01:显示清屏(清DDRAM和AC(AddressCount地址计数器)值-1.3.1)
'h06:显示光标及画面移动设置(控制读写后AC自动增减一,控制画面平移或不动-1.3.3)
'h0c:显示开及光标设置(控制显示开关,光标开关,闪烁开关-1.3.4)
'h18:画面左移(1.3.5)
a) DDRAM就相当于显示映射,最多可以显示2行*40列=80个字符,但是屏幕上只支持显示2行*16列=32个字符,显示字符时直接把想要显示数字或字母的ASCII值赋给D0-D7即可。
b) CGROM中存储了00-ff个字符(其中00-07字符可以由CGRAM定义),用户将地址写入到DDRAM,相当于是把地址写入了CGROM中,然后CGROM将字符输出到DDRAM进行显示。
c) CGRAM可以存储自定义字符,下图为DDRAM数据,CGRAM地址与写入字模码之间关系
1、字符码(DDRAM数据)0 ~ 2位与CGRAM地址3 ~ 5位对应(要么是000,要么是001);
2、CGRAM地址0 ~ 2位生成字模数据行位置(一个字符8行,一次输入一行,注意第八行为游标位置)
3、字符码3位的赋值状态并不影响用户自定义
4、用户自定义字符码的范围为00H ~ 07H或者08H ~ 0FH,也就是说字符码00H与08H对应同一 组用户自定义字符字模;
d) 自定义字符输入完毕后,将自定义字符的地址赋值给DDRAM即可显示自定义字符
字符码 | CGRAM地址 |
0x00 | 0x00-0x07 |
0x01 | 0x08-0x0f |
0x02 | 0x10-0x17 |
0x03 | 0x18-0x1f |
0x04 | 0x20-0x27 |
0x05 | 0x28-0x2f |
0x06 | 0x30-0x37 |
0x07 | 0x38-0x3f |
a) 程序烧录到FPGA后首先复位15ms
b) 15ms后进入INIT初始化状态
c) INIT初始化状态分别写0x38 0x08 0x01 0x06 0x0c
每次写指令或数据间隔时间均远大于处理时间,故不用考虑读忙信号
- // -------------------状态机控制LCD数据/指令赋值
- always @(posedge I_clk or negedge I_rst_n) begin
- if (!I_rst_n) begin
- O_lcd_data <= 8'd0;
- end
- else begin
- case(S_state_c)
- IDLE :begin O_lcd_data <= 8'h38; O_lcd_rs <= 0;end//初始化指令,设置lcd1602模式为8位数据接口;两行显示,5*7点阵(硬件限制)
- S1 :begin O_lcd_data <= 8'h01; O_lcd_rs <= 0;end//清屏(清DDRAM以及AC计数器)
- S2 :begin O_lcd_data <= 8'h06; O_lcd_rs <= 0;end//控制读写后AC自动增减一,控制画面不动
- S3 :begin O_lcd_data <= 8'h0c; O_lcd_rs <= 0;end//控制显示开,光标关,闪烁关
- ROW1_ADDR :begin O_lcd_data <= 8'h80; O_lcd_rs <= 0;end
- WRITE :begin O_lcd_data <= S_data_display; O_lcd_rs <= 1;end
- ROW2_ADDR :begin O_lcd_data <= 8'hc0; O_lcd_rs <= 0;end
- stop :begin O_lcd_data <= 8'h18; O_lcd_rs <= 0;end//控制画面左移
- default:;
- endcase
- end
- end
一开始用的字模软件生成的01序列,但是5*8点阵来显示汉字有点太挤了,看不出来字形,所以将“仰殊观”这三个汉字拆成了两部分,其中“仰”的第一部分用一个5*8点阵显示,第二部分和“以”的左边一个竖用一个5*8点阵显示,“以”的右边部分用一个5*8点阵显示,“殊观”两个字分别用两个5*8点阵显示
-
- // -------------------字符显示寄存器S_data_display赋值
- /*
- 向CGRAM写入数据
-
- */
- always @(*) begin
- case(S_char_cnt)
- //-------------仰-------------
- 'd0: S_data_display = 8'h05;
- 'd1: S_data_display = 8'h0a;
- 'd2: S_data_display = 8'h1a;
- 'd3: S_data_display = 8'h0a;
- 'd4: S_data_display = 8'h0b;
- 'd5: S_data_display = 8'h0a;
- 'd6: S_data_display = 8'h08;
- 'd7: S_data_display = 8'h00;
- //------------仰以------------
- 'd8: S_data_display = 8'h1d;
- 'd9: S_data_display = 8'h15;
- 'd10: S_data_display = 8'h15;
- 'd11: S_data_display = 8'h1d;
- 'd12: S_data_display = 8'h11;
- 'd13: S_data_display = 8'h11;
- 'd14: S_data_display = 8'h11;
- 'd15: S_data_display = 8'h00;
- //-------------以-------------
- 'd16: S_data_display = 8'h04;
- 'd17: S_data_display = 8'h04;
- 'd18: S_data_display = 8'h14;
- 'd19: S_data_display = 8'h14;
- 'd20: S_data_display = 8'h14;
- 'd21: S_data_display = 8'h0a;
- 'd22: S_data_display = 8'h11;
- 'd23: S_data_display = 8'h00;
- //-------------殊-------------
- 'd24: S_data_display = 8'h1f;
- 'd25: S_data_display = 8'h04;
- 'd26: S_data_display = 8'h0b;
- 'd27: S_data_display = 8'h15;
- 'd28: S_data_display = 8'h01;
- 'd29: S_data_display = 8'h02;
- 'd30: S_data_display = 8'h04;
- 'd31: S_data_display = 8'h00;
- //-------------殊-------------
- 'd32: S_data_display = 8'h14;
- 'd33: S_data_display = 8'h1f;
- 'd34: S_data_display = 8'h04;
- 'd35: S_data_display = 8'h1f;
- 'd36: S_data_display = 8'h0e;
- 'd37: S_data_display = 8'h15;
- 'd38: S_data_display = 8'h04;
- 'd39: S_data_display = 8'h00;
- //-------------观-------------
- 'd40: S_data_display = 8'h1f;
- 'd41: S_data_display = 8'h11;
- 'd42: S_data_display = 8'h0a;
- 'd43: S_data_display = 8'h04;
- 'd44: S_data_display = 8'h0a;
- 'd45: S_data_display = 8'h11;
- 'd46: S_data_display = 8'h00;
- 'd47: S_data_display = 8'h00;
- //-------------观-------------
- 'd48: S_data_display = 8'h1f;
- 'd49: S_data_display = 8'h15;
- 'd50: S_data_display = 8'h15;
- 'd51: S_data_display = 8'h04;
- 'd52: S_data_display = 8'h0c;
- 'd53: S_data_display = 8'h15;
- 'd54: S_data_display = 8'h07;
- 'd55: S_data_display = 8'h00;
- default:S_data_display = "P";
- endcase
- end
这里采用的方法是将DDRAM的2行40列全部显示0-9-a-z-A-D(10+26+4=40),然后让屏幕滚动起来
LCD1602循环显示0-9-a-z-A-D(一)
LCD1602循环显示0-9-a-z-A-D(二)
LCD1602循环显示0-9-a-z-A-D(三)
这里采用的方法是用excel自己排列每个汉字的01序列,然后写入CGRAM中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。