基于51单片机的1602LCD显示

  • 格式:doc
  • 大小:286.50 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

标签:单片机LCD

基于51单片机的1602LCD显示

基于51单片机的1602LCD显示

LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。

1 硬件设计

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

在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。在器件选择按钮

中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只

瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只

电阻RES 10K 一只排阻RESPAC-8 10K 一只

1602液晶显示器LM016L 一只

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

在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。

2 软件设计

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

用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。

//用LCD循环显示"Welcome to China"和"Hi!Good morning!"

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

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

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

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

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

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

unsigned char code string[ ]={"Welcome to China"};

unsigned char code string1[ ]={"Hi!Good morning!"};

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

函数功能:延时1ms

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

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

void delay1ms()

{

unsigned char i,j;

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

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

;

}

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

函数功能:延时若干毫秒

入口参数:n

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

void delay(unsigned char n)

{

unsigned char i;

for(i=0;i

delay1ms();

}

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

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌; result=0,不忙

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

unsigned char BusyTest(void)

{

bit result;

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

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

_nop_(); //空操作

_nop_();

_nop_();

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

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

E=0;

return result;

}

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

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

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

void WriteInstruction (unsigned char dictate)

{

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(为字符常量)

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

void WriteData(unsigned char y)

{

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_(); //空操作四个机器周期,给硬件反应时间