微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > VHDL怎么写1602驱动?

VHDL怎么写1602驱动?

时间:10-02 整理:3721RD 点击:
各位大神给点提示。用状态机写着写着就糊涂了。

//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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top