201100514-基于VHDL的1602液晶显示器实现
- 格式:pdf
- 大小:568.04 KB
- 文档页数:13
摘要在电子领域内,频率是一种最基本的参数,并与其他许多电参量的测量方案和测量结果都有着十分密切的关系。
由于频率信号抗干扰能力强、易于传输,可以获得较高的测量精度。
因此,频率的测量就显得尤为重要,测频方法的研究越来越受到重视。
频率计作为测量仪器的一种,常称为电子计数器,它的基本功能是测量信号的频率和周期频率计的应用范围很广,它不仅应用于一般的简单仪器测量,而且还广泛应用于教学、科研、高精度仪器测量、工业控制等其它领域。
随着微电子技术和计算机技术的迅速发展,特别是单片机的出现和发展,使传统的电子侧量仪器在原理、功能、精度及自动化水平等方面都发生了巨大的变化,形成一种完全突破传统概念的新一代侧量仪器。
频率计广泛采用了高速集成电路和大规模集成电路,使仪器在小型化、耗电、可靠性等方面都发生了重大的变化。
目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。
为适应实际工作的需要,本次设计给出了一种较小规模和单片机(AT89S52)相结合的频率计的设计方案,不但切实可行,而且体积小、保密性强、设计简单、成本低、精度高、可测频带宽,大大降低了设计成本和实现复杂度。
频率计的硬件电路是用Protel绘图软件绘制而成,软件部分的单片机控制程序,是以KeilC做为开发工具用C语言编写而成,而频率计的实现则是选用Ptotues仿真软件来进行模拟和测试。
关键词:单片机;AT89S52;频率计;C语言ABSTRACTIn the electronic field, frequency is a kind of most basic parameter, and all there are close relations in the measurement schemes of many other electric parameters and result of measuring. Because the signal anti-interference ability of frequency is strong, easy to transmit, can obtain higher measurement precision. So, the measurement of frequency seems particularly important, the research of the method is being paid attention to.The Frequency meter, as one kind of the measuring instrument, often called the electronic counter, its basic function is that frequency and application of cycle Frequency meter of measuring the signal are in a very large range, it not only applies to general simple instrument measurement but also apply to other fields such as teaching, scientific research, high-accuracy instrument measuring, industrial control extensively. With the rapid development of microelectric technique and computer technology, especially appearance and development of the one-chip computer, the instruments have all changed enormously in such aspects as principle, function, precision and automatic level to enable the traditional electronic side amount, form a kind of side amount instrument of new generation that totally broke through the traditional concept. The Frequency meter has adopted the high-speed integrated circuit and large scale integrated circuit extensively, make the instrument change greatly in such aspects as miniaturize, power consumptive, dependability. At present, there are various digital Frequency meter of multi-function, high precision, high frequency on the market, but the price is high.In order to meet the need of the real work, design and provide one this time The design plan of Frequency meter combining with one-chip computer (AT89S52) on a small scale, not only feasible, and small, of good security, design simply, with low costs, the precision is high, can examine the bandwidth frequently, have reduced the design cost and realized complexity greatly. The hardware circuit of the Frequency meter is drawing with Protel mapping software, the one-chip computer control procedure of the software part, regarded KeilC as the developing instrument to write in C language, but the realization of the Frequency meter was to select to carry on imitating and test with Protues artificial software. Key Words:single chip computer; AT89S52; frequency meter; C language目录1 绪论.................................................... 错误!未指定书签。
51单片机驱动1602液晶显示器c程序/*程序效果:单片机控制液晶显示器1602 显示字母数字,用户自行更改io程序原创安全:51hei*/#includereg52.h //头文件#define uchar unsigned char //宏定义#define uint unsigned intuchar code table[]=“51HEI XING XING “ ; //显示的字母uchar code table1[]=“51HEI MCUXUE YUAU” ;sbit lcdrs=P1; //寄存器选择引脚sbit lcdwr=P1;//读写引脚sbit lcde=P1 ; //片选引脚void delay(uchar x) //延时子函数{uchar i,j;for(i=x;i0;i--) for(j=110;j0;j--);}void write_com(uchar com) //写指令子函数{ //根据1602 液晶显示器协议编写P2=com; lcdrs=0;lcdwr=0;delay(5);lcde=0; delay(5);lcde=1; }void write_dat(uchar dat) //写数据子函数{P2=dat; lcdrs=1;lcdwr=0;delay(5);lcde=0;delay(5);lcde=1;}void init() //初始化子函数{write_com(0x01); //清屏write_com(0x3f); //功能设置write_com(0x0d); //显示控制write_com(0x06); //输入方式设置}void main(){ uchar i; //定义局部变量init();write_com(0x80+0x02+0x10); //指针的位置for(i=0;i15;i++) //显示{ write_dat(table[i]); delay(50); //延时,用于调节速度不匹配}write_com(0x80+0x40+0x10);for(i=0;i16;i++){ write_dat(table1[i]); delay(50);}for(i=0;i16;i++){ write_com(0x18); delay(50);} while(1);}tips:感谢大家的阅读,本文由我司收集整编。
实验1 1602型LCD显示一、实验目的:1. 了解Altera DE2-70多媒体开发板与PC(个人电脑)的正确连接;2. 掌握PC上安装的硬件设计环境Quartus II和应用程序设计环境Nios II;3. 初步了解IP核(硬件)模块的配置方法;4. 了解与此工程有关的顶层文件(.v);5. 掌握Nios II IDE的“hello world”软件工程模板;二、实验步骤:(一)初建工程:在PC上新建一个名为”demo_lcd”的工程鼠标左键双击桌面上的“Quartus II”快捷方式图标,耐心等待片刻,即可启动“Quartus II”设计页面,如图1-1所示。
图1-1在“Quartus II”设计页面内,鼠标左键单击“File -> New Project Wizard”。
弹出“New Project Wizard :introduction”。
如图1-2所示。
初次实验可以仔细阅读此页面内容,然后鼠标左键单击“next”按钮跳过此页,进入“New Project Wizard: Directory, Name, Top -level entity” 页面,如图1-3所示。
“the working directory for this project”(工程的工作目录)可以任意填写,例如:“E:/demo/demo_LCDdisplay”。
“工程的工作目录”如前“E:/demo/demo_LCDdisplay”,表示将会在E 盘上产生一个文件夹“demo”,在“demo”文件夹里产生另一个文件夹”demo_LCDdisplay”(工程文件夹,保存工程文件),此实验后续步骤中产生的各种文件会自动保存到路径“E:/demo/demo_LCDdisplay”下。
图1-2图1-3“the name of this project”(工程名字)填写为”demo_lcd”。
这里需要注意:由于“SOPC Builer”工具不能识别空格、中划线等符号,故实验所有步骤中如果需要命名,命名中不允许有空格、中划线出现,但“SOPC Builer”工具能识别下划线。
标签:单片机LCD基于51单片机的1602LCD显示基于51单片机的1602LCD显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。
LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只排阻RESPAC-8 10K 一只1602液晶显示器LM016L 一只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"#include<reg51.h> //包含单片机的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]={"Welcome to China"};unsigned char code string1[ ]={"Hi!Good morning!"};/*************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************函数功能:延时若干毫秒入口参数:n******************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*******************************************函数功能:判断液晶模块的忙碌状态返回值:result。
第一章设计要求及系统组成一、基本操作时序:读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:无读数据:输入:RS=H,RW=H,E= 高脉冲输出:D0~D7数据写数据:输入:RS=H,RW=L。
D0~D7=数据,E=高脉冲输出:无二、、、状态字说明:STA7 D7\ STA6 D6\ STA5 D5 \ STA4 D4 \STA3 D3 \ STA2 D2\\ STA1 D1STA0-6:当前数据地址指针的数值STA7:读写操作使能 1表示禁止,0表示允许对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0;但是我们可以进行延时进行实现。
RAM地址映射: LCD 16字*2行00 01 02 03 04 05 06 07 08 08 09 0A 0B 0C 0D 0E 0F (27)40 41 42 4F 50 (67)指令说明:1.初始化设置 1.显示模式设置指令码:00111000<0x38)功能:设置16*2显示,5*7点阵,8位数据接口必须开显示 2.显示开、关及光标设置指令码:00001DCB,功能:D=1 开显示;D=0 关显示;C=1显示光标;B=1 光标闪烁;B=0 光标不显示 000001NS:功能:N=1当读或写一个字符后地址指针加1,且光标加1;N=0相应的减1;S=1当写一个字符,整屏显示左移<N=1)或右移<N=0),以得到光标不移动而屏幕移动的效果。
S=0 当写一个字符,正屏显示不移动。
数据控制:控制器内部设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM4.2.1 数据指针设置:指令码:80H+地址码 <0-27H,第二行开始:40H-67H) 4..2.2 读数据,写数据其它设置:01H:显示清屏:1.数据指令清零 2 所有显示清零02H:显示回车:1.数据清零如何进行连接:实际操作中,液晶接到,第一管脚是D,第二管脚是VCC,15和16是背光,D0-D7是数据口,接到单片机的P0口,P0口接了两个锁存器,液晶,D/A,具有高阻状态的都可以随便接,没有影响,,第六管脚是LCDEN相当于 E,使能信号,它接P3^4,R/W接地,表示低电平,因为我们只进行写操作,RS 接2实验板上的P3^5。
1602液晶显示器基本操作时序标题:1602液晶显示器基本操作时序简介:本文将介绍1602液晶显示器的基本操作时序,帮助读者了解如何正确使用该显示器。
正文:1602液晶显示器是一种常用的显示设备,广泛应用于各种电子产品中。
为了正确使用该显示器,了解其基本操作时序是非常重要的。
第一步是连接显示器。
首先,将显示器的VSS引脚连接到地,VDD 引脚连接到电源正极。
接着,将V0引脚连接到可变电阻器的中间引脚,两侧引脚分别连接到地和电源正极。
然后,将RS引脚连接到控制器的某个I/O口,RW引脚连接到地,E引脚连接到控制器的另一个I/O口。
最后,将D4-D7引脚分别连接到控制器的其他四个I/O 口。
第二步是初始化显示器。
在连接完成后,需发送一系列指令来初始化显示器。
首先,将RS引脚置低电平,表示发送的是指令。
然后,发送0x33指令,接着发送0x32指令。
这两个指令用于设置显示模式。
接下来,发送0x28指令,用于设置显示器的行数和字体大小。
最后,发送0x0C指令,用于开启显示器并关闭光标。
第三步是写入数据。
在初始化完成后,可以向显示器写入数据进行显示。
将RS引脚置高电平,表示发送的是数据。
然后,发送0x80指令,将光标定位到第一行第一列。
接着,通过发送ASCII码来显示相应的字符或数字。
发送完一个字符后,将光标右移一位,直到显示完所有内容。
第四步是清屏和光标复位。
如果需要清除屏幕上的内容,只需发送0x01指令即可。
同时,可以将光标复位到第一行第一列,发送0x80指令即可。
在使用1602液晶显示器时,需要注意以上基本操作步骤和时序。
确保连接正确,并按照指令发送数据,才能正常显示内容。
同时,注意避免触碰显示器的其他部分,以免损坏设备。
总结:本文介绍了1602液晶显示器的基本操作时序,包括连接显示器、初始化显示器、写入数据以及清屏和光标复位。
正确操作显示器,能够实现准确的显示效果,提升用户体验。
希望本文能为读者在使用1602液晶显示器时提供一些帮助。
标签:单片机LCD基于51单片机的1602LCD显示基于51单片机的1602LCD显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。
LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只排阻 RESPAC-8 10K 一只1602液晶显示器 LM016L 一只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"#include<reg51.h> //包含单片机的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]={"Welcome to China"};unsigned char code string1[ ]={"Hi!Good morning!"};/*************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************函数功能:延时若干毫秒入口参数:n******************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*******************************************函数功能:判断液晶模块的忙碌状态返回值:result。
第2期2009年2月工矿自动化Industr y and M ine AutomationNo.2 Feb.2009收稿日期:2008-10-29作者简介:周 雷(1985-),男,中国矿业大学信号与信息处理专业2006级硕士研究生,研究方向为EDA 技术应用。
E 2mail:zhoul35@文章编号:1671-251X(2009)02-0093-02基于VHDL 的LCD 控制器的设计与实现周 雷, 付慧生, 熊建伟(中国矿业大学信电学院,江苏徐州 221008)摘要:文章介绍了基于VH DL 语言状态机的LCD 控制器的设计方法,说明了字符型液晶显示器显示的基本原理,给出了显示字符的方法及实现LCD 控制器的部分VH DL 语言程序。
基于VH DL 设计的LCD 控制器具有很好的移植性,稍加改动就可以应用到不同场合。
关键词:LCD 控制器;VH DL;字符显示 中图分类号:TP312 文献标识码:B 参考文献:[1] 高丽珍.新型矿用本质安全型电源的设计与研究[J].机械工程与自动化,2006(3):125~127.[2] 杨智敏,侯传教,刘 霞.单片式开关稳压器LM2576-ADJ 及其应用[J ].移动电源与车辆,2004(1):34~36.[3] 张乃国.电源技术[M].北京:中国电力出版社,1998.[4] 崔保春,王 聪,卢其威,等.矿用本质安全开关电源的研究[J].中国煤炭,2006(3):49~51.0 引言传统的LCD 控制器通常由单片机组成,具有集成电路复杂、移植性差等缺点。
随着可编程逻辑器件的发展,以FPGA(现场可编程门阵列)为平台,采用硬件编程语言来实现LCD 控制器,具有易于集成到片上系统、方便修改、适应不同液晶显示器等优点。
本文设计的LCD 控制器是一种基于FPGA 的液晶显示控制器,它采用VH DL 语言实现控制器的编程设计,这种设计方法稍加改动就可以应用于常见的LCD 接口电路中[1]。
2018年3月刊0 引言本设计中使用DE2开发板上的LCD1602液晶显示屏,此显示屏能够显示2行16列的5×7点阵字符,液晶模块内部CGROM中储存的字符包括阿拉伯数字、英文字母的大小写、常用的符号和日文假名等。
使用液晶显示屏相比于数码管或者LED显示有着极大的优势,其应用范围更广、显示功能更强,易于实现当今系统设计中越来越多的人机交互功能。
如今LCD液晶在智能电子产品中应用广泛,使用LCD液晶显示的系统设计已经成为电子产品设计中不可或缺的一部分。
使用FPGA对LCD1602进行驱动,可以实现系统各模块并行执行,从而使得显示部分实时反映系统状态,而且对于程序的各个模块便于修改与移植。
本设计使用Verilog语言对DE2开发板上的FPGA进行编程,驱动LCD1602显示字符。
1 原理1.1 硬件接口LCD1602受DE2开发板上的一块Cyclone II FPGA控制,两者相关引脚相连。
通过对FPGA进行编程就可以驱动LCD1602,从而实现字符的显基于FPGA的LCD1602液晶显示屏系统控制设计段旭阳1,韩延义2,王晓丹1,宋闻萱1(1.大连理工大学电子信息与电气工程学部,辽宁 大连 116024; 2.大连理工大学电工电子国家级实验教学示范中心、 国家级虚拟仿真实验教学中心,辽宁 大连 116024)【摘要】本研究基于FPGA实现驱动LCD1602液晶显示屏显示数字或者英文字符,设计中使用了Verilog硬件描述语言、Quartus II 6.0软件编程调试环境和DE2硬件环境,以完成对LCD1602液晶显示屏的系统设计。
最终,此液晶显示屏LCD1602可以完成显示数字或者英文字符的功能,该系统得以验证。
【关键词】Verilog语言;LCD显示;FPGA设计【中图分类号】G482 【文献标识码】A 【文章编号】2095-5065(2018)03-0056-05收稿日期:2017-12-11作者简介:段旭阳(1997—),男,河北邢台人,本科生在读,研究方向为电子信息与电气工程;韩延义(1964—),男,辽宁大连人,工程师,研究方向为FPGA;王晓丹(1996—),女,山东东营人,本科生在读,研究方向为电子信息与电气工程;宋闻萱(1998—),女,吉林白山人,本科生在读,研究方向为电子信息与电气工程。
FPGA 控制LCD 1602调试笔记初始化步骤:1、0x38 设置为16*2显示,5*7点阵,8位数据接口2、0x0C 说明这里0c表示的是开显示,不显示光标,光标不显示,完整描述如下:3、0x01 清屏幕4、0x06表示读或者写之后,地址指针加1,光标加15、0x80 位置寄存器定位于第一行的最左边时序图:在本例中采用50兆分频到1k的时钟,也就是E的保持时间是1ms,达到以上的时序要求。
在Altera的DEO上验证通过,显示效果如下:完整代码如下:(本实例中,显示大写的LOVE!,第二行显示)module lcm(CLOCK_50,LCD_DATA,LCD_RW,LCD_RS,LCD_EN,LCD_BLON);input CLOCK_50;output [7:0]LCD_DATA;output LCD_RW;output LCD_RS;output LCD_EN;output LCD_BLON;reg [7:0]LCD_DATA;reg LCD_RW ;reg LCD_RS;reg LCD_EN;reg clk_1k=1'b0;reg [20:0]counter=0;reg [10:0]counter1=0;assign LCD_BLON=1;always@(posedge CLOCK_50)if(counter==25000)beginclk_1k<=~clk_1k;counter<=0;endelse counter<=counter+1;always@(posedge clk_1k)//beginif(counter1<1023)counter1<=counter1+1;casex (counter1)400:beginLCD_DATA<=8'b00111000; //0x38 设置显示模式LCD_RW<=1'b0;LCD_RS<=1'b0;end401:LCD_EN<=1'b1;410: //0x0c 开显示关光标beginLCD_DATA<=8'b00001100;LCD_RW<=1'b0;LCD_RS<=1'b0;end411: LCD_EN<=1'b1;420: begin //0x01 清屏幕LCD_DATA<=8'b00000001;LCD_RW<=1'b0;LCD_RS<=1'b0;end421: LCD_EN<=1'b1;430: begin //0x06 读或者写后自动加1 LCD_DATA<=8'b00000110;LCD_RW<=1'b0;LCD_RS<=1'b0;end431: LCD_EN<=1'b1;440:begin //0xc0 定位到第二行LCD_DATA<=8'b11000000;LCD_RW<=1'b0;LCD_RS<=1'b0;end441: beginLCD_EN<=1'b1;ack<=1;end450: begin //write data WLCD_DATA<=8'h57;LCD_RW<=1'b0;LCD_RS<=1'b1;end451: LCD_EN<=1'b1;460: begin //write data W LCD_DATA<=8'h57;LCD_RW<=1'b0;LCD_RS<=1'b1;end461: LCD_EN<=1'b1;470: begin //write data W LCD_DATA<=8'h57;LCD_RW<=1'b0;LCD_RS<=1'b1;end471: LCD_EN<=1'b1;480: begin //write data .LCD_DATA<=8'h2E;LCD_RW<=1'b0;LCD_RS<=1'b1;end481: LCD_EN<=1'b1;490: begin //write data TLCD_DATA<=8'h54;LCD_RW<=1'b0;LCD_RS<=1'b1;end491: LCD_EN<=1'b1;500:begin //write data XLCD_DATA<=8'h58;LCD_RW<=1'b0;LCD_RS<=1'b1;end501: LCD_EN<=1'b1;510:begin //write data SLCD_DATA<=8'h53;LCD_RW<=1'b0;LCD_RS<=1'b1;end511: LCD_EN<=1'b1;520: begin //write data K LCD_DATA<=8'h4B;LCD_RW<=1'b0;LCD_RS<=1'b1;end521: LCD_EN<=1'b1;530: begin //write data Y LCD_DATA<=8'h59;LCD_RW<=1'b0;LCD_RS<=1'b1;end531: LCD_EN<=1'b1;540: begin //write data .LCD_DATA<=8'h2E;LCD_RW<=1'b0;LCD_RS<=1'b1;end541: LCD_EN<=1'b1;550: begin //write data N LCD_DATA<=8'h4E;LCD_RW<=1'b0;LCD_RS<=1'b1;end551: LCD_EN<=1'b1;560: begin //write data E LCD_DATA<=8'h45;LCD_RW<=1'b0;LCD_RS<=1'b1;end561: LCD_EN<=1'b1;570: begin //write data T LCD_DATA<=8'h54;LCD_RW<=1'b0;LCD_RS<=1'b1;end571: LCD_EN<=1'b1;580: begin //定位到第一行LCD_DATA<=8'h80;LCD_RW<=1'b0;LCD_RS<=1'b0;end581: LCD_EN<=1'b1;590: begin //write data LLCD_DATA<=8'h4C;LCD_RW<=1'b0;LCD_RS<=1'b1;end591: LCD_EN<=1'b1;600: begin //write data OLCD_DATA<=8'h4F;LCD_RW<=1'b0;LCD_RS<=1'b1;end601: LCD_EN<=1'b1;610: begin //write data VLCD_DATA<=8'h56;LCD_RW<=1'b0;LCD_RS<=1'b1;end611: LCD_EN<=1'b1;620: begin //write data ELCD_DATA<=8'h45;LCD_RW<=1'b0;LCD_RS<=1'b1;end621: LCD_EN<=1'b1;630: begin //write data !LCD_DATA<=8'h21;LCD_RW<=1'b0;LCD_RS<=1'b1;end631: LCD_EN<=1'b1;default: LCD_EN<=1'b0;endcaseendendmodule作者:西电粽子邮箱:。
基于FPGA的LCD1602液晶显示器控制编写:樊伟敏2011年5月21日液晶显示器是现代智能家电、电子仪器和电子设备中最常见的信息显示方式,其具有良好的人机交互性、功耗低、质量轻、使用寿命长等特点。
液晶显示器通常由专用集成电路控制与驱动液晶屏,使用时只要输入数据和指令就可实现所需的显示。
常见的液晶显示器有段式显示和点阵显示两种。
段式显示器所显示的内容一般具有固定模式,例如:空调遥控器、电子计算器、电子表、数字万用表、电子游戏机等显示的主要是数字、专用符号和固定图形;点阵显示器的通用性比段式显示器强,能根据需要灵活地显示各种信息和内容,例如:字母、数字、符号和图形等。
与通用微处理器的方式相比,FPGA更灵活,处理速度更快,控制更灵活。
在外扩SRAM 或SDRAM后,容易移植在更多可变宽度像素点或者不同接口方式的液晶显示器的驱动上,具有广泛的应用前景。
一、LCD1602液晶显示模块简介1. LCD1602液晶显示模块的基本参数及引脚功能LCD1602液晶显示模块的主控制驱动电路为HD44780(HITACHI)及其他公司全兼容电路,如SED1278(SEIKO EPSON)、KS0066(SAMSUNG)、NJU6408(NER JAPAN RADIO)等。
液晶显示模块可分为带背光和不带背光两种,背光一般为黄绿色。
LCD1602液晶显示模块外形尺寸如图1所示。
图1 LCD1602液晶显示模块外形尺寸(1) LCD1602的基本参数:显示容量:16×2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V(2) LCD1602的引脚及功能如表1所示:(3) LCD 1602主控制器LCD 1602主控制器内置DDRAM、CGROM和CGRAM,控制器与4Bit或8Bit微处理器相连能使点阵LCD显示2行16个点阵字符,字符包括大小英文字母、数字和符号等。
a. DDRAM(Display Data RAM):DDRAM显示数据RAM用以寄存待显示的字符代码。
DDRAM寄存器为80×8bit,即:80个字节,每行40个,其中每行前16个地址为显示可见,每行后24个地址为显示不可见。
LCD1602显示模块的DDRAM地址与屏幕显示位置的对应关系如表2所示。
例如向DDRAM的00H地址写入“A”字的代码,就可在屏幕的第一行第一列显示字母“A”。
表2 DDRAM地址与屏幕显示位置的关系表.ADDRAM”控制指令。
;指定第二行第一个字符的地址(40H)时,实际写入的数据应该是C0H(=80H+40H)。
b. CGROM(Character Generator ROM):CGROM字符发生ROM是控制器内部的只读存储器,该存储器存储了如表4所示的192个常用的点阵字符图形。
表4 CGROM地址所对应的字符关系表.从表4可知,在字符发生存储器(CGROM)中存有:阿拉伯数字、大小写英文字母、常用的符号和日文假名等字符,字符产生存储器中的每一个字符都有一个固定的代码,例如,大写英文字母“A”的代码为”01000001”(41H),需要显示字母“A”时,只要指定字符发生存储器地址41H即可。
具体操作需要根据控制器中的控制指令格式进行,可参见表6“将数据写入内部CGRAM或ADDRAM”中的内容。
c. CGRAM (Character Generator RAM):CGRAM是用户可通过程序自定义的字符图形RAM,在字符发生随机存取存储器中,可存放8组5×8或4组5×10点阵字符的字模。
用户自定义的字符图形存放在表3的第一列CGRAM字符代码区域中,CGRAM在CGROM 中的地址为00000000B~00000111B(00H~07H),在CGROM中的00001000B~00001111B (08H~0FH)地址中存放着与00000000B~00000111B(00H~07H)地址的内容相同的8组5×8点阵字符的字模。
8组5×8点阵字符字模的CGRAM地址,字符代码(DDRAM)和字符字模(CGRAM的数据)关系如表5所示。
表左侧列为写入到DDRAM地址的字符代码,中间列为CGRAM的地址,右侧CGRAM为存放自定义字符的字模。
自定义字符图形,先要将自定义字符用5×8点阵提取出“字模”,字符的字模可用软件提取,也可用手工直接提取,点阵字模数据中1表示该点显示,0表示该点不显示。
然后逐行设定CGRAM数据内容,每一行对应一个CGRAM,由于5×8点阵字符是采用每行5点共8行表示的,因此需将8行的字模数据依次写入CGRAM中。
表5 自定义5×8点阵字符的CGRAM地址,字符代码(DDRAM)和字符字模(CGRAM的数据)关系设定8组5×8点阵字符字模的CGRAM行数据内容的指令格式如表6所示。
设定8组5×8点阵字符字模的CGRAM行地址指令格式如表7所示。
当需要显示自定义字符时,将CGRAM中自定义的字符地址写入DDRAM中即可。
表7 设定CGRAM行地址指令格式2. LCD1602LCD 1602液晶模块内部的控制器共有如表8所示的11条控制指令。
3.(1) 写操作时序写操作时序如图2所示。
图2 写操作时序(2) 读操作时序读操作时序如图3所示。
图3 读操作时序(3) 主要读写时序参数主要读写时序参数如表10所示表10 主要读写时序参数4. 初始化过程指令(根据需要可调整)(1)(2)(3) 清零。
(4)(5)(1) 用VHDL语言实现LCD1602显示“Welcom To ZJU E&E Lab Center”程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;--USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY lcd ISPORT(clk:IN STD_LOGIC;rs,rw,en:OUT STD_LOGIC;data:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END lcd;ARCHITECTURE fwm OF lcd ISTYPE states IS (set_function,clear_display,set_cursor,set_display,set_ddram1,write_data1,set_ddram2,write_data2);SIGNAL state:states;TYPE ram IS ARRAY (0 TO 15)OF STD_LOGIC_VECTOR(7 DOWNTO 0);CONSTANT ram1:ram:=(X"20",X"57",X"65",X"6C",X"63",X"6F",X"6D",X"65",X"20",X"54",X"6F",X"20",X"5A",X"4A",X"55",X"20");CONSTANT ram2:ram:=(X"20",X"45",X"26",X"45",X"20",X"4C",X"61",X"62",X"20",X"43",X"65",X"6E",X"74",X"65",X"72",X"20");SIGNAL lcd_clk:STD_LOGIC;BEGINrw<='0';en<=lcd_clk;CLK_DIV:PROCESS(clk)CONSTANT m : INTEGER:=500000; --50M分频到100HzV ARIABLE cout : INTEGER RANGE 0 TO 50000000:=0;BEGINIF clk'EVENT AND clk='0' THEN cout:=cout+1;IF cout<=m/2 THEN lcd_clk<='1';ELSIF cout<m THEN lcd_clk<='0';ELSE cout:=0;END IF;END IF;END PROCESS CLK_DIV;PROCESS(lcd_clk,state)V ARIABLE cnt : INTEGER RANGE 0 TO 16 ;BEGINIF lcd_clk'EVENT AND lcd_clk='1' THENCASE state ISWHEN set_function=>data<="00111000";rs<='0';state<= set_display; --设置功能:8位,两行,5×7/每字符WHEN set_display=>data<="00001100";rs<='0';state<= clear_display; --显示控制:显示开,光标关,光标不闪烁WHEN clear_display=>data<="00000001";rs<='0';state<=set_cursor; --清屏WHEN set_cursor=>data<="00000110";rs<='0';state<= set_ddram1; --显示模式:光标右移WHEN set_ddram1=>data<="10000000";rs<='0';state<=write_data1; --设置ADDRAM地址,第一行第一列WHEN write_data1=>rs<='1';data<=ram1(cnt)(7 DOWNTO 0);cnt:=cnt+1; --将ram1的15个byte写入ADDRAMIF cnt=16 THEN state<=set_ddram2; END IF;WHEN set_ddram2=>rs<='0';data<="11000000";state<=write_data2; --设置ADDRAM地址,第二行第一列WHEN write_data2=>rs<='1';data<=ram2(cnt)(7 DOWNTO 0);cnt:=cnt+1; --将ram2的15个byte写入ADDRAMIF cnt=16 THEN state<=set_ddram1; END IF;WHEN OTHERS=>NULL;END CASE;END IF;END PROCESS;END fwm;(2)用VHDL语言实现LCD1602第一行显示“11年5月9日电压:3V”第二行显示“Voltage is:3.21V”程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY lcd1602b ISPORT ( clk: IN STD_LOGIC;rs,rw,en : OUT STD_LOGIC;data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END lcd1602b;ARCHITECTURE fwm OF lcd1602b ISTYPE states IS (clear_display,set_initial,set_cgram,write_cgram,set_addram1,diaplay_cgram,set_addram2,diaplay_cgrom);--clear_display-清屏;--set_initial-初始化设置;--set_cgram-设置cgram地址;--write_cgram-字模写入cgram;--set_addram1-设置显示cgram字符的addram地址;--diaplay_cgram-显示cgram字符;--set_addram2-设置显示cgrom字符的addram地址;--diaplay_cgrom-显示cgrom字符SIGNAL state:states;TYPE ram_array0 IS ARRAY(0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0);--定义ram_array0为二维数组TYPE ram_array1 IS ARRAY(0 TO 7) OF ram_array0;--定义ram_array1为三维数组SIGNAL lcd_clk : STD_LOGIC;--定义data1,data2,data3为3个10进制数,用于在LCD中显示该值。