研究1602驱动是因为老师要求写一个DDS的程序。之前没写过这类驱动,他们说跟1602驱动程序差不多,就是以状态机的形式写驱动。那我就先从熟悉的1602入手接触这种驱动的写法。这可绝不是简单的把单片机程序翻译成verilog程序这么简单。

1602的一般原理就不说了,在网上参考了好多驱动程序,也不知道能不能用,不过我贴的这个感觉还比较靠谱,但也没实测过,改了改注释,仅当学习用。

注意:

1、LCD时钟需要自己分频得到,一般100Hz级别的吧,反正很慢。

2、实际不能直接用双引号把字符输入进去,应该用ascII码,我这只是为了方便表示。

3、如果用12864显示中文,那就要去找相应的字符代码,也不能直接双引号输入。

总之,用fpga来驱动液晶简直就是蛋疼!

verilog写的LCD1602显示

*******************************************************************************/

//省去分频部分

// LCD_Driver.v

//功能简述:在1602液晶模块上显示字符串,其中第一行显示“Welcome to lhy"

// 在第二行显示“www.lhy.com"

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 = "welcome to lhy", //液晶显示的第一行的数据

Data_Second ="www.lhy.com"; //液晶显示的第二行的数据

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];

Data_First_Buf<= (Data_First_Buf << 8);

RS <=1'b1; //RS=1表示写数据

disp_count<= disp_count + 1'b1;

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];

Data_Second_Buf<= (Data_Second_Buf << 8);

RS <=1'b1;

disp_count<= disp_count + 1'b1;

state <=Write_Data_Second;

end

end

Idel:

begin

state <=Idel; //在Idel状态循环

end

default: state <= Clear_Lcd;//若state为其他值,则将state置为Clear_Lcd endcase

end

endmodule

verilog驱动1602液晶屏相关推荐

  1. arduino下载库出错_arduino的I2C通讯 3:驱动1602液晶屏

    上个推送,我们学习了I2C功能的基础知识.而且知道了使用很多器件都需要安装库.本次,我们一起来做一个实例,用arduino驱动1602液晶屏 1602代表屏幕有16列,2行.传统的驱动方式占用了大量的 ...

  2. 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo. 本文使用Markdown写成,为获得更好的 ...

  3. 通过 I2C 驱动 LCD1602 液晶屏(51单片机)

    通过 I2C 驱动 LCD1602 液晶屏(51单片机) 硬件实物 原理图 3.程序 #include <reg51.h> #include <intrins.h>#defin ...

  4. stm32驱动LCD12864液晶屏驱动程序,亲测可行,复制直接能用!

    废话不多说,直接贴程序,你自己复制过去即可,免得我通过把工程上传的方式,你下载还得需要c币,这个现在很贵呀!!! 就两个文件,LCD12864.h和LCD12864.c,自己复制过去后,改一下引脚即可 ...

  5. ESP32驱动LCD液晶屏选型、262K什么意思?SPI写LCD的GRAM时序、MCU液晶屏驱动IC的寄存器功能

    最近转战ESP32,ESP32-D0WDQ6 型号的GPIO只有那么20个左右,且还有几个GPIO只能做输入,非常捉襟见肘.所以如果要驱动LCD液晶屏,绝大多数都会选择SPI接口的MCU屏. 为了编写 ...

  6. 电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

    电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键 这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS130 ...

  7. stm32 arduino 驱动jlx液晶屏

    stm32 arduino 驱动jlx液晶屏 1.说明 单片机这次用的是STM32F103C8T6,烧成arduino用,库还是我们的老朋友u8g2.液晶屏型号是JLX 240160G-676,SPI ...

  8. MCU驱动和RGB驱动的液晶屏的区别

    概况来讲,RGB驱动需要的硬件条件高,比如用STM32F429的LTDC+DMA2D模块,外加SDRAM作为显存.而MCU接口,STM32F407系列的控制器就整合了这个模块,包含6800和8080两 ...

  9. 单通道驱动LVDS驱动1080P液晶屏

    上周末把单通道LVDS驱动1080P液晶屏调通了.通过FPGA接收单8的LVDS输入,内部一个倍频,数据组合格式如下:

  10. mega16驱动1602液晶

    用mega16驱动1602液晶,搞了三天,终于搞成功了!!!!仰天长啸:我日!现在我总结一下使用1602液晶时可能出现的问题吧: 1.首先就是我犯的最傻的一个问题:数据指针设置时候我将数据指针指向了( ...

最新文章

  1. C语言文件操作函数大全(看到总结的真的很好,就转载贡献给大家了)
  2. 一个用python做的完整项目_我从一个小项目学习Python编程的全过程(二)
  3. Linux编程 8 (挂载mount,查看磁盘df du,搜索grep,压缩zgip,归档tar)
  4. [奇葩 bug]视图在 ipad5 上正常显示,在 iPad3上超出了边界
  5. Python中的Dask数组
  6. oracle获取登录名,oracle如何获取当前登录的用户名
  7. Python实现完全二叉树
  8. JAVA CRC16校验码计算
  9. 免费的html代码大全,html代码大全,搜集最全的html代码.doc
  10. 基于FPGA的关于flash一些学习记录
  11. 电子公文流转暨无纸办公系统
  12. 基于数据挖掘技术的客户保有应用研究
  13. 计算机同步时间解析错误,Windows时间同步时出错该怎么解决?
  14. 解决因cocosStudio发布的csb文件过大导致的加载游戏界面卡的问题
  15. aspectj tomcat load-time waver
  16. android自动化测试unity,基于Unity3D引擎的UI自动化测试方案
  17. C++语言99个常见编程错误 常见错误7:无视基础语言的精妙之处
  18. windows下安装GVM
  19. GoldenSource和McObject推出最快的RegTechEDM解决方案
  20. 关于Jupyter Notebook的环境配置

热门文章

  1. 微信怎么录屏聊天记录?这两个方法值得收藏!
  2. C2 CompilerThread9 长时间占用CPU解决方案
  3. 再看《英雄本色》:世上已无英雄?
  4. php远程控制代码,内部网络机器的远程控制软件UltraVNC及其源代码
  5. 三进制计算机可以实现吗,制造三进制计算机的一种方法技术
  6. 《计算机应用基础》在线考核,2019年秋季考试《计算机应用基础》在线考核试题 在Excel 2010中为了取消分类汇总的操作必须...
  7. 做wifi微信认证服务器,怎么实施微信WiFi认证-微信认证的特点
  8. 联想Y40加装固态硬盘
  9. TestNG教程二:testNG常用测试类型
  10. Spring 事务源码(7)—事务的completeTransactionAfterThrowing回滚、commitTransactionAfterReturning提交以及事务源码总结【一万字】