VHDL怎么写1602驱动?
//lcd脉冲分频
reg lcd_rstemp;
assign lcd_rs =lcd_rstemp;
reg[7:0] lcd_douttemp;
assign lcd_databus = lcd_douttemp + 8'h30; //注意这 我这是为了输出数字方便 看看1602的字库就明白为了
assign lcd_rw = 1'b0;
reg[15:0] lcd_clk_count = 16'd0;
assign lcd_en = lcd_clk_count[15];//lcd的下降沿使能脉冲 、、刷新频率通过这修改
reg[7:0] lcd_r0c0,lcd_r0c1,lcd_r0c2,lcd_r0c3,lcd_r0c4,lcd_r0c5,lcd_r0c6,lcd_r0c7,lcd_r0c8,lcd_r0c9,lcd_r0c10,lcd_r0c11,lcd_r0c12,lcd_r0c13,lcd_r0c14,lcd_r0c15;
reg[7:0] lcd_r1c0,lcd_r1c1,lcd_r1c2,lcd_r1c3,lcd_r1c4,lcd_r1c5,lcd_r1c6,lcd_r1c7,lcd_r1c8,lcd_r1c9,lcd_r1c10,lcd_r1c11,lcd_r1c12,lcd_r1c13,lcd_r1c14,lcd_r1c15;
always @ (posedge PLL50M)
begin
lcd_clk_count <= lcd_clk_count + 1'b1;
end
//中间删除了一部分 数值显示的
parameter lcd_init = 5'b00001;
parameter lcd_wrone = 5'b00010;
parameter one_two = 5'b00100;
parameter lcd_wrtwo = 5'b01000;
parameter two_one = 5'b10000;
reg[4:0] lcd_state = 5'd1;
reg[3:0] lcd_write_num = 4'd0;
always @ (posedge lcd_en)
begin
case(lcd_state)
lcd_init:
begin
lcd_rstemp <= 1'b0;
lcd_write_num <= lcd_write_num + 1'b1;
case(lcd_write_num)
4'd0: lcd_douttemp <= 8'h08;//8bit总线 2行
4'd1: lcd_douttemp <= 8'hde;//显示功能开 无光标
4'd2: lcd_douttemp <= 8'hd6;//显示地址设置
4'd3: lcd_douttemp <= 8'h50;//地址定位第一行地址
4'd4: lcd_douttemp <= 8'hd1;//清屏
4'd15: lcd_state <= lcd_wrone;
default:;
endcase
end
lcd_wrone:
begin
lcd_rstemp <= 1'b1;
lcd_write_num <= lcd_write_num + 1'b1;
case(lcd_write_num)
4'd0: lcd_douttemp <= lcd_r0c0;
4'd1: lcd_douttemp <= lcd_r0c1;
4'd2: lcd_douttemp <= lcd_r0c2;
4'd3: lcd_douttemp <= lcd_r0c3;
4'd4: lcd_douttemp <= lcd_r0c4;
4'd5: lcd_douttemp <= lcd_r0c5;
4'd6: lcd_douttemp <= lcd_r0c6;
4'd7: lcd_douttemp <= lcd_r0c7;
4'd8: lcd_douttemp <= lcd_r0c8;
4'd9: lcd_douttemp <= lcd_r0c9;
4'd10: lcd_douttemp <= lcd_r0c10;
4'd11: lcd_douttemp <= lcd_r0c11;
4'd12: lcd_douttemp <= lcd_r0c12;
4'd13: lcd_douttemp <= lcd_r0c13;
4'd14: lcd_douttemp <= lcd_r0c14;
4'd15: begin lcd_douttemp <= lcd_r0c15; lcd_state <= one_two; end
default:;
endcase
end
one_two:
begin
lcd_rstemp <= 1'b0;
lcd_douttemp <= 8'h90; //地址定位第二行
lcd_state <= lcd_wrtwo;
end
lcd_wrtwo:
begin
lcd_rstemp <= 1'b1;
lcd_write_num <= lcd_write_num + 1'b1;
case(lcd_write_num)
4'd0: lcd_douttemp <= lcd_r1c0;
4'd1: lcd_douttemp <= lcd_r1c1;
4'd2: lcd_douttemp <= lcd_r1c2;
4'd3: lcd_douttemp <= lcd_r1c3;
4'd4: lcd_douttemp <= lcd_r1c4;
4'd5: lcd_douttemp <= lcd_r1c5;
4'd6: lcd_douttemp <= lcd_r1c6;
4'd7: lcd_douttemp <= lcd_r1c7;
4'd8: lcd_douttemp <= lcd_r1c8;
4'd9: lcd_douttemp <= lcd_r1c9;
4'd10: lcd_douttemp <= lcd_r1c10;
4'd11: lcd_douttemp <= lcd_r1c11;
4'd12: lcd_douttemp <= lcd_r1c12;
4'd13: lcd_douttemp <= lcd_r1c13;
4'd14: lcd_douttemp <= lcd_r1c14;
4'd15: begin lcd_douttemp <= lcd_r1c15; lcd_state <= two_one; end
default:;
endcase
end
two_one:
begin
lcd_rstemp <= 1'b0;
lcd_douttemp <= 8'h50; //第一行
lcd_state <= lcd_wrone;
end
default:lcd_state <= lcd_init;
endcase
end
