高级会员
- 积分
- 949
- 金钱
- 949
- 注册时间
- 2015-10-25
- 在线时间
- 131 小时
|
/*基于lcd12864显示实验
*菜单界面显示
*作者:汪桐生
*日期:2016/7/30
*R/W=L,E信号下降沿锁存信号,R/W=H,E=H数据被读取
*汪----CDF4
*桐----CDA9
*生----C9FA
*汉字第一行地址:80H
*汉字第二行地址:90H
*汉字第三行地址:88H
*汉字第四行地址:98H
*/
module lcd(
clk, //
rst_n,//复位
en, //使能信号
data, //数据位
rs, //数据/指令选择,高电平显示数据
rw, //读写选择,高电平为读
psb //串/并行接口选择--H为并行,L为串行
);
//端口定义
input clk;
input rst_n;
output en;
output [7:0] data;
output rs;
output rw;
output psb;
reg rs;
reg [7:0] data;
reg lcd_clk;//设置为液晶时钟
reg [23:0] cnt; //计数器,用于液晶时钟
reg [7:0] c_state;//次态
reg [7:0] n_state;
assign psb=1'b1;//设置为并行接口
assign rw =1'b0;//由于只是用写操作,所以设置恒为0
//相对于FPGA而言,lcd是慢操作设备,由数据手册可取其频率为500KHZ
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt<=0;
else if(cnt==49999)
cnt<=0;
else
cnt<=cnt+1'b1;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
lcd_clk<=0;
else if(cnt==49999)
lcd_clk<=~lcd_clk;
else
lcd_clk<=lcd_clk;
end
assign en=lcd_clk;//在并行数据传输的时候,使能端就相当于液晶的时钟信号
//这里采用三段式状态,描写对于液晶的写操作
always@(posedge lcd_clk or negedge rst_n)begin
if(!rst_n)
c_state<=0;
else
c_state<=n_state;
end
always@(*)begin
case(c_state)
8'd0:begin
rs=0; //写指令
data=8'h31;//设置为8位数据格式,支持基本指令集
n_state=8'd1;
end
8'd1:begin
rs=0; //写指令
data=8'h0c;//打开显示
n_state=8'd2;
end
8'd2:begin
rs=0; //写指令
data=8'h06;//设置输入方式,增量不移位
n_state=8'd3;
end
8'd3:begin
rs=0; //写指令
data=8'h01;//设置清屏
n_state=8'd4;
end
8'd4:begin
rs=0; //写指令
data=8'h80;//设置起始位置,第一行
n_state=8'd5;
end
//汪
8'd5:begin
rs=1; //写数据
data=8'hCD;
n_state=8'd6;
end
8'd6:begin
rs=1; //写数据
data=8'hF4;
n_state=8'd7;
end
//桐
8'd7:begin
rs=1;
data=8'hCD;
n_state=8'd8;
end
8'd8:begin
rs=1;
data=8'hA9;
n_state=8'd9;
end
//生
8'd9:begin
rs=1;
data=8'hc9;
n_state=8'ha;
end
8'ha:begin
rs=1;
data=8'hfa;
n_state=8'hb;
end
8'hb:n_state=8'hc;
default:;
endcase
end
endmodule
|
|