LCD1602液晶使用介绍 您所在的位置:网站首页 1602仿真电路图 LCD1602液晶使用介绍

LCD1602液晶使用介绍

2023-09-15 17:09| 来源: 网络整理| 查看: 265

lcd1602 +c51 介绍

文章目录 LCD1602介绍1602引脚信号说明控制器接口介绍1、基本操作时许 2、状态字说明 3、指令说明RAM地址映射 控制时序图代码实现写入命令写数据 试验例程CGRAM自定义字模(简易汉字显示)

LCD1602介绍

LCD1602液晶在实际的产品运用中也是比较多产品,应为前一段时间也正好用到了,所以今天就对LCD1602液晶做一个总结,方便以后阅读同时也希望能够帮住到需要的人,总结的可能存在错误欢迎指出!

所谓的1602是指显示的时候,有2行内容每行有16个字符。其实这类字符型产品都可以这样解读比如:lcd12864就是有128行64列。目前市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理大多相同。因此基于HD44780写的液晶控制程序可以很方便适用于市面上大多数字符型液晶产品。 在这里插入图片描述

1602引脚信号说明

字符型LCD1602通常分为14条引脚和16引脚两种,16引脚多出来的是背光电源线VCC(15引脚)和地线(16引脚),其控制原理与14引脚LCD完全一样,引脚定义如下表:

引脚号引脚名电平输入/输出作用1Vss电源地2Vcc电源(+5V)3Vee对比调整电压4RS0/1输入0=输入指令;1=输出数据5R/W0/1输入0=向LCD写入指令或数据; 1=从LCD读取信息6E1,1->0输入使能信号,1时读取信息,1->0(下降沿)执行指令7DB00/1输入/输出数据总线line0(最低位)8DB10/1输入/输出数据总线line19DB20/1输入/输出数据总线line210DB30/1输入/输出数据总线line311DB40/1输入/输出数据总线line412DB50/1输入/输出数据总线line513DB60/1输入/输出数据总线line614DB70/1输入/输出数据总线line715A+VccLCD背光灯源正极16K接地LCD背光灯源负极 控制器接口介绍 1、基本操作时许 1.1读状态:输入:RS=L,RW=H,E=H ----输出:D0~D7=状态字1.2写指令:输入:RS=L,RW=L,D0~D7=指令码 ----输出:无1.3读数据:输入:RS=H,RW=H,E=H ----输出:D0~D7=数据1.4写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 ----输出:无 2、状态字说明 STA7 D7STA6 D6STA5 D5STA4 D4STA3 D3STA2 D2STA1 D1STA0 D0 STA0-6当前数据地址指针的数值STA7读写操作使能1:禁止 0:允许

对控制器每次进行读写操作前,都必须进行读写检测,确保STA7为0

3、指令说明

初始化设置 显示模式设置

在这里插入图片描述 显示开/关光标设置 在这里插入图片描述 在这里插入图片描述 数据控制 控制器内部没有一个数据地址指针,可以通过他们来访问内部的全部80字节RAM。 其他设置

指令码功能01H显示清屏:1.数据指针清零 2.所有显示清零02H显示回车:1.数据指针清零

初始化过程:

延时 写指令38H 延时 写指令38H 延时 写指令38H (每次写指令、读/写数据操作之前均需检测信号) 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏 写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置

代码:

void LcdInit(){//LCD初始化程序 Delay1ms(15); LcdWriteCom(0x38); Delay1ms(5); LcdWriteCom(0x38); Delay1ms(5); LcdWriteCom(0x38);//设置显示模式 LcdWriteCom(0x0C);//开显示不显示光标,光标不闪烁 LcdWriteCom(0x06);//写一个数据,指针加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//设置数据指针起点。 } RAM地址映射

HD44780内置DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,地址和屏幕的对应关系如下:

显示位置1234567… …40第一行00H01H02H03H04H05H06H… …27H第二行40H41H42H43H44H45H46H… …67H

也就是说想要在LCD1602屏幕上的第一行第一个位置显示一个“A”,就要向DDRAM的00H地址写“A”字的代码就OK了,但具体的写入是要按照LCD模块的指令格式来进行的。 但是我们发现每一行有40个地址,而我们们每行只能显示16个字符,其实际多的位置可以实现字符的移动,我们在看大佬作品的时候可能会见到有的字符是从左面移过来,他的实现形式就用到了着些多的地址。将数据先写到未显示的地址然后使用指令进行左移就可以了。 那么1602显示的地址又是什么呐?下图就是DDRAM地址与现实位置的对应关系。

控制时序图

1、读操作时序图: 在这里插入图片描述 2、写操作时序图: 在这里插入图片描述 3、时序参数 在这里插入图片描述

代码实现

LCDE = E //使能信号

写入命令

RS=L,RW=L,D0~D7=指令码,E=高脉冲。

void LcdWriteCom(unsigned char com){//写入命令 RS = 0; RW = 0; GPIO_LCD=com; Delay1ms(10); LCDE = 1; //给一个高脉冲 Delay1ms(10); LCDE = 0; } 写数据

RS=H,RW=L,D0~D7=数据,E=高脉冲。

void LcdWriteData(unsigned char dat){//写入数据 RS = 1; RW = 0; GPIO_LCD=dat; Delay1ms(10); LCDE = 1; //给一个高脉冲 Delay1ms(10); LCDE = 0; 试验例程

main.c文件

#include #include"lcd.h" unsigned char CnCh[] = "012345678912345"; unsigned char CnCh1[] = "ABCDEFGIJKLMNOP"; unsigned char i,a =0,j,n; unsigned char code Data_1[]=" I Love You "; // 第一行显示,共十六个字符 unsigned char code Data_2[]="Good Good Study,Day Day Up !"; // 第二行显示,共28个字符 unsigned char i; void main(){ lcd_Init(); lcd_write_com(0x80); for(i = 0;i lcd_read_busy(); lcd_write_dat(CnCh1[i]); } while(1); } void zimo(){ unsigned char code Data_0[]={0x0f, 0x12, 0x0f, 0x0a, 0x1f, 0x02, 0x02, 0x02}; // 汉字 年 的字模 unsigned char code Data_1[]={0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x0b, 0x11}; // 汉字 月 的字模 unsigned char code Data_2[]={0x1f, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x1f, 0x00}; // 汉字 日 的字模 lcd_Init(); // LCD1602 初始化 lcd_write_com(0x40); // 0100 0000; 指令 0x40 向 CGRAM 地址0 写入自定义数据 for(i=0; i lcd_write_dat(Data_1[i]); // 写入自定义字符字模 } lcd_write_com(0x50); // 0101 0000; 指令 0x50 向 CGRAM 地址2 写入自定义数据 for(i=0; i lcd_Init(); lcd_write_com(0x80); // 第一行第一列地址 for(i=0; i lcd_read_busy(); lcd_write_com(0xc0); // 第二行第一列地址 for(j=n; j // 当数据移动到最后时,n 重置 0,停顿 500 ms,重新开始移动显示 n = 0; delay1ms(50); } delay1ms(20); // 控制移动速度 } }

lcd.c文件

#include"lcd.h" void delay1ms(unsigned char d) //误差 0us { unsigned char a,b,c; for(c=0;c0;b--) for(a=2;a>0;a--); } void lcd_Init(){ lcd_write_com(0x38); delay1ms(1); lcd_write_com(0x38); //设置显示模式 lcd_write_com(0x0c); //开显示不显示贯标 lcd_write_com(0x06); //指针自动加一 lcd_write_com(0x01); //清屏 lcd_write_com(0x80); //设置数据指针起点 } void lcd_write_com(unsigned char com){ RS = 0; RW = 0; E = 0; P0 = com; delay1ms(10); E = 1; delay1ms(10); E = 0; } void lcd_write_dat(unsigned char dat){ RS = 1; RW = 0; E = 0; P0 = dat; delay1ms(10); E = 1; delay1ms(10); E = 0; } void lcd_xy(unsigned char x,unsigned char y){ lcd_write_com(x+y); } void lcd_read_busy(){ unsigned char he,a; RS = 0; RW = 1; E = 1; he = P0; while(1){ he = P0; E = 0; if(!(he&0x80))//当he&0x80为0时跳出循环,表明不忙。 break; E = 1; a++; if(a>=10) break; } }

lcd.h文件

#ifndef __LCD_H_ #define __LCD_H_ #include sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2; void delay1ms(unsigned char d); //延时函数 void lcd_Init(); //初始化 void lcd_write_com(unsigned char com); //写指令 void lcd_write_dat(unsigned char dat); //写数据 void lcd_xy(unsigned char x,unsigned char y); //写位置 void lcd_read_busy(); //检测标志位 #endif CGRAM自定义字模(简易汉字显示)

这里说明一下lcd1602液晶是不能显示汉字的,因为它的显示原理是由若干个5X7或者5X11的点阵字符位组成的,又因为汉字较为复杂,所以1602的主要作用就是显示字母、数字、符号的。但是真的不能显示汉字吗?也并非绝对不能。接就是下面要说的CGRAM自定义字模。

要显示我们自定义的字符,就要用到LCD中的CGRAM存储器(character generate RAM),而我们之前用的显示自带的字符用到的是DDRAM,两个是不同的。看手册我们知道,CGRAM的容量是64个字节,而一个字符是8个字节,所以一共能显示8个自定义的字符。内部常用字符的显示是从0x20开始的,0x00 ~ 0x0F是专门留给自定义字符显示用的,0x00-0x07和0x08~0x0F显示的内容是一样的,也就是说0x00=0x08,0x01=0x09,以此类推。CGRAM共128个位,地址是0x40-0x7F,128/8=16正好对应的是0x00-0x0F共16个,刚才说了,0x00与0x08对应,0x01与0x09对应,共16个,这并不矛盾!说了这么多,那么怎样显示一个自定义字符呢? 首先我们要清楚LCD1602显示字符的点阵大小,眼力好的可以看出来,LCD1602一个显示字符的位置是58的点阵,也就是说它所能显示的点阵图形的大小是58的!要显示一个自定义的字符,首先我们要知道所显示自定义字符的点阵数据,也就是在一个58的点阵上那个点是黑的(将该点点黑,就是高电平----1),哪个点是白的(该点不显示,为低电平----0),但是我们送入到LCD中的是ASCII码,它是8位的数据,而一个显示字符的点阵大小只是58的,显然不够,显示的办法是8*8点阵的前三列不用,也就是不显示,我们只用后面的5列来显示。 然后设定我们是要定义第几个自定义字符,前面已经介绍了,LCD1602最多显示8个自定义字符;然后要规定在液晶的什么位置显示自定义字符,看过数据手册我们知道,第一行第一个位置的地址是0x80,第二行一个位置的地址是0xC0。最后就是要显示我们定义的第几个字符其对应CGRAM地址的关系式是:

0x00:第一个(0x40)0x01:第二个(0x48)0x02:第三个(0x50)0x03:第四个(0x58)0x04:第五个(0x60)0x05:第六个(0x68)0x06:第七个(0x70)0x07:第八个(0x78)

每个字符由5X8点阵组成(也可选用5X10) ,想要实现显示,只需如下图: 例:以5X8点阵为例,显示字符 A

0代表灭,1代表亮 只需将想要显示的字符的对应位置1,就能显示该字符

01110 □█ █ █□ 10001 █ □□□ █ 10001 █ □□□ █ 10001 █ □□□ █ 11111 █ ███ █ 10001 █ □□□ █ 10001 █ □□□ █ 10001 █ □□□ █ A={0x0e,0x11,0x11,0x11,0x1f,0x11,0x11,0x11}

代码 流程

首先创建自定义字模 把字模存入CGRAM中对应的自定义位置,位置在上表中以显示出来了 在LCD1602中显示出来

void type_model_diy(){ unsigned char code Data_0[]={0x0e,0x11,0x11,0x11,0x1f,0x11,0x11,0x11}; // 字母A lcd_Init(); // LCD1602 初始化 lcd_write_com(0x40); // 0100 0000; 指令 0x40 向 CGRAM 地址0 写入自定义数据 for(i=0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有