1LCD 1602简介笔记收拾
LCD1602可显现两行,每行16个字符,不能显现汉字。16脚的LCD 1602带背光,14脚的不带背光。
2LCD1602 端口引脚
纷歧一记载手册上面是咋个描绘LCD 1602的了。记载一下操作进程,下图是LCD 1602在51单片机上面的连线。
图1 LCD 与单片机接线图
D0-D7引脚连接在单片机的P0端口。
LCD_RS = P1^0;LCD_RW = P1^1;LCD_EN = P2^5;
查看LCD 1602手册,得到LCD引脚组合的意义如下:
表格1:LCD操作形式
形式 |
输入 |
输出 |
读状况 |
RS=0,RW=H,EN为高变低脉冲 |
输出:D0~D7个状况值 |
读数据 |
RS=1,RW=1,EN为高变低脉冲 |
输出:无 |
写指令 |
RS=0,RW=0,D0–D7=数据,EN由高脉冲变为低脉冲 |
输出D0–D7状况值 |
写数据 |
RS=1, RW=0, D0–D7=数据,EN由高脉冲变为低脉冲 |
输出D0–D7状况值 |
能够参照图1的接线图对这些形式和输入输出做出相应的了解。形式、输入都是跟单片机I/O端口相连的端口。输出是使LCD显现的内容。在编写程序时,能够先设置LCD显现内容的格局(初始化LCD),然后再对LCD进行读写操作。这些进程由LCD跟单片机相连的I/O端口来完结。
3LCD 1602的操作时序
查看LCD 1602手册,以LCD写操作时序为例记载在对LCD操作的进程中需求注意到的推迟查办的编写,不然或许导致对LCD的操作失利。
图2 LCD的写操作时序
依据表一LCD的操作时序可知,在RS,RW,E(N),DB7.0(D0-D7)分量必定时序的凹凸电平条件时就能够对LCD进行写操作。改变都不是瞬间的,在对RS等置高置低时,RS等变高变低有一个下划的过度时刻,假如这种过渡的时刻超越单片机内一条或几条指令的碑文时刻,则这种时序就有或许会被错开。如现在对LCD进行写操作,将RS置高,RW置低,准备好DB7.0数据,E由高变低一级操作由以下代码完结:
LCD_RS = 1;LCD_RW = 0;DB7_0 = ‘A’;LCD_EN = 1;LCD_EN = 0;
RS在高电平常挑选数据寄存器,在低电平常挑选指令寄存器。
RW在高电平常进行读操作,在低电平常进行写操作。
E(N)为使能端,当E(N)端由高电平跳变为低电平常,LCD模块碑文指令。
DB7.0为8位双向数据。
其间LCD_RS等都是单片机操控LCD RS等端口的引脚,假如(^-^)只要RS端完全变为1的时刻超越以上的一切代码碑文时刻,则在E低脉冲到来之时,RS仍是低电平,所以我们RS的电平不分量条件对LCD的写操作将会失利。当然,传说LCD的电平改变时刻比指令碑文时刻快,可是为了牢靠安稳,在程序中必定需求等候对应的端口完全变为需求电平常再写其它端口的值。就这么等候太长时刻必定是会为程序的碑文成果带来影响,只需求等候端口的电平能完全改变的时刻即可。手册中有阐明的:
图3 LCD初始化图
尽管需求等候的时刻关于人类来说实在是能够忽略不计,但在LCD类中来说却是有必要的。假如没有这些等候,那么就有或许遇不到LCD与你写入内容的邂逅或许呈现偶然成功偶然失利的场景。
在每次读/写指令后都应该等候一段时刻来等候LCD 端口电平的完全改变,可用keil软件模仿一段时刻,用5ms(等候时刻小于5ms者)等时刻替代需求等候的时刻都是能够的。
4 LCD1602的指令集 相关
4.1 LCD指令集笔记
在LCD 1602指令拘押,对LCD来说有四种意思:
(1)RS和RW都为0时一共对LCD写指令操作,包含写入LCD的显现形式和设定LCD地址的指令。.显现形式包含清屏、地址归为、显现状况、进入点设定、功用设定、游标显现形式操作;关于地址的操作包含设定CGRAM地址、设定DDRAM地址。
(2)当RS=0,RW=1时,一共读LCD状况,此刻能够读取LCD忙信号,一起能够读取地址计数器的值。忙信号的状况用来确认LCD内部动作是否完结,若在LCD内部出于忙状况时对LCD进行读写操作将会失利。
(3)当RS=1时,若RW=0一共写数据操作,若RW=1一共读数据操作。
4.2 CGRAM
CGRAM为LCD模块内部的字符产生存储器,晒干存了不同的点阵字符图形,包含阿拉伯数字,英文大小写字符等。每个字符都有一个固定的代码,如‘A’的代码是01000001,(41H),需求显现‘A’时只需求将地址为41H中的点阵图形显现出来就能够看见‘A’了。详细字符点阵图查看手册为全宜。
4.3 LCD1602显现屏内部显现地址表
输入显现字符地址,也便是告知LCD在哪里显现字符。LCD供两行,榜首行可当即显现字符的地址为00H—0FH,第二行可当即显现字符的地址为40H—67H,假如在其它地址中显现字符,需求经过移屏指令[00011000:整屏左移光标跟着移动; 00011100:整屏右移光标跟着移动]将它们移入可显现区域方可正确显现。当要在00H处显现字符时,写入的地址应为00H + 80H(由于置LCD显现方位时要求D7位一直为1,手册中‘置数据存储器地址’指令)
5 LCD 1602程序编写
5.1 LCD初始化
//----------------------- ---------//写指令,初始化端口设置LCD显现形式//----------------------- ---- ----void LCD_mode_init(){LCD_EN = L;//等候LCD电路完全接通delay_ms( DELAY_TIME_FOR_INIT );//P0= 00111000设置16x2显现,5x7点库,8位数据端口write_command( 0x38 );delay_ms( DELAY_TIME );//LCD开显现,显现光标,光标业绩write_command( 0x0f );//读写字符后地址指针、光标加1,整屏显现不移动write_command( 0x06 );//清显现,便对LCD写入write_command( 0x01 );}
依据图3,当LCD电路接通之时,需求用约15ms的时刻来让LCD VDD电压达4.5V,尽管在舱位单片机电源的时分程序还未碑文到初始化程序就现已过了15ms让LCD VDD电源达4.5V。但也有或许程序中只包含了LCD程序,初始化被放在了最前面,15ms的时刻足以让单片机运转许多指令了(能够由单片机的机器周期和一条指令碑文的机器周期数比较一下),为了避免在LCDVDD电源未达4.5V时单片机程序现已碑文到设置LCD显现形式的指令,就在进入LCD初始化程序时等候15ms的时刻,让LCD电源初始化结束。
5.2 写指令
//-------- -----//写指令//--------- ----void write_command( uchar command ){while( lcd_busy() );LCD_RS = L;LCD_RW = L;delay_ms(DELAY_TIME); P0 = command;//等候数据安稳delay_ms(DELAY_TIME);LCD_EN = H;//让使能位坚持到一,负脉冲跳变delay_ms( DELAY_TIME );LCD_EN = L;delay_ms( DELAY_TIME );}
写指令前首先要查看LCD内部操作是否现已完结,LCD的BF位(D7)为高电平一共忙,为低电平一共闲暇。同理,在对每一个端口设置凹凸电平后,相同需求一段时刻来等候电平的完全改变。
5.3 写数据
//-----------------------//写数据,写LCD显现内容//-----------------------void write_data( uchar wdata ){while( lcd_busy() );LCD_RS = H;LCD_RW = L;LCD_EN = L;P0 = wdata;//等候DB0-DB7数据安稳delay_ms( DELAY_TIME );LCD_EN = H;//让使能位充沛到达1delay_ms( DELAY_TIME );LCD_EN = L;delay_ms( DELAY_TIME );}
5.4 检测LCD忙信号
//--------------------//检测LCD的忙信号//--------------------bit lcd_busy(){ bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delay_ms( DELAY_TIME );result = (bit)(P0&0x80);LCD_EN = 0;return result; }
在检测LCD忙信号的一起,还能够设置一下原本该低或该高的位的状况。P0端口是连接到D0—D6端口的I/O引脚,0x80便是用来检测D7位状况的数据。
5.5 推迟函数
//-------- -----//推迟函数//--------- ----void delay_ms( uint ms ){ uint i, j;for(i = ms; i > 0; i--){for(j = 110; j > 0; j--){;}}}
依据单片机的晶振和keil碑文指令的时刻核算,以上推迟函数约推迟ms 毫秒的时刻。DELAY_TIME的宏值为5,一共推迟5毫秒的时刻。LCD有的端口不需求推迟这么长的时刻,这个能够调试到合适相应端口最合适的推迟时刻即可。凭借手册和枚举调试法。
5.6 运转成果
将初始化函数放置在main函数中后,将LCD的显现地址设置在榜首行榜首列(此指令在写指令拘押,可调用write_command(0x80)来完结),然后写字符到LCD榜首行中。再将显现地址跳到第二行,地址后移需求显现字符传长度个单位,写入显现的字符传,对整个屏幕移位(由写指令拘押指令完结,移字符传长度那么多位,移完一个逗留的时刻需求长点,如200ms左右的时刻)。
然后让程序等候,只为LCD操作演示^-^。
程序的作用为:首先在榜首行显现了指定的字符串。当移入第二行字符串时,我们是整个屏幕的移动,所以榜首行字符串也随之移入了屏幕的左面。
现将两行的字符串显现在LCD屏幕之上,不采纳移动的操作。
6 总结
电平改变时不是瞬间的,需求用推迟函数来等候相应位完全的编程预期的电平。这是跟写其它程序的一个差异。每当遇到对硬件引脚电平的置位时,都需求结合手册看看对应引脚的灵敏度,若高出指令碑文时刻徐许多数量级就不必推迟查办,不然应当考虑用推迟查办来等候。应该走进硬件的操作时序国际中去才干编写好它们的程序。
此次笔记记载结束。