lcd1602Word下载.docx
- 文档编号:18940717
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:21
- 大小:23.47KB
lcd1602Word下载.docx
《lcd1602Word下载.docx》由会员分享,可在线阅读,更多相关《lcd1602Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
MCU要写入指令时,使RS为低电平;
MCU要
写入数据时,使RS为高电平。
R/W:
读写控制端。
R/W为高电平时,读取数据;
R/W为低电平时,写入数据。
E:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块。
D0~D7:
8位数据总线,三态双向。
该模块也可以只使用4位数据线D4-D7接口传送
数据。
BLA:
需要背光时,BLA串接一个限流电阻接VCC,BLK接地。
BLK:
背光地端。
图8-2LCD模块于MCU连接图
说明
实际上,是LCD模块与教学板相连,相关电路图见附件。
LCD控制器接口说明
基本操作时序
在LCD时序图中,在将E置高电平前,先设置好RS和R/W信号,在E下降沿到来之
前,准备好写入的命令字或数据。
只需在适当的地方加上延时,就可以满足要求了。
读状态输入:
RS=L,RW=H,E=H
输出:
DB0~DB7=状态字
写指令输入:
RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码
无
读数据输入:
RS=H,RW=H,E=H
DB0~DB7=数据
写数据输入:
RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据
状态字说明
STA7STA6STA5STA4STA3STA2STA1STA0
111
D7D6D5D4D3D2D1D0
STA0-6当前数据地址指针的数值
STA7读写操作使能1:
禁止0:
允许
注:
对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0。
指令说明
显示模式设置
指令码功能
00111000设置16*2显示,5*7点阵,8位数据接口
00101000设置16*2显示,5*7点阵,4位数据接口
显示开/关及光标设置
00001DCB
D=1开显示;
D=0关显示
C=1显示光标;
C=0不显示光标
B=1光标闪烁;
B=0光标不闪烁
000001NS
N=1当读或写一个字符后地址指针加一,且光标加一
N=0当读或写一个字符后地址指针减一,且光标减一
S=1当写一个字符,整屏显示左移(N=1)或右移(N=0),以得
到光标不移动而屏幕移动的效果
S=0当写一个字符,整屏显示不移动
其它设置
01H显示清屏:
1、数据指针清零2、所有显示清零
02H显示回车:
1、数据指针清零
初始化过程(复位过程)
延时15ms
写指令38H(不检测忙信号)(或28H,表示4位数据接口,下同)
写指令38H(不检测忙信号)
(以后每次写指令、读/写数据操作之前都均需检测忙信号)
写指令38H:
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0cH:
显示开及光标设置
数据指针(地址)设置
LCD控制器内部带有80X8位(80字节)的RAM缓冲区,对应关系如图8-3:
112
图8-3LCD内部RAM地址映射图
数据地址设置指令码:
80H+地址码(0~27H,40~67)。
任务二编写LCD模块驱动程序
在本任务中,你将通过编写程序来驱动LCD显示器,并显示你的机器人所要显示的字
符或字符串,这样你就可以不需要调试终端的帮助而显示字符或者字符串。
元件清单:
(1)1602LCD显示器
(2)跳线
线路连接
传统的连线是图8-2介绍的八位数据线接法,而教材采用的是四位数据线传输方式来进
行LCD显示。
为什么只用四线传输?
因为这样可以节省接口开销。
由于LCD的指令和数据都是八位的,因此在传输时要传输两次才能完成一次操作。
电
路的连接如图8-4所示。
图8-4四口数据线连接LCD
例程:
LCDdisplay.c
接通主板电源
输入、保存并运行LCDdisplay.c
113
连接LCD显示器模块,验证显示器是否显示字符串
/*=========================================================
1602液晶显示的实验例子
-------------------------------------------------
|DB4-----P0.4|RW-------P2.1
|DB5-----P0.5|RS-------P2.2
|DB6-----P0.6|E--------P2.0
|DB7-----P0.7|
---------------------------------------------------
=========================================================*/
#include<
at89x52.h>
BoeBot.h>
#defineLCM_RWP2_1//定义引脚
#defineLCM_RSP2_2
#defineLCM_EP2_0
#defineLCM_DataP0
#defineBusy0x80//用于检测LCM状态字中的Busy标识
/*------------------------------------------
子函数声明
------------------------------------------*/
voidWrite_Data_LCM(unsignedcharWDLCM);
voidWrite_Command_LCM(unsignedcharWCLCM,BuysC);
voidRead_Status_LCM(void);
voidLCM_Init(void);
voidSet_xy_LCM(unsignedcharx,unsignedchary);
voidDisplay_List_Char(unsignedcharx,unsignedchary,unsignedchar*s);
voidmain(void)
{
LCM_Init();
//LCM初始化
delay_nms(5);
//延时片刻(可不要)
while
(1)
Display_List_Char(0,0,"
"
);
Display_List_Char(1,0,"
Robot-AT89S52"
}
/*=========================
函数名:
Read_Status_LCM()
功能:
忙检测函数
===========================*/
voidRead_Status_LCM(void)
unsignedcharread=0;
114
LCM_RW=1;
LCM_RS=0;
LCM_E=1;
LCM_Data=0xff;
do
read=LCM_Data;
while(read&
Busy);
LCM_E=0;
/*-------------------------------------------
Write_Data_LCM()
对LCD1602写数据
--------------------------------------------*/
voidWrite_Data_LCM(unsignedcharWDLCM)
Read_Status_LCM();
//检测忙
LCM_RS=1;
LCM_RW=0;
LCM_Data&
=0x0f;
LCM_Data|=WDLCM&
0xf0;
//若晶振速度太高可以在这后加小的延时
//延时
WDLCM=WDLCM<
<
4;
/*------------------------------------------------
Write_Command_LCM()
对LCD1602写指令
--------------------------------------------------*/
voidWrite_Command_LCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测
if(BuysC)
//根据需要检测忙
115
LCM_Data|=WCLCM&
//传输高四位
WCLCM=WCLCM<
//传输低四位
/*---------------------------------------------
LCM_Init()
对LCD1602初始化
----------------------------------------------*/
voidLCM_Init(void)//LCM初始化
LCM_Data=0;
Write_Command_LCM(0x28,0);
//三次显示模式设置,不检测忙信号
delay_nms(15);
Write_Command_LCM(0x28,1);
//显示模式设置,开始要求每次检测忙信号
Write_Command_LCM(0x08,1);
//关闭显示
Write_Command_LCM(0x01,1);
//显示清屏
Write_Command_LCM(0x06,1);
//显示光标移动设置
Write_Command_LCM(0x0C,1);
//显示开及光标设置
Set_xy_LCM()
设定显示坐标位置
voidSet_xy_LCM(unsignedcharx,unsignedchary)
unsignedcharaddress;
if(x==0)
address=0x80+y;
116
else
address=0xc0+y;
Write_Command_LCM(address,1);
Display_List_Char()
按指定位置显示一串字符
voidDisplay_List_Char(unsignedcharx,unsignedchary,unsignedchar*s)
Set_xy_LCM(x,y);
while(*s)
LCM_Data=*s;
Write_Data_LCM(*s);
s++;
LCDdiaplay.c是如何工作的?
整个工作分为两步:
先对LCD进行初始化,然后再显示。
研究初始化函数voidLCM_Init(void),你会发现,该函数完全是按照任务一LCD的初
始化要求来的。
初始化工作完成之后,主函数调用Display_List_Char(unsignedcharx,unsignedchary,
unsignedchar*s)来显示字符串。
在显示字符串之前,需用Set_xy_LCM()确定光标的位置,根据数据地址设置指令要
求,若在第一行显示则写指令0x80+y;
若在第二行显示,则写指令0x80+0x40+y,即0xc0+y。
这里,我们将向大家介绍一种新的C语言数据类型:
指针
指针是C语言中广泛使用的一种数据类型。
运用指针编程是C语言最主要的风格之一。
利用指针变量可以表示各种数据结构;
能很方便地使用数组和字符串;
并能象汇编语言一样
处理内存地址,从而编出精练而高效的程序。
指针极大地丰富了C语言的功能。
学习指针是
学习C语言中最重要的一环,能否正确理解和使用指针是你是否掌握C语言的一个标志。
同
时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多
编程,上机调试。
只要作到这些,指针也是不难掌握的。
在计算机中,所有的数据都是存放在存储器中的。
一般把存储器中的一个字节称为一个
内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1
个单元等。
为了正确地访问这些内存单元,必须为每个内存单元编上号。
根据一个内存单元
的编号即可准确地找到该内存单元。
内存单元的编号也叫做地址。
既然根据内存单元的编号
或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。
可以用一个通俗的例子来说明它
们之间的关系。
你到银行去存取款时,银行工作人员将根据你的帐号去找你的存款单,找到
之后在存单上写入存款、取款的金额。
在这里,帐号就是存单的指针,存款数是存单的内容。
117
对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。
在C语
言中,允许用一个变量来存放指针,这种变量称为指针变量。
因此,一个指针变量的值就是
某个内存单元的地址或称为某内存单元的指针。
对指针变量的定义包括三个内容:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
其一般形式为:
类型说明符*变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指
针变量所指向的变量的数据类型。
字符串的指针和指向字符串的针指变量
在C语言中,可以用两种方法访问一个字符串:
1.用字符数组存放一个字符串,然后输出该字符串。
如:
main()
charstring[]=”IloveRobot!
”;
printf("
%s\n"
string);
2.用字符串指针指向一个字符串。
main()
char*string=”IloveRobot!
这里,string是一个指向字符串的指针变量。
程序并没有把整个字符串存入string,而
是把字符串的首地址赋予string。
函数Display_List_Char(0,0,"
先给字符串定位(0,0);
之后将字符串
www."
首地址附给指针s,并显示,随后加1,指向下一个字符,直到显示全部
字符。
该你了
还记得第三章例程NavigationWithSwitch.c吗?
当时,用数组charNavigation[10]=
{'
F'
'
L'
R'
B'
Q'
}来保存机器人的运行状态,指针同样可以完成该功能,动手
改一下!
任务三用LCD显示机器人运动状态
例程LCDdiaplay.c仅仅是静态的LCD显示,在实际工程应用中没有意义,它应与具体
的应用,比如机器人的运动结合起来。
在介绍本任务例程之前,先讲解一下C语言的高级
功能。
C语言的编译预处理
在C编译系统,即KEIL对程序编译之前,先要对某些程序(这些程序可以是C语言
118
提供的标准库函数,也可以是你已经开发好的某些程序)进行预处理,然后再将预处理的结
果和源程序一起再进行正常的编译处理得到目标代码。
通常的预处理命令都用“#”开关,
具体预处理命令包括:
1.宏定义
即#define指令,具有如下形式:
#define名字替换文本
它是一种最简单的宏替换。
出现在各处的“名字”都将“替换文本”替换。
#define指
令所定义的名字的作用域从其定义点开始,到被编译的源文件的结束。
这个指令教材之前就已经大量使用了,如:
#defineLeftIRP1_2
#defineKpl-70
2.文件包含
即#include指令。
在源程序文件中,任何形如:
#include“文件名”,或#include<
文件名>
的行都被替换成
由文件名所指定的文件的内容。
如果文件名由引号(“”)括起来,那么就在源程序所在位
置查找该文件;
如果在这个位置没有找到该文件,或如果文件名由尖括号(<
>
)括起来,
那么就在系统文件下查找。
这个指令教材在最开始就用了,如#include<
uart.h>
。
所谓文件包含就是指一个源文件可以将另一个源文件的全部内容包含进来。
但要注意的
是,对文件包含并不是把两个文件连接起来,而是编译时作为一个源程序编译,得到一个目
标文件,比如HEX文件。
被包含的文件常在文件的头部,所以被称为“头文件”,可以以“.h”为后缀,也可以
以“.c”为后缀。
对于比较大的程序,用#include指令把各个文件放在一起是一种优化程序的方法,之前
的例程就是这样做的。
现在,将LCD显示部分作为头文件LCD.H保存,内容如下:
#defineLCM_RWP2_1
119
120
delay_nm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lcd1602
![提示](https://static.bdocx.com/images/bang_tan.gif)