版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LCD1602液晶显示器简介一概述液晶〔LiquidCrystal〕是一种高分子材料,因其特殊的物理、化学、光学特性,广泛应用轻薄显示器上。液晶显示器〔LiquidCrystalDisplay,LCD〕的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。各种型号的液晶通常是按照显示字符的行数或液晶点阵的行、列数来命名。例如,1602表示每行显示16个字符,一共可以显示两行。这类液晶通常称为字符型液晶,只能显示ASCII码字符。12232表示液晶显示画面由122列、32行组成,共有122*32个点来显示各种图形。用户可以通过程序控制这些点中任何一个点显示或不显示,从而构成各种图形画面。因此,12232称为图形型液晶。液晶体积小,功耗低,显示操作简单。但其有致命的弱点,即使用温度范围很窄。通用型液晶工作温度为0到+55摄氏度,存储温度为-20到+60摄氏度。二LCD160211602的外形尺寸〔毫米〕2主要技术参数接口信号说明4根本操作时序RAM地址映射图控制器内部带有80B的RAM缓冲区。对应关系如下列图所示。向图中的00~0F、40~4F地址中的任意处写入显示数据时,液晶可立即显示出来;当写入到10~27或50~67地址时,必须通过移屏指令将他们一移入可显示区域方可正常显示。1602液晶模块内部的字符发生存储器〔CGROM)已经存储了160个不同的点阵字符图形,如下表所示。这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比方大写的英文字母“A〞的代码是01000001B〔41H〕,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A〞。状态字说明说明:原那么上每次对控制器进行读写操作前,都必须进行读写检测,确保STA7为0。实际上,由于单片机的操作速度慢于液晶控制器的反响速度,因此可以不进行检测,或只进行简短的延时即可。7指令说明1602液晶模块内部的控制器共有11条控制指令。显示模式设置显示开/关及光标设置数据指针设置其它设置8控制接口时序说明时序参数读操作时序写操作时序9初始化过程1〕延时15ms2〕写指令38H(不检测忙信号)3〕延时5ms4〕写指令38H(不检测忙信号)5〕延时5ms6〕写指令38H(不检测忙信号)7〕(以后每次写指令、读/写数据操作之前均需检测忙信号)8〕写指令38H:显示模式设置9〕写指令08H:显示关闭10〕写指令01H:显示清屏11〕写指令06H:显示光标移动设置12〕写指令0CH:显示开及光标设置三驱动程序举例1I/O方式驱动程序程序如下:/*=========================================================SMC1602A(16*2)I/O口线接线方式连接线图:---------------------------------------------------|LCM-----51|LCM-----51|LCM------51|---------------------------------------------||DB0-----P1.0|DB4-----P1.4|RW-------P2.0||DB1-----P1.1|DB5-----P1.5|RS-------P2.1||DB2-----P1.2|DB6-----P1.6|E--------P2.2||DB3-----P1.3|DB7-----P1.7|VLCD接1K电阻到GND|---------------------------------------------------[注:AT89S51使用12M晶体震荡器]=========================================================*/#include<reg51.h>sbitLCM_RW=P2^0;
//定义引脚sbitLCM_RS=P2^1;sbitLCM_E
=P2^2;#defineLCM_Data
P1#defineBusy0x80//用于检测LCM状态字中的Busy标识voidWriteDataLCM(unsignedcharWDLCM);voidWriteCommandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);unsignedcharReadStatusLCM(void);voidLCMInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelayms(unsignedintn);voiddellay(unsignedint
h);unsignedcharcodeblog_adr[]={"EDNchina"};unsignedcharcodeemail[]={"tengjingshu@126"};voidmain(void){
//Delay400Ms();
//启动等待,等LCM讲入工作状态
LCMInit();
//LCM初始化
DisplayListChar(6,0,blog_adr);
DisplayListChar(0,0,email);
while(1);}//写数据RS="H",RW=L,D0~D7=数据,E=高脉冲voidWriteDataLCM(unsignedcharWDLCM)
{
dellay(100);
LCM_E=0;
LCM_RS=1;
LCM_RW=0;LCM_Data=WDLCM;//dellay(100);
//短暂延时,代替检测忙状态
//ReadStatusLCM();//检测忙
LCM_E=1;
LCM_E=0;}//写指令RS="L",RW=L,D0~D7=指令码,E=高脉冲voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测{
//if(BuysC)ReadStatusLCM();//根据需要检测忙
dellay(100);
//短暂延时,代替检测忙状态
LCM_E=0;
LCM_RS=0;
LCM_RW=0;
LCM_Data=WCLCM;
LCM_E
=1;
LCM_E=0;}//读数据RS="H",RW=H,E=HunsignedcharReadDataLCM(void){
LCM_RS=1;
LCM_RW=1;
LCM_E=1;
return(LCM_Data);}//读状态RS="L",RW=H,E=HunsignedcharReadStatusLCM(void){
LCM_Data=0xFF;
LCM_RS=0;
LCM_RW=1;
LCM_E=1;
//while(LCM_Data&Busy);//检测忙信号
return(LCM_Data);}voidLCMInit(void)//LCM初始化{
LCM_Data=0;
Delayms(15);
WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号
Delayms(5);
WriteCommandLCM(0x38,0);
Delayms(5);
WriteCommandLCM(0x38,0);
WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1);//关闭显示
WriteCommandLCM(0x01,1);//显示清屏
WriteCommandLCM(0x06,1);//显示光标移动设置
WriteCommandLCM(0x0C,1);//显示开及光标设置}//按指定位置显示一个字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;
//当要显示第二行时地址码+0x40;X|=0x80;
//算出指令码WriteCommandLCM(X,1);//这里不检测忙信号,发送地址码WriteDataLCM(DData);}//按指定位置显示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength;ListLength=0;Y&=0x1;X&=0xF;
//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x1f)//假设到达字串尾那么退出
{
if(X<=0xF)//X坐标应小于0xF
{
DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符
ListLength++;X++;
}}}//延时程序voidDelayms(unsignedintn){
unsignedinti,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);}/****************************************************函数名称:dellay**入口参数:h〔unsignedint型〕**出口参数:无**功能描述:短暂延时,使用12MHz晶体,约0.01MS****************************************************/voiddellay(unsignedint
h){
while(h--);
//0.01MS}要注意的是在读写程序中,没有用“检测忙〞,其实对于1602来说,没有检测忙信号对于实际来说还好,因为常常因为检测忙,而使1602没显示〔一直处于忙检测中〕。“忙检测〞用一个小延时代替。对于LCM1602来说,读写时序最重要。
LCM1602写操作时序//写数据RS="H",RW=L,D0~D7=数据,E=高脉冲voidWriteDataLCM(unsignedcharWDLCM)
{
dellay(100);
//短暂延时,代替检测忙状态LCM_E=0;
LCM_RS=1;
LCM_RW=0;LCM_Data=WDLCM;
LCM_E=1;
LCM_E=0;}//写指令RS="L",RW=L,D0~D7=指令码,E=高脉冲voidWriteCommandLCM(unsignedcharWCLCM){
dellay(100);
//短暂延时,代替检测忙状态
LCM_E=0;
LCM_RS=0;
LCM_RW=0;
LCM_Data=WCLCM;
LCM_E
=1;LCM_E=0;}上面两个分别为写数据函数和写命令函数,检测忙已用小延时代替。其实这个时序好似不太严格,但要保证的是E高脉冲时,写的数据/命令是有效的。好似函数也可以写成这样:voidWriteCommandLCM(unsignedcharWCLCM){dellay(100);
//短暂延时,代替检测忙状态
LCM_Data=WCLCM;
LCM_RS=0;
LCM_RW=0;LCM_E
=0;
dellay(100);
LCM_E
=1;}//按指定位置显示一串字符函数DisplayListChar的作用是在指定位置显示一串字符,其中有一句“while(DData[ListLength]>0x1f)//假设到达字串尾那么退出〞
为什么要大于0x20呢?
unsignedcharcodeblog_adr[]={"EDNchina"};unsignedcharcodeemail[]={"tengjingshu@126"};
用单引号’’()括起来的字符为字符的ASCII码值,而不是字符串。
用双引号〞〞(shift+)括起来的一串字符,成为字符串常量。C编译器会自动地在字符末尾加上结束符’\0’(NULL)(ASCII码为0x00也就是00H)。chara[]={“BeiJing〞};chara[]={‘B’,’e’,’I’,’‘,’J’,’i’,’n’,’g’,’\0’};两者是等价的,数组的每个元素为对应字符的ASCII码,如a[3]数组a的第四个元素是’‘空格,那么a[3]里面放着的是空格’‘的ASCII码0x20。还要注意的是数组的元素数目一定要比字符多一个。以便C编译器自动在其后面参加结束符’\0’。可以知道‘\0’ASCII码为0x00‘\n’ASCII码为0x0A那知道为什么有这句了吧“while(DData[ListLength]>0x1F)//假设到达字串尾那么退出〞因为大于0x1f才能显示字符,小于和等于0x1f的都是键盘控制符。当然我们也可以检测’\0’(0x00)“while(DData[ListLength]!='\0')
//检测到字符串结束符那么退出〞总线方式驱动程序LCM1602总线方式C51程序//********************Lcd1602B.c***********************************#include<delay.h>#include<lcd1602b.h>#include<absacc.h>/*=======================================================
显示字符串=======================================================*/voidLcdDisplayString(unsignedcharx,unsignedchary,unsignedchar*ptr){unsignedchari,l=0;
while(ptr[l]>31){l++;};
//
for(i=0;i<l;i++){
LcdDisplayChar(x++,y,ptr[i]);
if(x==16){
x=0;y^=1;//异或,第一行的话变第二行,第二行的话变第一行
}
}}/*=======================================================
显示光标定位=======================================================*/voidLocateXY(charposx,charposy){unsignedchartemp;
temp=posx&0x0f;
//确保只选0~16个格子
posy&=0x01;
//确保不是在第一行就在第二行
if(posy)temp|=0x40;
//在第二行的时候加40H
temp|=0x80;
//数据指针设置指令码80H+地址码〔0-27H,40H-67H〕
LcdWriteCommand(temp,1);}/*=======================================================
按指定位置显示数出一个字符=======================================================*/voidLcdDisplayChar(unsignedcharx,unsignedchary,unsignedcharWdata){
LocateXY(x,y);
//定位显示地址
LcdWriteData(Wdata);
//写字符}/*=======================================================
初始化程序,必须按照产品资料介绍的初始化过程进行=======================================================*/voidLcdReset(void){
Delayms(400);
//启动时必须的延时,等待lcm进入工作状态
LcdWriteCommand(0x38,0);
//显示模式设置(不检测忙信号)
Delayms(15);
LcdWriteCommand(0x38,0);
//共三次
Delayms(15);
LcdWriteCommand(0x38,0);
Delayms(15);
LcdWriteCommand(0x38,1);
//显示模式设置(以后均检测忙信号)
LcdWriteCommand(0x08,1);
//显示关闭
LcdWriteCommand(0x06,1);
//显示光标移动设置
LcdWriteCommand(0x0c,1);
//显示开及光标设置
LcdClear();}/*=======================================================
clear=======================================================*/voidLcdClear(void){
LcdWriteCommand(0x01,1);
//显示清屏}/*=======================================================
写控制字符子程序:E="1"RS="0"RW="0"=======================================================*/voidLcdWriteCommand(unsignedcharCMD,unsignedcharAttribC){
//AttribC=1检查忙状态,AttribC=0不检查忙状态
if(AttribC)while(Lcd1602StatusPort&Busy);
//检测忙信号?
//busy=0x80
每次读写操作都要进行读写检测,确保SAT7=0
Lcd1602CmdPort=CMD;}/*=======================================================
当前位置写字符子程序:E=1RS="1"RW="0"=======================================================*/voidLcdWriteData(chardataW){
while(Lcd1602StatusPort&Busy);
//检测忙信号
//busy=0x80
每次读写操作都要进行读写检测,确保SAT7=0
Lcd1602WdataPort=dataW;精确微秒级延时〔详细可以参考我另一篇博文51单片机C51微秒级〔ms〕精确延时〕//********************delay.h***********************************#include<delay.h>//forcrystal11.0592MvoidDelayms(unsignedintn){
unsignedinti,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);}//********************lcd1602b.h***********************************#ifndef__LCD1602B_H__#define__LCD1602B_H__#defineLcd1602CmdPortXBYTE[0x8000]
//E=1RS="0"RW="0"
//写指令#defineLcd1602WdataPortXBYTE[0x8100]
//E=1RS="1"RW="0"//写数据#defineLcd1602StatusPortXBYTE[0x8200]
//E=1RS="0"RW="1"
//读状态#defineBusy0x80
//busyexternvoidLcdClear(void);externvoidLcdWriteData(chardataW);externvoidLcdWriteCommand(unsignedcharCMD,unsignedcharAttribC);externvoidLcdReset(void);externvoidDisplay(unsignedchardd);externvoidLcdDisplayChar(unsignedcharx,unsignedchary,unsignedcharWdata);externvoidLcdDisplayString(unsignedcharx,unsignedchary,unsignedchar*ptr);#endif其中要注意写指令的地址0x8000写数据的地址0x8100读状态的地址0x8200这三个地址值是根据硬件电路连接确定的。//********************absacc.h***********************************#ifndef__ABSACC_H__#define__ABSACC_H__#defineCBYTE((unsignedcharvolatilecode
*)0)#defineDBYTE((unsignedcharvolatiledata
*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《OFDM通信系统》课件
- 《建筑体验笔记》课件
- 2024年度股权投资增值共享协议
- 活动脚手架验收规范
- 二零二四年度厂房租赁合同及设备购买协议2篇
- 情侣分手协议书
- 二零二四年医院场地租赁合同
- 初一上册春课件
- 2024年度个人房产交易过程中的公证及见证服务合同3篇
- 2024年度建筑施工合同验收与移交合同2篇
- 炼焦工艺培训课件
- 木门行业2024年公司转型战略探讨
- (25)-6.5 DHCP协议和P2P应用计算机网络计算机网络
- 库容库貌整理知识培训课件
- 项目服务协议合同书
- 《创意美术教学课件》
- 初中体育排球垫球教案
- 建筑施工QC小组提高隧道光面爆破开挖一次成型率成果汇报
- 时尚服装传播职业生涯规划书
- 航空专业学生职业规划书
- 新人教版高中地理必修一第四章第一节-常见的地貌类型
评论
0/150
提交评论