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作者:西电粽子邮箱:。
基于51单⽚机定时器的1602液晶显⽰器时钟显⽰(带年⽉⽇)#include#define uchar unsigned char#define uint unsigned intuchar a,count,S1num,xqnum;char yue,ri,shi,fen,miao;int nian;sbit lcdrs=P2^5;sbit lcdrw=P2^4;sbit lcden=P2^3;sbit S1=P3^0; //定义键——进⼊设置sbit S2=P3^1; //定义键——增⼤sbit S3=P3^2; //定义键——减⼩sbit S4=P3^3; //定义键——退出设置uchar code table0[]="2014-08-13 WED";uchar code table1[]="00:00:00";uchar code xingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**************************************************1602液晶显⽰器模块sbit lcdrs=P2^5;sbit lcdrw=P2^4;sbit lcden=P2^3;*************************************************/void write_com(uchar com) //液晶写指令{lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar dat) //液晶写数据{lcdrw=0;lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}/********************************************年⽉⽇写⼊1602函数********************************************/void write_sfm(uchar add,uchar dat) //写时分秒函数{ uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_yr(uchar add,uchar dat) //写⽉⽇函数{uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+add);write_data(0x30+shi);}void write_nian(uchar add,uint dat) //写年函数{uint qian,bai,shi,ge;qian=dat/1000;bai=dat%1000/100;shi=dat%100/10;ge=dat%10;write_com(0x80+add);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);/***************************************************初始化***************************************************/void init_lcd() //液晶初始化{lcden=0;nian=2014;yue=8;ri=13;shi=0; //初始shi、fen、miaofen=0;miao=0;write_com(0x38); //设置16x2显⽰,5x7点阵,8位数据⼝write_com(0x0c); //设置开显⽰,不显⽰光标write_com(0x06); //写⼀个字符后地址指针加1write_com(0x01); //显⽰清0,数据指针清0}void init() //初始化函数{init_lcd(); //液晶初始化write_com(0x80); //设置显⽰初始坐标for(a=0;a<14;a++) //显⽰年⽉⽇初始值write_data(table0[a]);delay(5);}write_com(0x80+0x40); //设置显⽰初始坐标for(a=0;a<8;a++) //显⽰时分秒初始值{write_data(table1[a]);delay(5);}write_nian(0,nian);write_sfm(6,miao); //分别将shi、fen、miao送去液晶显⽰write_sfm(3,fen);write_sfm(0,shi);count=0;xqnum=0;S1num=0; //初始化全局变量countTMOD=0x01; //设置定时器0⼯作模式1 TH0=(65535-50000)/256; //定时器装初始值TL0=(65535-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0}/**************************************************独⽴键盘sbit S1=P3^0; //定义键——进⼊设置sbit S2=P3^1; //定义键——增⼤sbit S3=P3^2; //定义键——减⼩sbit S4=P3^3; //定义键——退出设置独⽴键盘已接地*************************************************/void keyscan(){if(S1==0){delay(5); //确认定义键被按下{S1num++; //定义键S1按下次数记录while(!S1); //释放按键确认if(S1num==1) //S1按下⼀次时{TR0=0; //关闭定时器write_com(0xc0+7); //光标定位到秒位置write_com(0x0f); //光标闪烁}if(S1num==2) //S1按下两次时{write_com(0xc0+4); //光标定位到分位置}if(S1num==3) //S1按下三次时{write_com(0xc0+1); //光标定位到时位置}if(S1num==4) //S1按下四次时{write_com(0x80+13); //光标定位到星期位置}if(S1num==5) //S1按下五次时{write_com(0x80+9); //光标定位到⽇位置}if(S1num==6) //S1按下六次时{write_com(0x80+6); //光标定位到⽉位置}if(S1num==7) //S1按下七次时{write_com(0x80+3); //光标定位到年位置}if(S1num==8) //S1按下⼋次时S1num=0; //S1记录按键次数清零TR0=1; //开启定时器write_com(0x0c); //取消光标闪烁}}}if(S1num!=0) //只有定义键按下后S2、S3、S4才有效{ if(S2==0){delay(5); //防抖if(S2==0) //确认按键被按下{while(!S2); //释放按键确认if(S1num==1) //S1按下⼀次时{miao++; //调整秒加1if(miao==60) //满60清零miao=0;write_sfm(6,miao); //每调节⼀次送液晶显⽰⼀次write_com(0x80+0x40+6); //显⽰位置重新回到调节处} if(S1num==2) //S1按下两次时{fen++; //调整分加1if(fen==60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);}if(S1num==3) //S1按下三次时{shi++; //调整时加1if(shi==24)shi=0;write_com(0x80+0x40);}if(S1num==4) //星期加调整{ xqnum++;if(xqnum==7)xqnum=0;write_com(0x80+0x0b);for(a=0;a<3;a++){write_data(xingqi[xqnum][a]); delay(5);}}if(S1num==5) //⽇加调整{ri++;if(yue==2){if(nian%400==0){if(ri==30){ri=1;}}if(nian%400!=0){if(ri==29){ri=1;}}}else if(yue<=7){if(yue%2==0&yue!=2){ri=1;}}else if(yue%2!=0&yue!=2) {if(ri==32){ri=1;}}}else if(yue>=8){if(yue%2==0){if(ri==32){ri=1;}}else if(yue%2!=0){if(ri==31){ri=1;}}}write_yr(8,ri);}if(S1num==6) //⽉加调整{ yue++;write_yr(5,yue);}if(S1num==7) //年加调整{nian++;if(nian==2019)nian=2014;write_nian(0,nian);}}}if(S3==0){delay(5);if(S3==0) //确认按键被按下{while(!S3);if(S1num==1){miao--; //调整秒减1if(miao==-1) //减到00后再减重新设置为59 miao=59;write_sfm(6,miao);write_com(0x80+0x40+6);}if(S1num==2){fen--; //调整分减1if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+3);}if(S1num==3)shi--; //调整时减1if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40);}if(S1num==4){xqnum--; //调整星期减⼀if(xqnum==-1)xqnum=6;write_com(0x80+0x0b);for(a=0;a<3;a++){write_data(xingqi[xqnum][a]); delay(5);}}if(S1num==5) //调整⽇{ri--;if(yue==2){if(nian%400==0){if(ri==0){ri=29;}}if(nian%400!=0){if(ri==0){ri=28;}else if(yue<=7){if(yue%2==0&yue!=2){if(ri==0){ri=30;}}else if(yue%2!=0&yue!=2) {if(ri==0){ri=31;}}}else if(yue>=8){if(yue%2==0){if(ri==0){ri=31;}}else if(yue%2!=0){if(ri==0){ri=30;}}write_yr(8,ri);}if(S1num==6) //调整⽉{yue--;if(yue==0)yue=12;write_yr(5,yue);}if(S1num==7) //调整年{nian--;if(nian==2013)nian=2018;write_nian(0,nian);}}}if(S4==0) //退出设置、开启中断{delay(5);if(S4==0){S1num=0;TR0=1;write_com(0x0c);}}}}/**************************************************定时器0*************************************************/ void timer0() interrupt 1 //定时器0中断服务程序TH0=(65535-50000)/256; //重装定时器初始值TL0=(65535-50000)%256; count++; //中断次数累加if(count==20) //20次50毫秒即⼀秒{count=0;miao++;if(miao==60) //秒加到60时分进位{miao=0;fen++;if(fen==60) //分加到60时时进位{fen=0;shi++;if(shi==24) //时加到24时清0{shi=0;xqnum++;ri++;if(yue==2) //如果是⼆⽉{if(nian%400==0) //闰年判断{if(ri==30){ri=1;yue++;write_yr(5,yue);}}if(nian%400!=0) //平年判断{if(ri==29){ri=1;yue++;write_yr(5,yue);}}}else if(yue<=7&yue!=2) //⼀⽉到七⽉{if(yue%2==0) //偶数⽉(除⼆⽉){if(ri==31){ri=1;yue++;}}else if(yue%2!=0) //奇数⽉{if(ri==32){ri=1;yue++;}}write_yr(5,yue);}else if(yue>=8) //⼋⽉到12⽉{if(yue%2==0) //偶数⽉(除⼆⽉){if(ri==32){ri=1;yue++;if(yue==13) //如果判断⽉份为12⽉,则加⼀后重新定义⽉份为1{yue=1;nian++;write_nian(0,nian);}write_yr(5,yue);}}else if(yue%2!=0) //奇数⽉{if(ri==31){ri=1;yue++;write_yr(5,yue);}}}write_yr(8,ri);if(xqnum==7) //星期写⼊xqnum=0;write_com(0x80+0x0b);for(a=0;a<3;a++){write_data(xingqi[xqnum][a]); delay(5);}}write_sfm(0,shi); //重新写⼊数据}write_sfm(3,fen); //重新写⼊数据}write_sfm(6,miao); //重新写⼊数据}}/*************************************************主函数*************************************************/ void main(){init();while(1){keyscan(); //不停的检测按键是否被按下} }。
实验三 LCD1602液晶显示实验姓名专业学号成绩一、实验目的1.掌握Keil C51软件与proteus软件联合仿真调试的方法;2.掌握LCD1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;4.掌握用LCM1602液晶模块显示数字的C语言编程方法。
二、实验仪器与设备1.微机一台 C51集成开发环境仿真软件三、实验内容1.用Proteus设计一LCD1602液晶显示接口电路。
要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。
~口扩展3个功能键K1~K3。
参考电路见后面。
2.编写程序,实现字符的静态和动态显示。
显示字符为第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。
3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。
显示字符为:“1.姓名全拼 2.专业全拼+学号 EXP8 DISPLAY ”主程序静态显示“My information!”四、实验原理液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。
当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。
1.LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:2.1602液晶模块内部的控制器共有11条控制指令,如表所示:3.芯片时序表:4.1602LCD的一般初始化(复位)过程(1) 延时15ms。
(2) 写指令38H(不检测忙信号)。
(3) 延时5ms。
(4) 写指令38H(不检测忙信号)。
(5) 延时5ms。
大连理工大学数字电路课程设计院 系: 电子科学与技术学院 专 业: 集成电路设计与集成系统 班 级: 电集1001 姓 名: 陈朝吉 学 号: 201081086总结报告大连理工大学本科实验报告题目:基于1602液晶屏的数字万年历(Verilog版)课程名称:数字电路课程设计学院(系):电子科学与技术学院专业:集成电路设计与集成系统班级:电集1001学生姓名:陈朝吉学号:201081086完成日期:2012年12月22日成绩:题目:基于1602液晶屏的数字万年历(Verilog版)一.设计要求1.基本功能➢设计一个数字钟,能够显示当前时间,分别用6个数码管显示小时、分钟、秒钟的时间,秒针的计数频率为1Hz,可由系统脉冲分频得到。
➢在整点进行提示,可通过LED闪烁实现,闪烁频率及花型可自己设计。
➢能够调整小时和分钟的时间,调整的形式为通过按键进行累加。
➢具有闹钟功能,闹钟时间可以任意设定(设定的形式同样为通过按键累加),并且在设定的时间能够进行提示,提示同样可以由LED闪烁实现。
2.扩展功能➢设计模式选择计数器,通过计数器来控制各个功能之间转换。
➢调整当前时间以及闹钟时间,在按键累加的功能不变的基础上,增加一个功能,即当按住累加键超过3秒,时间能够以4Hz的频率累加。
➢用LCD液晶屏来显示当前时间及功能模式。
二.设计分析及系统方案设计1.要求分析:◆基于FPGA实际并发处理的特点,对于实现数字万历年系统,相比于任何嵌入式处理器而言,其特点和优势将得以更加全面体现。
◆数字万年历中所有模块都将基于基准时钟源进行处理,结合FPGA本身的特点,在时钟源下可进行精确计数,可轻易而产生十分精确的万年历时间。
◆基础部分:万年历可包括以下时间处理模块:基于秒时钟计数器进行判断处理。
①秒,分,时。
②星期,上/下午。
③日,月,年。
④闹钟◆功能部分:①时间设定:使用四个按键进行控制,分别是:设置复位按键,设置移位键,功能“加”键,功能“减”键。
阿拉教你轻松学51系列(作者:就抽精品)发布: 2010-2-05 16:03 | 作者: tiankai | 来源: 电子园51单片机学习网阿拉教你轻松学51--------液晶篇(1602)写在开始:(借此灌下水^_^ ) 之前,发了一个帖子,大意是看见杀手和水剑写的帖子,心里也痒痒了,想写一写以前学习单片机过程中的一些经历,希望能给大家一点参考。
无奈最近时间很是紧张,因此,一直都没能着手整理。
本打算星期六写的,但是接到一个朋友的电话,说想买CPLD的开发板。
于是,计划被迫打乱,只好先陪他去电子市场买板子。
回来之后,虽然头很晕(坐车的原因),但是不能再拖了,否则留给大家一个只说不做的印象就不好了。
虽然头晕,但是下面的写出来的东西可不晕。
OK,LET’S GO !1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的1602液晶进行显示的。
而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。
在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
一、1602显示二、实验项目:1602显示三、实验地点:四、五、实验时间:2014年7月9日~2014年7月23日六、实验要求:1、在单片机最小系统中加入LCD1602显示屏。
2、能进行数字和字符的显示3、扩展功能一:将实验四中的“单片机时钟”改为1602显示。
4、用Protel99SE绘制实验原理图并完成实验报告。
七、实验具体内容:1、在单片机最小系统中加入LCD1602显示屏。
(1)实验电路图:(2)实验原理:1602显示屏采用标准的16引脚(有背光),其各个引脚接线及作用说明如下:(3)实验中遇到的问题:在电路接线工作完成以后,上电实验时LCD只有背光,无任何显示。
问题原因分析:在接线过程中,我最为关注的是RS、R/W、E三个端口的接线,忽视了D0~D7的接线顺序,从而使D7~D0的方向接反。
因此1602内部的11条指令码都会对应不上,例如清屏指令是0x01,而我则需要写成0x20。
所以按照正常程序指令,在初始化之后,屏幕会一直没有显示。
(4)实验小结:在完成电路图之后觉得本次的接线相对来说比较简单。
心想只要接好RS、R/W、E正负极不反接,就没什么问题。
结果却出乎我的意料,看是简单的D0~D7八个端口的顺序同样起着关键的作用。
因自己的忽视,使我在完成接线之后长时间找不到问题原因之所在。
这次的接线也很好的提醒了我,看似简单的工作,可千万不敢再掉意轻心。
2、能进行数字和字符的显示并将实验四中的“单片机时钟”改为1602显示。
(1) 实验原理:LCD6102的显示方式是先从DDRAM写入要显示地址,在往DDRAM写入要显示的字符码。
控制其操作的有11条LCD1602的内部指令,具体如下:指令1:清显示;指令2:光标复位,光标复位到地址00H;指令3:光标和显示模式设置;I/D:光标移动方向,高电平左移,低电平右移S:屏幕上所有文字是否左移或者右移(高电平有效,低电平无效)指令4:显示开关控制;D:控制整体显示开关,高电平表示开,低电平表示关C:控制光标的开关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标显示移位;S/C:高电平时移动显示文字,低电平时移动显示光标指令6:功能设置命令;DL:高电平时为四位总线,低电平时为八位总线N:低电平时为单行显示,高电平时为双行显示F:低电平时为5x7点阵字符,高电平时为5x10点阵字符指令7:字符发生器存储器地址:指令8:DDRAM地址设置指令9:读忙信号和光标地址BF为忙标志高电平表示忙,此时模块不能接收命令或者数据,低电平表示不忙指令10:写数据指令11:读数据时序控制:读状态:输入RS=0 R/W=1 E=1 输出:D0~D7=状态字写指令:输入RS=0 R/W=1 D0~D7=指令码E=高脉冲输出:无读数据:输入RS=1 R/W=1 E=1 输出:D0~D7=数据写数据:输入RS=1 R/W=0 D0~D7=数据E=高脉冲输出:无(2)程序流程图如下所示:(3)实验中遇到的问题按下4#键时钟显示减1,当显示为00后,继续减1,会出现ASCLL在0之后的码。
基于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中显示该值。