📄 lcd0.v
字号:
module lcd0(clk,nrst,lcd_e,lcd_rs,lcd_rw,lcd_psb,lcd_rst,data );
input clk,nrst; //时钟和复位信号输入
output lcd_e,lcd_rs,lcd_rw,lcd_psb,lcd_rst;//lcd的控制信号
output [7:0] data;
reg lcd_e;
reg lcd_rs;
reg lcd_rst;
reg [7:0] data; //lcd数据接口
reg[5:0] mstate; //主状态机
reg[7:0] cnt;
reg[15:0] div_cnt; //分频 计数器
parameter idle =6'b00_0001;
parameter setfunction1_a =6'b00_0010;
parameter setfunction1_b =6'b00_0011;
parameter setfunction1_c =6'b00_0100;
parameter setfunction2_a =6'b00_0101;
parameter setfunction2_b =6'b00_0110;
parameter setfunction2_c =6'b00_0111;
parameter clear_a =6'b00_1000;
parameter clear_b =6'b00_1001;
parameter clear_c =6'b00_1010;
parameter setmode_a =6'b00_1011;
parameter setmode_b =6'b00_1100;
parameter setmode_c =6'b00_1101;
parameter setcursor_a =6'b00_1110;
parameter setcursor_b =6'b00_1111;
parameter setcursor_c =6'b01_0000;
parameter setDDRAM_a =6'b01_0001;
parameter setDDRAM_b =6'b01_0010;
parameter setDDRAM_c =6'b01_0011;
parameter writDDRAM_Ha =6'b01_0100;
parameter writDDRAM_Hb =6'b01_0101;
parameter writDDRAM_Hc =6'b01_0110;
parameter writDDRAM_La =6'b01_0111;
parameter writDDRAM_Lb =6'b01_1000;
parameter writDDRAM_Lc =6'b01_1001;
parameter delay =6'b01_1010;
assign lcd_psb =1; //并行方式控制lcd
assign lcd_rw =0;
always @(posedge clk or negedge nrst)
begin
if(!nrst)
div_cnt<=16'b0000_0000_0000_0000;
else
div_cnt<=div_cnt+1;
end
assign clk_div = div_cnt[15];
always @(posedge clk_div or negedge nrst)
begin
if(!nrst)
begin
mstate<=idle;
cnt<=8'b1000_1000;
end
else
casex(mstate)
idle : begin
lcd_rs<=0;
lcd_e <=0;
data <=0;
if(!cnt)
begin
mstate<=setfunction1_a;
lcd_rst<=1;
end
else
begin
cnt<=cnt-1;
lcd_rst<=0; //复位lcd
mstate<=idle;
end
end
setfunction1_a : begin
mstate<=setfunction1_b; //扩充指令操作
lcd_rs<=0;
lcd_e <=0;
data <=8'b00110100;
end
setfunction1_b : begin
mstate<=setfunction1_c;
lcd_rs<=0;
lcd_e<=1;
end
setfunction1_c : begin
mstate<=setfunction2_a;
lcd_rs<=0;
lcd_e<=0;
end
setfunction2_a : begin //基础指令操作
mstate<=setfunction2_b;
lcd_rs<=0;
lcd_e<=0;
data<=8'b00110000;
end
setfunction2_b : begin
mstate<=setfunction2_c;
lcd_rs<=0;
lcd_e<=1;
end
setfunction2_c : begin
mstate<=clear_a;
lcd_rs<=0;
lcd_e<=0;
end
clear_a : begin //清屏操作
mstate<=clear_b;
lcd_rs<=0;
lcd_e<=0;
data<=8'b00010000;
end
clear_b : begin
mstate<=clear_c;
lcd_rs<=0;
lcd_e<=1;
end
clear_c : begin
mstate<=setmode_a;
lcd_rs<=0;
lcd_e<=0;
end
setmode_a : begin //指定在资料写入或读取时,光标的移动方向,
mstate<=setmode_b; //设定DDRAM 的地址计数器(AC)自动增加
lcd_rs<=0;
lcd_e<=0;
data<=8'b00000110;
end
setmode_b : begin
mstate<=setmode_c;
lcd_rs<=0;
lcd_e<=1;
end
setmode_c : begin
mstate<=setcursor_a;
lcd_rs<=0;
lcd_e<=0;
end
setcursor_a : begin //开显示,关光标,不闪
mstate<=setcursor_b;
lcd_rs<=0;
lcd_e<=0;
data<=8'b00001100;
end
setcursor_b : begin
mstate<=setcursor_c;
lcd_rs<=0;
lcd_e<=1;
end
setcursor_c : begin
mstate<=setDDRAM_a;
lcd_rs<=0;
lcd_e<=0;
end
setDDRAM_a : begin //设定DDRAM地址
mstate<=setDDRAM_b;
lcd_rs<=0;
lcd_e<=0;
data<=8'b10000000;
end
setDDRAM_b : begin
mstate<=setDDRAM_c;
lcd_rs<=0;
lcd_e<=1;
end
setDDRAM_c : begin
mstate<=writDDRAM_Ha;
lcd_rs<=0;
lcd_e<=0;
cnt<=8'b00100000; //显示汉字数量64
end
writDDRAM_Ha : begin //调用汉字库显示
mstate<=writDDRAM_Hb; //写入第一字节数据(高位)
lcd_rs<=1;
lcd_e<=0;
data<=8'b10110000;
end
writDDRAM_Hb : begin
mstate<=writDDRAM_Hc;
lcd_rs<=1;
lcd_e<=1;
end
writDDRAM_Hc : begin
mstate<=writDDRAM_La;
lcd_rs<=1;
lcd_e<=0;
end
writDDRAM_La : begin //写入第一字节数据(低位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -