📄 lcd.v.bak
字号:
/************************************************************/
/*************************2008.08.03*************************/
/*******************Created by Shi Hailong*******************/
/**********************WuHan University**********************/
/************************************************************/
module LCD(clk,din,wr,cs,a0,reset,dout,addr);
input clk;
input[7:0] din;
output wr,cs,a0,reset;
output[7:0] dout;
output[5:0] addr;
reg wr,cs,a0,reset;
reg[7:0] dout;
reg[5:0] addr;
reg[7:0] char;
reg com_flag;
reg[7:0] datetemp;
reg[15:0] delay_cnt;
reg[7:0] Byte_cnt,hanzi_cnt;
reg[15:0] Clear_cnt;
reg[7:0] state,breakpoint,sub_state,Interupt;
reg[15:0] Cursor_addr,Cursor_addr0;
parameter Reset_LCD=8'd0, Init_LCD=8'd10, WR_Clear=8'd20,
WR_hanzi=8'd30, WR_ABC=8'd40, WR_hanzi0=8'd50,
WR_ABC0=8'd60, WR_hanzi_over=8'd70,
WR_Begin=8'd200, WR_LOW=8'd201, WR_CS_LOW=8'd202,
WR_Delay1=8'd203, WR_Delay2=8'd204, WR_Delay3=8'd205,
WR_HIGH=8'd206, WR_CS_HIGH=8'd207, WR_OVER=8'd208,
WR_Date=8'd100, Clear_LCD=8'd101, WR_String=8'd102;
always@(posedge clk)
begin
case(state)
Reset_LCD:begin
case(sub_state)
8'd0:begin
if(delay_cnt<=16'hfff0) begin wr<=1;cs<=1;reset<=0;delay_cnt<=delay_cnt+1'b1;end
else begin delay_cnt<=16'd0;sub_state<=sub_state+1'b1;end
end
8'd1:begin
if(delay_cnt<=16'hfff0) begin wr<=1;cs<=1;reset<=1;delay_cnt<=delay_cnt+1'b1;end
else begin delay_cnt<=16'd0;sub_state<=sub_state+1'b1;end
end
8'd2:begin
sub_state<=8'd0;
state<=Init_LCD;
end
endcase
end
Init_LCD:begin
case(sub_state)
8'd0:begin
com_flag<=1'b1;
datetemp<=8'h40;//Init_LCD COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd1:begin
com_flag<=1'b0;
datetemp<=8'h30;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd2:begin
com_flag<=1'b0;
datetemp<=8'h87;//P2
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd3:begin
com_flag<=1'b0;
datetemp<=8'h07;//P3
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd4:begin
com_flag<=1'b0;
datetemp<=8'd39;//P4
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd5:begin
com_flag<=1'b0;
datetemp<=8'h44;//P5
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd6:begin
com_flag<=1'b0;
datetemp<=8'd239;//P6
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd7:begin
com_flag<=1'b0;
datetemp<=8'd40;//P7
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd8:begin
com_flag<=1'b0;
datetemp<=8'd0;//P8
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd9:begin
com_flag<=1'b1;
datetemp<=8'h59;//Start Display COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd10:begin
com_flag<=1'b0;
datetemp<=8'h17;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd11:begin
com_flag<=1'b1;
datetemp<=8'h46;//Cursor Address COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd12:begin
com_flag<=1'b0;
datetemp<=8'h00;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd13:begin
com_flag<=1'b0;
datetemp<=8'h00;//P2
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd14:begin
com_flag<=1'b1;
datetemp<=8'h5d;//Cursor Type COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd15:begin
com_flag<=1'b0;
datetemp<=8'h07;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd16:begin
com_flag<=1'b0;
datetemp<=8'h87;//P2
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd17:begin
com_flag<=1'b1;
datetemp<=8'h4c;//Cursor Move Right COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd18:begin
com_flag<=1'b1;
datetemp<=8'h44;//Set Display Area COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd19:begin
com_flag<=1'b0;
datetemp<=8'h00;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd20:begin
com_flag<=1'b0;
datetemp<=8'h00;//P2
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd21:begin
com_flag<=1'b0;
datetemp<=8'd240;//P3
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd22:begin
com_flag<=1'b0;
datetemp<=8'h00;//P4
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd23:begin
com_flag<=1'b0;
datetemp<=8'h40;//P5
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd24:begin
com_flag<=1'b0;
datetemp<=8'd240;//P6
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd25:begin
com_flag<=1'b1;
datetemp<=8'h5b;//Set Add Type COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd26:begin
com_flag<=1'b0;
datetemp<=8'h00;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd27:begin
com_flag<=1'b1;
datetemp<=8'h5a;//Set Dot Move COM;
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd28:begin
com_flag<=1'b0;
datetemp<=8'h00;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Init_LCD;
state<=WR_Begin;
end
8'd29:begin
sub_state<=8'd0;
Cursor_addr<=16'h4000;
Cursor_addr0<=16'd80;
state<=WR_Clear;
end
endcase
end
/***********************************************************/
WR_Clear:begin
Interupt<=WR_hanzi;
state<=Clear_LCD;
end
WR_hanzi:begin
if(hanzi_cnt<=8'd19)begin Interupt<=WR_hanzi;hanzi_cnt<=hanzi_cnt+1'b1;state<=WR_Date;end
else begin hanzi_cnt<=8'd0;state<=WR_ABC;Cursor_addr<=Cursor_addr+11'd1920;end
end
WR_ABC:begin
Interupt<=WR_hanzi0;
state<=WR_String;
end
WR_hanzi0:begin
if(hanzi_cnt<=8'd19)begin Interupt<=WR_hanzi0;hanzi_cnt<=hanzi_cnt+1'b1;state<=WR_Date;end
else begin hanzi_cnt<=8'd0;state<=WR_ABC0;Cursor_addr<=Cursor_addr+11'd1920;end
end
WR_ABC0:begin
Interupt<=WR_hanzi_over;
state<=WR_String;
Cursor_addr0<=Cursor_addr0+8'd120;
end
WR_hanzi_over:state<=WR_hanzi_over;
/*************************************************************/
WR_Begin:begin
state<=WR_LOW;
cs<=1'b0;
wr<=1'b1;
if(com_flag) a0<=1'b1;//Write a COM
else a0<=1'b0;//Write a Date
end
WR_LOW:begin
state<=WR_CS_LOW;
cs<=1'b0;
wr<=1'b0;
end
WR_CS_LOW:begin
state<=WR_Delay1;
cs<=1'b0;
wr<=1'b0;
dout<=datetemp;
end
WR_Delay1:begin
state<=WR_Delay2;
end
WR_Delay2:begin
state<=WR_Delay3;
end
WR_Delay3:begin
state<=WR_HIGH;
end
WR_HIGH:begin
state<=WR_CS_HIGH;
cs<=1'b0;
wr<=1'b1;
end
WR_CS_HIGH:begin
state<=WR_OVER;
cs<=1'b1;
wr<=1'b1;
end
WR_OVER:begin
if(delay_cnt<=16'h00ff) delay_cnt<=delay_cnt+1'b1;//Delay
else begin delay_cnt<=16'd0;state<=breakpoint;end
end
/******************************************************/
WR_Date:begin
case(sub_state)
8'd0:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=8'h46;
com_flag<=1'b1;
end
8'd1:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=Cursor_addr[7:0];
com_flag<=1'b0;
end
8'd2:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=Cursor_addr[15:8];
com_flag<=1'b0;
end
8'd3:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=8'h4f;
com_flag<=1'b1;
end
8'd4:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=8'h42;
com_flag<=1'b1;
end
8'd5:begin
if(Byte_cnt<=8'd15)
begin
Byte_cnt<=Byte_cnt+1'b1;
sub_state<=8'd5;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=din;
addr<=addr+1'b1;
com_flag<=1'b0;
end
else begin
Byte_cnt<=8'd0;
sub_state<=sub_state+1'b1;
Cursor_addr<=Cursor_addr+1'b1;
end
end
8'd6:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=8'h46;
com_flag<=1'b1;
end
8'd7:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=Cursor_addr[7:0];
com_flag<=1'b0;
end
8'd8:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=Cursor_addr[15:8];
com_flag<=1'b0;
end
8'd9:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=8'h4f;
com_flag<=1'b1;
end
8'd10:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=8'h42;
com_flag<=1'b1;
end
8'd11:begin
if(Byte_cnt<=8'd15)
begin
Byte_cnt<=Byte_cnt+1'b1;
sub_state<=8'd11;
state<=WR_Begin;
breakpoint<=WR_Date;
datetemp<=din;
addr<=addr+1'b1;
com_flag<=1'b0;
end
else begin
Byte_cnt<=8'd0;
sub_state<=sub_state+1'b1;
Cursor_addr<=Cursor_addr+1'b1;
end
end
8'd12:begin
state<=Interupt;
sub_state<=8'd0;
end
endcase
end
/************************************************************/
Clear_LCD:begin
case(sub_state)
8'd0:begin
sub_state<=sub_state+1'b1;
state<=Clear_LCD;
end
8'd1:begin
com_flag<=1'b1;
datetemp<=8'h4c;//Cursor Move Right COM;
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd2:begin
com_flag<=1'b1;
datetemp<=8'h46;//Cursor Address COM;
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd3:begin
com_flag<=1'b0;
datetemp<=8'h00;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd4:begin
com_flag<=1'b0;
datetemp<=8'h00;//P2
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd5:begin
com_flag<=1'b1;
datetemp<=8'h42;//Start Write Date COM
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd6:begin
if(Clear_cnt<16'd1200)
begin
Clear_cnt<=Clear_cnt+1'b1;
sub_state<=8'd6;
state<=WR_Begin;
breakpoint<=Clear_LCD;
datetemp<=8'h20;
com_flag<=1'b0;
end
else begin
Clear_cnt<=8'd0;
sub_state<=sub_state+1'b1;
end
end
8'd7:begin
com_flag<=1'b1;
datetemp<=8'h46;//Cursor Address COM;
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd8:begin
com_flag<=1'b0;
datetemp<=8'h00;//P1
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd9:begin
com_flag<=1'b0;
datetemp<=8'h40;//P2
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd10:begin
com_flag<=1'b1;
datetemp<=8'h42;//Start Write Date COM
sub_state<=sub_state+1'b1;
breakpoint<=Clear_LCD;
state<=WR_Begin;
end
8'd11:begin
if(Clear_cnt<16'd9600)
begin
Clear_cnt<=Clear_cnt+1'b1;
sub_state<=8'd11;
state<=WR_Begin;
breakpoint<=Clear_LCD;
datetemp<=8'h00;
com_flag<=1'b0;
end
else begin
Clear_cnt<=8'd0;
sub_state<=sub_state+1'b1;
end
end
8'd12:begin
sub_state<=8'd0;
state<=Interupt;
end
endcase
end
/*************************************************************/
WR_String:begin
case(sub_state)
8'd0:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_String;
datetemp<=8'h46;
com_flag<=1'b1;
end
8'd1:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_String;
datetemp<=Cursor_addr0[7:0];
com_flag<=1'b0;
end
8'd2:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_String;
datetemp<=Cursor_addr0[15:8];
com_flag<=1'b0;
end
8'd3:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_String;
datetemp<=8'h4c;
com_flag<=1'b1;
end
8'd4:begin
sub_state<=sub_state+1'b1;
state<=WR_Begin;
breakpoint<=WR_String;
datetemp<=8'h42;
com_flag<=1'b1;
char<=8'h20;
end
8'd5:begin
if(Byte_cnt<8'd96)
begin
Byte_cnt<=Byte_cnt+1'b1;
sub_state<=8'd5;
state<=WR_Begin;
breakpoint<=WR_String;
datetemp<=char;
char<=char+1'b1;
com_flag<=1'b0;
end
else begin
Byte_cnt<=8'd0;
char<=8'h20;
sub_state<=sub_state+1'b1;
end
end
8'd6:begin
state<=Interupt;
sub_state<=8'd0;
end
endcase
end
/*********************************************************/
default:state<=Reset_LCD;
endcase
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -