原创 基于51单片机的1602LCD显示

2010-5-24 10:18 13349 7 8 分类: MCU/ 嵌入式

基于51单片机的1602LCD显示<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


 


1  硬件设计


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


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />点击看大图


在桌面上双击图标88257284-4d9e-478f-b982-83e471eb8f86.jpg,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“LCD.DSN”。在器件选择按钮e4c59fa0-8616-43af-85c6-6aacb4759014.jpg中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。



51单片机AT89C51    一片


晶体CRYSTAL 12MHz   一只


瓷片电容CAP 22pF    二只


电解电容CAP-ELEC 10uF   一只


电阻RES 10K         一只


排阻 RESPAC-8 10K       一只


1602液晶显示器 LM016L   一只


 


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


ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标9a018c13-6346-4d90-8c07-eda196bcc3c6.jpg,在对象选择器中单击POWERGROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。


2  软件设计


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



点击看大图


 


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


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


#include<reg51.h>    //包含单片机的头文件


#include<intrins.h>  //包含_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<n;i++)


              delay1ms();


 }


 


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


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


返回值:resultresult=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;             //根据规定,RSR/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_();        //空操作四个机器周期,给硬件反应时间


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


 }


 


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


函数功能:对LCD的显示模式进行初始化设置


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


void LcdInitiate(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);


 }


 


void main(void)            //主函数


{


       unsigned char i;


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


     delay(10);


     while(1)


    {


          WriteInstruction(0x01);                         //清显示:清屏幕指令


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


              i = 0;


              while(string != '\0')


              {                                                              // 显示字符


                     WriteData(string);


                     i++;


                     delay(150);


              }     


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


                  delay(250);


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


              i = 0;


              while(string1 != '\0')


              {                                                              // 显示字符


                     WriteData(string1);


                     i++;


                     delay(150);


              }     


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


                  delay(250);


       }


}


 


打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“LCD”项目,并选择单片机型号为AT89C51。执行菜单命令“文件”→“新建”创建文件,输入C语言源程序,保存为“LCD.C”。在Project Workspace窗口中右击源代码组1,选择“添加文件到组‘源代码组 l’”将源程序“LCD.C”添加到项目中。


Keil中执行执行菜单命令“工程”→“创建目标”(或点击“创建目标”快捷按钮),编译源程序。如果编译成功,则在“Output Window”的“创建”窗口中显示没有错误,并创建了“LCD.HEX”文件。


 


3  仿真与调试


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


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


    Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标5ab3e924-f386-497b-8c5a-a9953402688f.jpg进入Keil调试环境。同时,在Proteus ISIS的窗口中可看出Proteus也进入了程序调试状态。


    Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。


Keil中按F5键(或点击“运行”快捷按钮)运行程序。1602LCD循环显示Welcom to China”和“Hi!Good morning!,如下图所示。


b310ac7e-3723-4762-aa73-f45006adf727.jpg


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


 


    本人邮箱:txxyc104@163.com,欢迎来信讨论.


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-2-1 12:15

给力!

相关推荐阅读
用户518655 2010-08-16 17:11
基于ARM单片机的单总线应用
基于ARM单片机的单总线应用单总线(1-Wire)是美国达拉斯半导体公司的一项专利技术。与目前广泛应用的其他串行数据通信方式不同,它采用单根信号线完成数据的双向传输,具有节省I/O引脚资源、结构简单、...
用户518655 2010-08-11 18:16
基于ARM单片机的128x64LCM应用(串行接口)
基于ARM单片机的128x64LCM应用(串行接口)ARM单片机是32位的,而51单片机是8位的,功能上ARM单片机要大大优于51单片机,而其价格已经很低了,从发展的眼光看,ARM单片机将会占据单片机...
用户518655 2010-08-10 10:41
基于ARM单片机的128x64LCM应用(并行接口)
基于ARM单片机的128x64LCM应用(并行接口)ARM单片机的功能要大大优于51单片机,而其价格已经很低了,生产厂家不论是出于广告宣传的需要,还是出于利润的角度考虑(嵌入ARM单片机将会卖更高的价...
用户518655 2010-08-06 18:02
基于ARM单片机的软件时钟
基于ARM单片机的软件时钟ARM单片机的功能要大大优于51单片机,而其价格已经很低了,生产厂家不论是出于广告宣传的需要,还是出于利润的角度考虑(嵌入ARM单片机将会卖更高的价格),他们更希望在自己的产...
用户518655 2010-08-03 16:49
寄语新同学
寄语新同学       我是一名从教三十多年的大学老师,因此我认为我有资格向即将成为大学生的新同学们说几句话。       首先祝贺你们即将成为一名大学生!在你们将要跨进大学校门开始新的学习生活之前,...
用户518655 2010-06-19 16:00
单片机的一种分类方法
单片机的一种分类方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />“单片机”一词在...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条