QuartusLCD1602液晶驱动显示控制verilog代码青创QC-FPGA开发板

名称:QuartusLCD1602液晶驱动显示控制verilog代码青创QC-FPGA开发板(文末获取)

软件:Quartus

语言:Verilog

代码功能:

LCD1602液晶驱动显示控制

第一行显示"HUAWEI NOVA7" 

第二行显示"5Gshouji"     

显示内容可以直接修改以下代码实现

parameter   Data_First =  "  HUAWEI NOVA7 ",                 //液晶显示的第一行的数据

            Data_Second = "    5Gshouji   ";               //液晶显示的第二行的数据   

本代码已在青创QC-FPGA开发板验证,青创QC-FPGA开发板如下,其他开发板可以修改管脚适配:

青创QC-FPGA开发板.png

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真文件

6. 仿真图

部分代码展示:

// LCD_Driver.v
//功能简述:在1602液晶模块上显示字符串
module LCD_Driver(clk_LCD,rst,LCD_EN,RS,RW,DB8);
input   clk_LCD,rst;        //rst为全局复位信号(高电平有效)
output  LCD_EN,RS,RW;
//LCD_EN为LCD模块的使能信号(下降沿触发)
//RS=0时为写指令;RS=1时为写数据
//RW=0时对LCD模块执行写操作;RW=1时对LCD模块执行读操作
output  [7:0] DB8;          //8位指令或数据总线
reg     [7:0] DB8;
reg     [111:0] Data_First_Buf,Data_Second_Buf;     //液晶显示的数据缓存
reg     RS,LCD_EN_Sel;
reg     [3:0] disp_count;
reg     [3:0] state;
parameter   Clear_Lcd = 4'b0000,                            //清屏并光标复位
            Set_Disp_Mode = 4'b0001,                        //设置显示模式:8位2行5x7点阵  
            Disp_On = 4'b0010,                              //显示器开、光标不显示、光标不允许闪烁
            Shift_Down = 4'b0011,                           //文字不动,光标自动右移
            Write_Addr = 4'b0100,                           //写入显示起始地址
            Write_Data_First = 4'b0101,                     //写入第一行显示的数据
            Write_Data_Second = 4'b0110,                    //写入第二行显示的数据
            Idel = 4'b0111;                                 //空闲状态
parameter   Data_First =  "  HUAWEI NOVA7 ",                 //液晶显示的第一行的数据
            Data_Second = "    5Gshouji   ";               //液晶显示的第二行的数据   
assign  RW = 1'b0;                     //RW=0时对LCD模块执行写操作
assign  LCD_EN = LCD_EN_Sel ? clk_LCD : 1'b0;
//通过LCD_EN_Sel信号来控制LCD_EN的开启与关闭
always @(posedge clk_LCD or negedge rst)
begin
   if(!rst)
      begin
          state <= Clear_Lcd;                               //复位:清屏并光标复位  
          RS <= 1'b0;                                       //复位:RS=0时为写指令;                      
          DB8 <= 8'b0;                                      //复位:使DB8总线输出全0
          LCD_EN_Sel <= 1'b1;                               //复位:开启夜晶使能信号
          //Data_First_Buf <= Data_First;
          //Data_Second_Buf <= Data_Second;
          disp_count <= 4'b0;
      end
   else
      case(state)                                           //初始化LCD模块
      Clear_Lcd:
             begin
                state <= Set_Disp_Mode;
                DB8 <= 8'b00000001;                         //清屏并光标复位  
             end
      Set_Disp_Mode:
             begin
                state <= Disp_On;
                DB8 <= 8'b00111000;                         //设置显示模式:8位2行5x8点阵        
             end
      Disp_On:
             begin
                state <= Shift_Down;
                DB8 <= 8'b00001100;                         //显示器开、光标不显示、光标不允许闪烁   
             end
      Shift_Down:
            begin
                state <= Write_Addr;
                DB8 <= 8'b00000110;                         //文字不动,光标自动右移   
            end
      Write_Addr:
            begin
                state <= Write_Data_First;
                DB8 <= 8'b10000001;                         //写入第一行显示起始地址:第一行第二个位置   
                Data_First_Buf <= Data_First;               //将第一行显示的数据赋给Data_First_Buf?
            end
      Write_Data_First:                                     //写第一行数据
            begin
                if(disp_count == 14)                        //disp_count等于14时表示第一行数据已写完
                    begin
                        DB8 <= 8'b11000001;                 //送入写第二行的指令
                        RS <= 1'b0;
                        disp_count <= 4'b0;
                        Data_Second_Buf <= Data_Second;
                        state <= Write_Data_Second;         //写完第一行进入写第二行状态
                    end
                else
                    begin
                        DB8 <= Data_First_Buf[111:104];
                      
                        RS <= 1'b1;                         //RS=1表示写数据
                        disp_count <= disp_count + 1'b1;
                        Data_First_Buf <= (Data_First_Buf << 8);
                        state <= Write_Data_First;
                    end
            end
      Write_Data_Second:                                    //写第二行数据
            begin
                if(disp_count == 14)
                    begin
                        LCD_EN_Sel <= 1'b0;
                        RS <= 1'b0;
                        disp_count <= 4'b0;
                        state <= Idel;                      //写完进入空闲状态
                    end
                else
                    begin
                        DB8 <= Data_Second_Buf[111:104];
                     
                        RS <= 1'b1;
                        disp_count <= disp_count + 1'b1;
                        Data_Second_Buf <= (Data_Second_Buf << 8);
                        state <= Write_Data_Second;
                    end             
            end
      Idel:    
            begin
                state <=  Idel;                             //在Idel状态循环 
            end
      default:  state <= Clear_Lcd;                         //若state为其他值,则将state置为Clear_Lcd
      endcase
end
endmodule
完整代码

 扫描文章末尾的公众号二维码

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值