1602的使用方法及3个代码.docx
《1602的使用方法及3个代码.docx》由会员分享,可在线阅读,更多相关《1602的使用方法及3个代码.docx(14页珍藏版)》请在冰豆网上搜索。
![1602的使用方法及3个代码.docx](https://file1.bdocx.com/fileroot1/2022-12/31/79508ae8-480f-4ad2-9337-2ea63c616d12/79508ae8-480f-4ad2-9337-2ea63c616d121.gif)
1602的使用方法及3个代码
1.接口信号说明
1602型液晶接口信号说明如表7.2.1所示
2.主要技术参数(见表7.2.2)
3.基本操作时序
4.RAM地址映射图
控制器内部有80B的RAM缓冲区,对应关系如图7.2.1所示。
当我们向图7.2.1中的00-0F、40-4F地址中的任一处写入显示数据时,液晶都可立即显示出来,当写入10-27或50-67地址处时,必须通过移屏指令将他们移入可显示区域方可正常显示,滚动显示字符就是利用这个特性。
5.状态字说明表(见表7.2.3)
注意:
原则上每次对控制器进行读/写操作之前,都必须进行读写检测,确保STA7为0.实际上,由于单片机的操作慢于液晶控制器的反应速度,因此可以不进行读/写检测,或只进行短暂的延时即可。
6.数据指针设置
控制器内部设有一个数据地址指针,用户可以通过它们访问内部的全部80B的RAM,如图7.2.4所示。
7.其他设置(见表7.2.5)
8.初始化设置
(1)显示模式初始化设置(见表7.2.6)
(2)显示开/关及光标设置(见表7.2.7)
9.写操作时序(见图7.2.2)
分析操作时序图可操作1602液晶的流程如下:
(1)通过RS确定是写数据还是写命令,写命令包括使液晶的光标显示/不显示、光标闪烁/不闪烁、需/不需要移屏、在液晶的什么位置显示,等等。
写数据是指要显示什么内容。
(2)读/写控制设置为写模式,即低电平。
(3)将数据或命令送达数据线上。
(4)将E一个高脉冲将数据送入液晶控制器,完成写操作。
1602显示数字程序(显示1,2,3,4,5)
/*程序功能:
在1602液晶上显示12345*/
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
sbitbeep=P1^5;//定义蜂鸣器端口
sbitLCD_RS=P2^6;
sbitLCD_RW=P2^5;
sbitLCD_EP=P2^7;
ucharcodetable[]={"12345"};
voiddelay(uintxms)
{//延时函数
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidlcd_wcmd(ucharcmd)
{//写入指令数据到LCD
LCD_RS=0;
LCD_RW=0;
LCD_EP=0;
P0=cmd;
delay(10);
LCD_EP=1;
delay(10);
LCD_EP=0;
}
voidlcd_wdata(uchardat)
{//写入字符显示数据到LCD
LCD_RS=1;
LCD_RW=0;
LCD_EP=0;
P0=dat;
delay(10);
LCD_EP=1;
delay(10);
LCD_EP=0;
}
voidlcd_init()//LCD初始化设定初始化函数
{
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay
(1);
lcd_wcmd(0x0c);//设置开显示,不显示光标
delay
(1);
lcd_wcmd(0x06);//写一个字符后地址指针加1
delay
(1);
lcd_wcmd(0x01);//显示清0,数据指针清0
delay
(1);
}
voidmain()
{
uchari;
beep=0;//蜂鸣器默认处于开启状态,所以关闭它
lcd_init();//LCD初始化
delay(10);
lcd_wcmd(0x80);//设置显示位置为第一行的第1个字符
while(table[i]!
='\0')
{//显示字符"12345"
lcd_wdata(table[i]);
i++;
delay(200);//控制两字之间显示速度
}
while
(1);
}
字样滚动显示程序
/*程序功能:
在1602液晶上滚动显示字样*/
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
sbitbeep=P1^5;//定义蜂鸣器端口
sbitLCD_RS=P2^6;//数据/命令选择端(H/L)
sbitLCD_RW=P2^5;//读写选择端(1/0)
sbitLCD_EP=P2^7;//使能信号
ucharcodetable1[]={"Hellotoworld"};
ucharcodetable2[]={"Hellotolife"};
voiddelay(uintxms)
{//延时函数
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{//写入指令数据到LCD
//while(lcd_bz());
LCD_RS=0;
LCD_RW=0;
LCD_EP=0;
P0=cmd;
delay
(1);
LCD_EP=1;
delay
(1);
LCD_EP=0;
}
/*******************************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/*******************************************************************/
voidlcd_wdata(uchardat)
{//写入字符显示数据到LCD
//while(lcd_bz());
LCD_RS=1;
LCD_RW=0;
LCD_EP=0;
P0=dat;
delay
(1);
LCD_EP=1;
delay
(1);
LCD_EP=0;
}
voidlcd_init()//LCD初始化设定初始化函数
{
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay
(1);
lcd_wcmd(0x0c);//设置开显示,不显示光标
delay
(1);
lcd_wcmd(0x06);//写一个字符后地址指针加1
delay
(1);
lcd_wcmd(0x01);//显示清0,数据指针清0
delay
(1);
}
voidmain()
{
uchari;
beep=0;//蜂鸣器默认处于开启状态,所以关闭它
lcd_init();//LCD初始化
delay(10);
while
(1)
{
lcd_wcmd(0x01);//清屏
i=0;
lcd_wcmd(0x80+0x10);//第1行第17列(屏幕之外,不显示)
while(table1[i]!
='\0')//写入Hellotoworld
{
lcd_wdata(table1[i]);
i++;
}
i=0;
lcd_wcmd(0x80+0x50);//第1行第17列(屏幕之外,不显示)
while(table2[i]!
='\0')//写入Hellotolife
{
lcd_wdata(table2[i]);
i++;
}
i=0;
for(i=0;i<30;i++)//向左移动30格
{
lcd_wcmd(0x18);//全屏字符同时左移一格,写在屏幕外的字符慢慢显示出来
delay(800);//控制移动时间
}
}
}
综合实验三:
按键控制1602显示
/*此程序功能:
按下4个按键可在1602液晶上显示不同字样*/
#include//52系列单片机头文件
typedefunsignedcharuchar;
typedefunsignedintuint;
sbitLCD_RS=P2^6;//数据/命令选择端(H/L)
sbitLCD_RW=P2^5;//读写选择端(1/0)
sbitLCD_EP=P2^7;//使能信号
sbitkey1=P3^2;//定义按键端口
sbitkey2=P3^3;
sbitkey3=P3^4;
sbitkey4=P3^5;
sbitbeep=P1^5;//定义蜂鸣器端口
ucharcodetable1[]={"YouPressKey1"};
ucharcodetable2[]={"YouPressKey2"};
ucharcodetable3[]={"YouPressKey3"};
ucharcodetable4[]={"YouPressKey4"};
uchari;
voiddelay(uintxms)
{//延时函数
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{//写入指令数据到LCD
LCD_RS=0;
LCD_RW=0;
LCD_EP=0;
P0=cmd;
delay
(1);
LCD_EP=1;
delay
(1);
LCD_EP=0;
}
/*******************************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/*******************************************************************/
voidlcd_wdata(uchardat)
{//写入字符显示数据到LCD
LCD_RS=1;
LCD_RW=0;
LCD_EP=0;
P0=dat;
delay
(1);
LCD_EP=1;
delay
(1);
LCD_EP=0;
}
voidlcd_init()//LCD初始化设定初始化函数
{
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay
(1);
lcd_wcmd(0x0c);//设置开显示,不显示光标
delay
(1);
lcd_wcmd(0x06);//写一个字符后地址指针加1
delay
(1);
lcd_wcmd(0x01);//显示清0,数据指针清0
delay
(1);
}
voidkeyscan()//按键扫描,根据扫描到的不同按键在1602上显示不同字样
{
if(key1==0)
{
delay(10);//利用软件延时坚决按键过程中的抖动问题
lcd_wcmd(0x01);//清屏
if(key1==0)
{
while(!
key1);//等待按键释放
i=0;
lcd_wcmd(0x80);//第1行第1列
while(table1[i]!
='\0')//按键1对应的字样
{
lcd_wdata(table1[i]);
i++;
}
}
}
if(key2==0)
{
delay(10);//延时消抖
lcd_wcmd(0x01);//清屏
if(key2==0)
{
while(!
key2);
i=0;
lcd_wcmd(0x80+0x40);//第2行第1列
while(table2[i]!
='\0')//按键1对应的字样
{
lcd_wdata(table2[i]);
i++;
}
}
}
if(key3==0)
{
delay(10);
lcd_wcmd(0x01);//清屏
if(key3==0)
{
while(!
key3);
i=0;
lcd_wcmd(0x80);//第1行第1列
while(table3[i]!
='\0')//按键1对应的字样
{
lcd_wdata(table3[i]);
i++;
}
}
}
if(key4==0)
{
delay(10);
lcd_wcmd(0x01);//清屏
if(key4==0)
{
while(!
key4);
i=0;
lcd_wcmd(0x80+0x40);//第2行第1列
while(table4[i]!
='\0')//按键1对应的字样
{
lcd_wdata(table4[i]);
i++;
}
}
}
}
voidmain()
{
lcd_init();//LCD初始化
beep=0;//蜂鸣器默认是开启的,所以先关闭蜂鸣器
while
(1)
{
keyscan();//调用键盘扫描函数
}
}