基于51单片机的1602LCD显示.docx

上传人:b****6 文档编号:6124501 上传时间:2023-01-04 格式:DOCX 页数:8 大小:156.07KB
下载 相关 举报
基于51单片机的1602LCD显示.docx_第1页
第1页 / 共8页
基于51单片机的1602LCD显示.docx_第2页
第2页 / 共8页
基于51单片机的1602LCD显示.docx_第3页
第3页 / 共8页
基于51单片机的1602LCD显示.docx_第4页
第4页 / 共8页
基于51单片机的1602LCD显示.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

基于51单片机的1602LCD显示.docx

《基于51单片机的1602LCD显示.docx》由会员分享,可在线阅读,更多相关《基于51单片机的1602LCD显示.docx(8页珍藏版)》请在冰豆网上搜索。

基于51单片机的1602LCD显示.docx

基于51单片机的1602LCD显示

标签:

单片机  LCD  

基于51单片机的1602LCD显示

基于51单片机的1602LCD显示

LCD(liquidcrystaldisplay)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquidcrystaldisplaymoulde,简称为LCM)来使用。

LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。

1硬件设计

采用51单片机控制1602LCD显示器的电路如下所示。

在桌面上双击图标

,打开ISIS7Professional窗口(本人使用的是v7.4SP3中文版)。

单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“LCD.DSN”。

在器件选择按钮

中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。

51单片机AT89C51一片

晶体CRYSTAL12MHz一只

瓷片电容CAP22pF二只

电解电容CAP-ELEC10uF一只

电阻RES10K一只

排阻RESPAC-810K一只

1602液晶显示器LM016L一只

若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。

在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标

,在对象选择器中单击POWER和GROUND放置电源和地。

放置好元件后,布好线。

左键双击各元件,设置相应元件参数,完成电路图的设计。

2软件设计

用1602LCD显示两行字符的流程图如下所示。

 

用1602LCD显示“WelcomtoChina”和“Hi!

Goodmorning!

”的详细C51程序如下。

//用LCD循环显示"WelcometoChina"和"Hi!

Goodmorning!

"

#include//包含单片机的头文件

#include//包含_nop_()函数定义的头文件

sbitRS="P2"^0;//寄存器选择位,将RS位定义为P2.0引脚

sbitRW="P2"^1;//读写选择位,将RW位定义为P2.1引脚

sbitE="P2"^2;//使能信号位,将E位定义为P2.2引脚

sbitBF="P0"^7;//忙碌标志位,,将BF位定义为P0.7引脚

unsignedcharcodestring[]={"WelcometoChina"};

unsignedcharcodestring1[]={"Hi!

Goodmorning!

"};

/*************************************************

函数功能:

延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

*************************************************/

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************

函数功能:

延时若干毫秒

入口参数:

n

******************************/

voiddelay(unsignedcharn)

{

unsignedchari;

for(i=0;i

delay1ms();

}

/*******************************************

函数功能:

判断液晶模块的忙碌状态

返回值:

result。

result=1,忙碌;result=0,不忙

*******************************************/

unsignedcharBusyTest(void)

{

bitresult;

RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;//E=1,才允许读写

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result

E=0;

returnresult;

}

/**************************************************

函数功能:

将模式设置指令或显示地址写入液晶模块

入口参数:

dictate

**************************************************/

voidWriteInstruction(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;//E置低电平

_nop_();

_nop_();//空操作两个机器周期,给硬件反应时间

P0=dictate;//将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平(正跳变)

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/**************************************************

函数功能:

将数据(字符的标准ASCII码)写入液晶模块

入口参数:

y(为字符常量)

**************************************************/

voidWriteData(unsignedchary)

{

while(BusyTest()==1);

RS=1;//RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;//E置低电平

P0=y;//将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平(正跳变)

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/******************************************

函数功能:

对LCD的显示模式进行初始化设置

******************************************/

voidLcdInitiate(void)

{

delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);//显示模式设置:

8位数据,16×2显示,5×7点阵,delay(5);//延时5ms 

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0f);//显示模式设置:

显示开,有光标,光标闪烁

delay(5);

WriteInstruction(0x06);//显示模式设置:

光标右移,字符不移

delay(5);

WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除

delay(5);

}

voidmain(void)//主函数

{

unsignedchari;

LcdInitiate();//调用LCD初始化函数

delay(10);

while

(1)

{

WriteInstruction(0x01);//清显示:

清屏幕指令

WriteInstruction(0x80);//第一行显示地址

i=0;

while(string[i]!

='\0')

{//显示字符

WriteData(string[i]);

i++;

delay(150);

}

for(i=0;i<4;i++)

delay(250);

WriteInstruction(0xc0);//第二行显示地址

i=0;

while(string1[i]!

='\0')

{//显示字符

WriteData(string1[i]);

i++;

delay(150);

}

for(i=0;i<4;i++)

delay(250);

}

}

打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“LCD”项目,并选择单片机型号为AT89C51。

执行菜单命令“文件”→“新建”创建文件,输入C语言源程序,保存为“LCD.C”。

在ProjectWorkspace窗口中右击源代码组1,选择“添加文件到组‘源代码组l’”将源程序“LCD.C”添加到项目中。

在Keil中执行执行菜单命令“工程”→“创建目标”(或点击“创建目标”快捷按钮),编译源程序。

如果编译成功,则在“OutputWindow”的“创建”窗口中显示没有错误,并创建了“LCD.HEX”文件。

3仿真与调试

关于Proteus与Keil的联合仿真调试,可参见我以前所写的博文或其它参考资料。

启动Proteus的ISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动Keil的μVision3,并将其放在屏幕的左下角。

在Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标

,进入Keil调试环境。

同时,在ProteusISIS的窗口中可看出Proteus也进入了程序调试状态。

在Keil代码编辑窗口中设置相应断点,断点的设置方法:

在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。

在Keil中按F5键(或点击“运行”快捷按钮)运行程序。

1602LCD循环显示“WelcomtoChina”和“Hi!

Goodmorning!

”,如下图所示。

或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1