⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd0.v

📁 Mars-XC2S50-S-Core-V2.0开发板核心板的说明和设计文档
💻 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 + -