LCD1602及其控制器的基本显示方法
- 格式:pdf
- 大小:197.08 KB
- 文档页数:7
lcd1602液晶屏显示原理LCD1602液晶屏显示LCD1602液晶屏是一种广泛应用于嵌入式系统中的设备,其主要作用是显示文字和图像。
下面我们将从液晶屏的基本构成、显示原理、控制方式等方面进行详细介绍。
基本构成LCD1602液晶屏的主要构成有以下几个部分:•LCD显示区域:是液晶屏的主要显示部分,通常由16x2的字符点阵组成。
•背光源:为了方便在低光环境下观察屏幕内容,液晶屏通常都有背光源,可以显示白色、蓝色等不同颜色。
•驱动电路板:液晶屏需要通过电路来进行控制。
驱动电路板是一个电路板,上面有各种电子元器件,如芯片、晶振、电容、电阻等。
显示原理LCD1602液晶屏工作的原理是基于液晶分子的光学变化。
液晶屏的显示区域由若干个液晶单元组成,每个液晶单元是由一个薄膜晶体管(TFT)和一个电容组成的。
当液晶单元受到电压作用时,会发生形变,从而改变光线的传播方向,从而实现显示。
控制方式LCD1602液晶屏的控制方式通常采用微处理器进行控制。
常用的控制方式有以下几种:•8位并行控制:使用8根数据线,可以同时传输8位二进制数据,速度快,适用于需要传输大量数据的应用场景。
•4位并行控制:使用4根数据线,需要进行两次数据传输才能完成一次指令或数据的传输,速度比较慢,但可以降低接口引脚数量,适用于资源受限的系统。
•串行控制:使用单根数据线,数据按照一定的格式进行传输,速度较慢,但可以进一步减少接口引脚数量。
总结综上所述,LCD1602液晶屏是一种常用于嵌入式系统中的设备,其所采用的液晶分子光学变化原理是实现显示的基础,常用的控制方式有8位并行控制、4位并行控制和串行控制三种。
液晶屏在嵌入式系统中发挥着重要的作用,广泛应用于各种计算机设备、仪器仪表、通讯设备等方面。
接下来,我们将详细介绍液晶屏的控制流程和相关指令。
控制流程LCD1602液晶屏的控制流程通常包括以下大致步骤:1.初始化液晶屏:向液晶屏发送一系列指令,包括设置接口方式、显示模式、光标定位等。
LCD1602帮助手册正面图背面图正面图为第一图,管脚应排列在左上方,左边第一脚为管脚1,向右依次为2,3,4………15,16。
背面一般也有标注,并且附带了管脚对应的作用。
其中第三脚VO为对比度调节脚,一般外接滑动变阻器,调节输入的电压,来调节明暗度(可以直接接地,不过直接接地,需要斜着屏幕,才能看见LCD是否显示字符,正面看都是黑黑的一格一格的)。
15,16角一般为背光LED灯源,一个接VCC(一般为15脚),一个接GND(一般为16脚),最好接入限流电阻,不接也可使用,不过会缩短寿命,这两角可以不接,如果不接,在黑暗的室内,显示效果欠佳。
管脚编号如下图所示:管脚对应符号对LCD的操作,有四种操作,分别为:读状态,读数据,写指令和写数据,一般常用的为读状态,写指令和写数据。
操作图如下:当RS端为低电平,RW端为高电平,E为高电平是,对LCD1602的操作为读状态操作,这时,可以对LCD的状态进行读取,读取通过D0~D7的端口读取。
其他操作相似,对照图,即可完成,但是有个读写时序的要求,时序图见下图:读操作时序对LCD进行读操作时,先将RS置为低电平(0V),然后将RW样置为高电平(+5V),然后有个tsp1的延迟(但是一般这个延迟为ns级,一个单片机的指令周期通常都为us级,一般不需要特别延迟,如果程序有一定错误的时候,可以稍微延迟一下),然后再将E置为1,然后延迟td时间(td一般也为ns级,可以适当延迟一点点),然后读取D0~D7的数据。
写操作也是类似的,将RS,RW,E端口进行相应操作即可完成,写数据和写命令的操作,延迟的时间都很短,程序不稳定的话,可以延迟个1us,一般就可以了。
LCD1602的指令有11条,如下图:(指令表)从之前的操作来看,对照此表,不难看出,指令表的前8条都是命令指令,RS,RW都为0,所以操作时,都是写命令操作,D7~D0的数值的不同,代表了操作的不同,比如D0~D7为0x01时,对LCD的操作命令就为清屏显示,第二条指令为光标返回指令,在D0处有个※标记,这表示,不论此位的数据为1还是为0,对此命令都无效,即D0~D7端口写入0x20为光标返回指令,D0~D7端口写入0x03,此命令也为光标返回指令。
字符型lcd1602的基本操作下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!字符型LCD1602的基本操作LCD1602是一种常用的字符型液晶显示屏,广泛应用于各种嵌入式系统和电子项目中。
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:显示位置: 1 2 3 4 5 6 7 8 (40)第一行: 00H 01H 02H 03H 04H 05H 06H 07H ..... 27H第二行: 40H 41H 42H 43H 44H 45H 46H 47H ..... 67H*/1602LCD的RAM地址映射液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址。
也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系图五:LCD1602内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
/*1602液晶模块内部的控制器共有11条控制指令,如下表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *D3=1移字符D3=0移光标D2=1右移D2=0左移6 功能设置0 0 0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0显单行N=1显双行F=0 5X7点阵F=1 5X10点阵7 置字符发生器地址0 0 0 1 -字符发生存贮器地址(6位)-8 置数据存贮器地址0 0 1 --显示数据存贮器地址(7位)---9 读忙标志或地址0 1 BF ----计数器地址(7位)---------10 写CGRAM或DDRAM 1 0 --------要写的数据内容(8位------11 读CGRAM或DDRAM 1 1 --------读出的数据内容(8位)-----*/// 51单片机对lcd1602一些基础程序/* 基本操作时序:写指令输入:RS=0,RW=0,E=下降沿脉冲,DB0~DB7=指令码输出:无写数据输入:RS=1,RW=0,E=下降沿脉冲,DB0~DB7=数据输出:无读状态输入:RS=0,RW=1,E=1 输出:DB0~DB7=状态字读数据输入:RS=1,RW=1,E=1 输出:DB0~DB7=数据/*//*lcd_1602指令:指令位D7 D6 D5 D4 D3 D2 D1 D0功能设置0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0显单行N=1显双行F=0 5X7点阵F=1 5X10点阵lcd_1602指令汇总0x28 设置16*2显示,5*7点阵,4位数据接口0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏,光标复位到地址00H位置0x02 光标归原点,DDRAM中内容不变,地址计数器AC=0;(此时地址为0x80)0x0F 开显示,显示光标,光标闪烁0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x08 只开显示0x06 地址加一,当写入数据的时候光标右移设定显示屏或光标移动方向指令0x18 字符全部左移一格,但光标不动0x1c 字符全部右移一格,但光标不动0x10 光标左移1格,且AC值减10x14 光标右移1格,且AC值加1*/#include <intrins.h>#define dataport P1sbit RS=P2^ 6;sbit RW=P2^5;sbit EN=P2^4;void waitfor() //检测忙信号函数{dataport=0xff;RS=0;RW=1; //选择指令寄存器读操作RS=0指令RS=1数据; RW=0写RW=1读EN=1; //使能操作while(dataport&0x80); //如果最高位是1 表示1602正忙原地踏步忙完后芯片会将高位拉低EN=0;}void writedata(unsigned char dataw) //写数据到LCD1602{waitfor(); //测忙RS=1;RW=0; //选择数据寄存器写操作RS=0指令RS=1数据; RW=0写RW=1读dataport=dataw; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void writecmd(unsigned char cmd) //写命令到LCD1602{waitfor(); //测忙RS=0;RW=0; //选择指令寄存器写操作dataport=cmd; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void init(void) // 初始化函数{writecmd(0x38); //功能设定8位数据传输双行显示设置工作方式:0x28=4位总线字符两行显示,0x38=8位总线字符两行显示writecmd(0x0c); //显示器开关writecmd(0x01); //清屏writecmd(0x06); //字符进入模式每进入一个字符光标向右移动一格原有字符不动}void location(unsigned char x,unsigned char y) //坐标函数{unsigned char temp;temp=x&0x0f; //只要x数据的后四位if(y){temp=temp|0x40;} //第一行为0 第二行为1 如果y=1则地址加0x40temp|=0x80; //DDRAM地址的命令DB7为一writecmd(temp);}void DisplayOneChar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数{location(x,y);writedata(dataw);}void displaylistchar(unsigned char x,unsigned char y,unsigned char *p) //显示字符串{while(*p) //当一个字符型数组读完时*P指的为零{displayonechar(x,y,*(p++));x++;}}void WriteCgram(unsigned char address,unsigned char *p) //写CGRAM的数据{unsigned char i=8;writecmd(address); //CGRAM里的地址初始值0x40 每次加0x80while(i--){writedata(*p);p++;}}void DisplayOneChar(unsigned char x,unsigned char y,unsigned char address,unsigned char *p) //显示一个自定义字符{unsigned char i=8;writecmd(address); //CGRAM里的地址初始值0x40 每次加0x08while(i--){writedata(*p);p++;}location(x,y); //设定要显示的位置writedata((address&=0x3f)/0x08); //要从CGRAM中读出数据在1602上显示搞了半天发现CGRAM里的地址} //和DDRAM里的地址有上面的转换关系void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数{unsigned int number[8];int k,gh;for(k=0;;k++){*(number+k)=(unsigned int)(num%10);//强制类型转换num=num/10;if(num==0)break;}for(gh=k;gh>=0;gh--){displyonechar(x,y,(*(number+gh)+48));x++;}}//字型码uchar code nian[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};// "年"uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};// "月"uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};// "日"//显示汉字displyonecharacter(0,0,0x40,nian);displyonecharacter(1,0,0x80,yue);displyonecharacter(1,0,0xc0,ri);。
LCD1602原理与显示程序LCD1602的原理是基于液晶显示技术。
液晶是一种特殊的物质,具有双折射性质,即能将入射的光线分成两束,通过改变液晶分子的排列方式,可以改变其双折射的性质,从而使得光线透过液晶时会发生偏转。
LCD1602利用这一原理,在液晶显示面板上设置了16列和2行的像素点阵,通过控制每个像素点的液晶分子的排列方式,来实现字符的显示。
初始化是指在使用LCD1602之前,需要对其进行一系列的初始化操作,以确保其正常工作。
具体的初始化步骤如下:1.设置通信协议:LCD1602可以通过并行接口和串行接口进行通信,根据具体的接口方式,选择相应的通信协议。
2.设置工作模式:LCD1602有两种工作模式,分别是4位模式和8位模式。
选择适合的工作模式,并设置相应的控制寄存器。
3.设置显示模式:LCD1602可以显示不同的字符集,如英文字符、数字、特殊符号等。
选择合适的字符集,并设置显示模式。
4.清除显示:设置清除显示寄存器,将显示区域清空。
5.光标设置:设置光标位置和显示方式,如光标是否闪烁、光标位置等。
完成初始化后,就可以将要显示的数据写入LCD1602数据写入是指将要显示的字符或数字写入到LCD1602的显示区域。
具体的数据写入步骤如下:1.设置光标位置:根据需要显示的字符位置,设置光标的位置。
2.数据写入:通过通信接口,将要显示的数据写入到LCD1602的数据寄存器。
3.延时:由于LCD1602的刷新速度较慢,需要等待一定的时间,使得数据能够稳定显示在液晶屏上。
4.更新光标位置:根据数据的长度和显示方式,更新光标的位置。
通过以上的步骤,就可以实现LCD1602的显示功能。
总结起来,LCD1602的原理是基于液晶显示技术,通过控制液晶分子排列方式来实现字符的显示。
其显示程序包括初始化和数据写入两个方面的内容,通过设置通信协议、工作模式、显示模式等参数,并将要显示的数据写入到LCD1602的显示区域,来实现字符的显示。
LCD1602是个两行显示,且每行能显示16个字符的液晶显示器其控制指令有如下组成控制指令--------设置指令(初始化设置LCD的工作状态,比如是两行显示,还是单行显示)以上就是在LCD显示器上的地址映射数据-----------就是要在对应位置上显示的数据其指令对应指令1 清显示,指令码01H,光标复位到地址00H位置。
指令2 光标复位,光标返回到地址00H。
指令3 光标和显示模式设置。
I/D:光标移动方向,1为右移动,0为左移动。
S:屏幕上所有文字是否左移或者右移。
1表示有效,0表示无效。
指令4 显示开关控制。
D:控制整体显示的开与关,1为开显示,0为关显示。
C:控制光标的开与关,1表示有光标,0表示无光标。
B:控制光标是否闪烁,1闪烁,0不闪烁。
指令5 光标或显示移位。
S/C:1时移动显示的文字。
0时移动光标。
指令6 功能设置命令。
DL:1时为4位总线,0时为8位总线。
N:0时为单行显示,1时为双行显示。
F:0时显示5x7的点阵字符,1时显示5x10的点阵字符。
指令7 字符发生器RAM地址设置。
指令8 DDRAM地址设置。
指令9 读忙信号和光标地址。
BF:为忙标志位,1时表示忙,此时模块不能接收命令或数据,如果为0表示不忙。
指令10 写数据。
指令11 读数据。
管脚说明RS 数据寄存器与指令寄存器的选择端口,RS=0,为指令寄存器,RS=1,为数据寄存器RW 为读写操作,RW=1,为读,RW=0,为写E 使能端,,下降沿使能LCD作用D0---D7 8位数据端口LCD的操作初始化LCD----数据操作----返回总的说来,就是先初始化LCD,在写入地址指令,在写入显示数据初始化LCD(设置LCD的工作状态,其指令如上面框图)参考程序如下(delay为延时,lcd_wcmd为写指令函数)void lcd_init(){ lcd_wcmd(0x38);delay(300);lcd_wcmd(0x0c);delay(300);lcd_wcmd(0x06);delay(300);lcd_wcmd(0x01);delay(300);}初始化完后就可以进行对LCD的操作,但是不管是写指令还是写数据,先要判断其状态(因为它是个慢显示)忙碌判断参考程序如下(da为八位数据口)bit lcd_bz(){ bit result;rs = 0;//选择指令寄存器rw = 1;//读操作ep = 1;delay(3);result = (bit)(da & 0x80);//读取忙碌标志ep = 0;//模拟一个下降沿,使能LCDreturn result;//返回忙碌标志}在写数据之前要先写入地址指令参考程序如下void lcd_wcmd(unsigned char cmd){while(lcd_bz()); //判断LCD忙碌rs = 0;//指令寄存器rw = 0;//写操作ep = 0;delay(3);da= cmd;//写入指令delay(3);ep = 1;delay(3);ep = 0;//模拟一个下降沿,使能LCD}注意初始化那写指令也是用的这个程序,但是区别在于写地址指令时候,cmd变量的最高位要恒为1 比如写03H这个地址指令,则cmd的值要为0x83,这样才会正确地显示地址指令写完后,就可以写入数据参考程序如下(dat为写入的数据)void lcd_wdat(unsigned char dat){while(lcd_bz()); //判断LCD忙碌rs = 1;//数据寄存器rw = 0;//写操作ep = 0;da = dat;//写入数据delay(3);ep = 1;delay(3);ep = 0;//模拟一个下降沿,使能LCD}注意 1. 初始化LCD只需在主程序中执行一次就可。
LCD1602原理及显示程序LCD1602是一种常用的液晶显示器模块,具有16列2行的显示区域,可以用于显示各种文字和简单的图形。
它广泛应用于各种电子产品中,如计算器、电子钟表、仪器仪表等。
本文将介绍LCD1602的工作原理和显示程序设计。
LCD1602模块由液晶显示面板、驱动芯片和背光源组成。
其中驱动芯片负责向液晶面板发送控制信号和数据信号,控制液晶分子的取向和光的穿透程度,从而实现图像的显示。
背光源则提供背光,使得图像可以在暗环境下清晰可见。
液晶显示面板是LCD1602模块最关键的部分。
它由两片平行的玻璃基板构成,中间夹层有液晶层和极板。
液晶层是一种特殊的有机化合物,具有液态和固态之间的特性。
液晶分子有两种主要的排列方式,即平行排列和垂直排列,通过调节驱动芯片发送的电压信号,可以改变液晶分子的排列方式,进而控制光的透射和反射。
极板则起到滤光器的作用,可以控制光的偏振方向。
为了控制LCD1602模块进行显示,我们需要通过IO口与其连接,并向其发送控制信号和数据信号。
以下是一个基本的LCD1602显示程序的设计过程:1.初始化LCD1602模块:a.设置LCD1602的工作模式,例如行数、字体大小等。
b.设置显示模式,例如显示打开、显示关闭、光标光灭等。
2.发送指令到LCD1602模块:a.选择指令寄存器,RS引脚置低电平。
b.向数据总线发送指令数据。
c.发送使能信号,EN引脚从高到低电平进行一个脉冲,使得LCD1602芯片接收到指令。
3.发送数据到LCD1602模块:a.选择数据寄存器,RS引脚置高电平。
b.向数据总线发送需要显示的数据。
c.发送使能信号,EN引脚从高到低电平进行一个脉冲,使得LCD1602芯片接收到数据。
4.清除LCD1602模块的显示内容:a.发送清除显示指令到LCD1602模块。
5.控制LCD1602模块的光标位置:a.发送光标位置指令到LCD1602模块。
6.控制LCD1602模块的背光亮度:a.通过PWM控制背光源的亮度。
LCD1602的用法一、简介LCD1602是一款常用的液晶显示模块,它具有16x2的字符显示能力,可以显示基本的英文、数字和符号。
通过与微处理器或单片机等控制器的连接,可以实现各种数据和信息的显示。
二、硬件连接1. 电源:LCD1602模块需要5V电压供电,可以使用USB转RS232接口或直接连接5V电源。
2. 数据线:LCD1602模块需要连接数据线才能与控制器通信。
常见的连接方式是使用4条数据线:RS、RW、E。
其中RS线控制亮灭,RW线控制光标,E线控制开关。
3. 地线:通常需要连接一个公共地线,以使电路稳定。
三、软件实现以下是一个简单的示例代码,使用C语言和LCD1602模块实现显示字符串的功能:```c#include <reg52.h> // 包含8051单片机寄存器定义#include <lcd1602.h> // 包含LCD1602驱动库文件// 声明LCD1602结构体变量LCD1602 lcd;void main() {// 初始化LCD1602模块lcd_init(&lcd);lcd_clear(&lcd); // 清空屏幕// 显示字符串"Hello, world!"lcd_puts(&lcd, "Hello, world!");// 等待一段时间,以便观察显示效果delay(500);}```四、常用命令LCD1602模块支持一些常用的命令,如光标移动、清屏、显示文本等。
具体命令可以参考LCD1602驱动库文档。
五、注意事项1. LCD1602模块的字符宽高比为4:5,因此需要调整显示的字符大小以适应屏幕。
2. 需要根据具体的应用场景和硬件配置选择合适的LCD1602模块和驱动库。
不同的模块和库可能存在差异,需要参考相应的文档进行操作。
3. 在实际应用中,需要考虑与其他设备的接口和控制方式,确保数据传输的正确性和稳定性。
LCD显示及键盘用法LCD1602及其控制器的基本显示方法向LCD输入的数据为ASCII码,需要通过数码扫描依次送到LCD显示,下面介绍LCD 控制器IP核LCD16X2A及其相关程序。
逻辑符号如下图:U_lcd_ctrl模块即为该控制器核在AltiumDesinger原理图中的符号表示。
其作用是接受前面用户自己的逻辑单元送来的ASCII码数据和控制信号,然后与外部的LCD显示器通讯,显示相应字符。
数据总线使用输入输出分离模式,IP核后面需要增加双向BUF控制单元(U8)。
L CD控制器端口说明如下:用户控制逻辑接口:CLK:控制器工作时钟,上升沿有效RST:复位信号,高电平有效DATA[7..0]:ASCII码数据总线ADDR[3..0]:字符在LCD屏幕上的地址(共两行,每行16个字符)ADDR=“0000”~“1111”对应每行的第0~15个字符LINE:LCD1602屏幕上的行选择信号,LINE=0时数据在第一行显示,LINE=1时数据在第二行显示BUSY:控制器忙信号,数据未显示稳定时BUSY=1;反之为0STROBE:数据输入有效使能,高电平有效LCD显示器接口:LCD_E:LCD显示器使能LCD_RW:LCD读写方向控制LCD_RS:LCD命令,数据选择LCD_DATA_TRI:LCD数据高阻态控制LCD_DATAO:LCD数据输出总线LCD_DATAI:LCD数据输入总线控制器工作原理如下:A控制器复位当RST信号有效时(高电平),控制器进入LCD复位与初始化操作,此时,BUSY信号持续高电平,表示控制器忙,LCD不能进行用户请求的操作。
RST信号由高变低后的大约80us之后,LCD控制器初始化完成,可以响应用户的操作请求,此时,BUSY信号变低。
LCD处于显示模式。
B字符显示上电后的LCD必须初始化一次,之后LCD控制器停留于“WAIT FOR DATA”状态。
在用户向LCD控制器申请字符显示操作时,ADDR、DATA、LINE信号必须保持稳定,同时使用STROBE信号触发显示操作。
具体步骤如下:表示字符显示位置的4bit地址信号加载到ADDR信号线上;表示字符显示行号的1bit选择信号加载到LINE信号线上;字符ASCII编码加载到DATA总线上并保持稳定;用户送入STROBE的有效电平,LCD控制器进入与LCD显示器通讯的过程,显示相应地址和行位置的ASCII码对应字符,同时BUSY信号变为高电平,表示控制器忙。
此时,用户需要等待。
一定时间后,LCD字符显示稳定,BUSY信号变为低电平,等待用户下一次操作申请。
如此循环。
根据LCD控制器的工作原理编写的字符扫描和LCD接口控制逻辑如下:******************************************************************************************** ***************************************功能:显示三个字符**************************************************************************************************************************** library ieee;use ieee.std_logic_1164.all;entity lcd_scan isport(clk_in:in std_logic;--工作主时钟rstn_in:in std_logic;--复位信号,高电平有效ascii_1_in:in std_logic_vector(7downto0);--第一个字符输入ascii_2_in:in std_logic_vector(7downto0);--第二个字符输入ascii_3_in:in std_logic_vector(7downto0);--第三个字符输入****************************************************************************** -----------------------------------需要显示更多的字符刚需在此加入更多的输入端口****************************************************************************** busy_in:in std_logic;--BUSY信号data_out:out std_logic_vector(7downto0);--DATA输出addr_out:out std_logic_vector(3downto0);--ADDR输出line_out:out std_logic;--LINE输出strobe_out:out std_logic--STROBE使能输出);end lcd_scan;architecture art of lcd_scan istype m_state is(ready,--定义三个字符LCD显示的状态lcd_1_out,--------------------------------------------------------lcd_1_strobe,---如有更多的字符要显示,则在----lcd_1_wait,----此定义更多的字符显示状态—lcd_2_out,------每个字符有三个状态-------lcd_2_strobe,-------------------------------------lcd_2_wait,lcd_3_out,lcd_3_strobe,lcd_3_wait);signal data_out_reg:std_logic_vector(7downto0);--数据寄存器信号signal addr_out_reg:std_logic_vector(3downto0);--地址寄存器信号signal line_out_reg:std_logic;signal strobe_out_reg:std_logic;begindata_out<=data_out_reg;addr_out<=addr_out_reg;line_out<=line_out_reg;strobe_out<=strobe_out_reg;process(clk_in)variable state:m_state;beginif clk_in'event and clk_in='0'thenif rstn_in='0'thenstate:=ready;elseif busy_in='0'thencase state iswhen ready=>state:=lcd_1_out;data_out_reg<=X"00";addr_out_reg<=X"0";line_out_reg<='1';strobe_out_reg<='0';when lcd_1_out=>state:=lcd_1_strobe;data_out_reg<=ascii_1_in;addr_out_reg<=X"F";---在第15个位置显示when lcd_1_strobe=>state:=lcd_1_wait;strobe_out_reg<='1';when lcd_1_wait=>state:=lcd_2_out;strobe_out_reg<='0';when lcd_2_out=>state:=lcd_2_strobe;data_out_reg<=ascii_2_in;addr_out_reg<=X"E";--在第14个位置显示when lcd_2_strobe=>state:=lcd_2_wait;strobe_out_reg<='1';when lcd_2_wait=>state:=lcd_3_out;strobe_out_reg<='0';when lcd_3_out=>state:=lcd_3_strobe;data_out_reg<=ascii_3_in;addr_out_reg<=X"D";--在第13个位置显示when lcd_3_strobe=>state:=lcd_3_wait;strobe_out_reg<='1';when lcd_3_wait=>state:=lcd_3_out;strobe_out_reg<='0';******************************************************************************* --------------------------------------------------------------------------------------------------------------------------------如要显示更多的字符则在此写入类似下列程序--------------------------------------------------when lcd_1_out=>----------------------------------------------tate:=lcd_1_strobe;----------------------------------------------data_out_reg<=ascii_1_in;--------------------------------------------addr_out_reg<=X"F";-----------------------(此处把F改成除D\E\F之外的其他值,因为已有三个字符在这三个位置显示)---------------------------------when lcd_1_strobe=>-----------------------------------------------state:=lcd_1_wait;-----------------------------------------------------strobe_out_reg<='1';----------------------------------------------------when lcd_1_wait=>----------------------------------------------------state:=lcd_2_out;-------------------------------------------------------strobe_out_reg<='0';---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------******************************************************************************* ******************************************************************************* state:=ready;end case;elsestate:=state;strobe_out_reg<='0';end if;end if;end if;4*4键盘用法vccSwc0Swc1Swc2Swc3Swr0Swr1Swr2Swr3Swr[3..0]为键盘扫描码的输入端,扫描码为1110->1101->1011->0111->1110如此循环扫描当无按键按下时,Swc[3..0]输出为1111当扫描码为1110时按下键值“1”,Swc[3..0]输出为1110;反过来,输出1110则表示按下键值1按下键值“2”,Swc[3..0]输出为1101;反过来,输出1101则表示按下键值2按下键值“3”,Swc[3..0]输出为1011;反过来,输出1011则表示按下键值3按下键值“C ”,Swc[3..0]输出为0111;反过来,输出0111则表示按下键值C 按下其他键时,Swc[3..0]输出为1111;当扫描码为1101时按下键值“4”,Swc[3..0]输出为1110;反过来,输出1110则表示按下键值4按下键值“5”,Swc[3..0]输出为1101;反过来,输出1101则表示按下键值5按下键值“6”,Swc[3..0]输出为1011;反过来,输出1011则表示按下键值6按下键值“D ”,Swc[3..0]输出为0111;反过来,输出0111则表示按下键值D 按下其他键时,Swc[3..0]输出为1111;当扫描码为1011时按下键值“7”,Swc[3..0]输出为1110;反过来,输出1110则表示按下键值7按下键值“8”,Swc[3..0]输出为1101;反过来,输出1101则表示按下键值8按下键值“9”,Swc[3..0]输出为1011;反过来,输出1011则表示按下键值9按下键值“E ”,Swc[3..0]输出为0111;反过来,输出0111则表示按下键值E 按下其他键时,Swc[3..0]输出为1111;当扫描码为0111时按下键值“A ”,Swc[3..0]输出为1110;反过来,输出1110则表示按下键值A 按下键值“0”,Swc[3..0]输出为1101;反过来,输出1101则表示按下键值0按下键值“B ”,Swc[3..0]输出为1011;反过来,输出1011则表示按下键值B 按下键值“F ”,Swc[3..0]输出为0111;反过来,输出0111则表示按下键值F 按下其他键时,Swc[3..0]输出为1111;我们按下键总会停留超过20ms 的时间,所以键盘扫描码的周期应该小于20ms ,即当我们按下键的时候,能够扫描到按键。