欢迎来到51自学网!

51自学网

当前位置: 主页 > 软件教程 > 单片机教程 >

基于51单片机之LCD1602实验例程

时间:2018-08-22 10:02来源:网络整理 作者:51自学网
************************** Copyright(C)CaKe ***************************************** ======================================================================================== ==============**文件名 : main.c ============== ==============*

 **************************  Copyright(C)CaKe  *****************************************

========================================================================================

==============**文件名    : main.c              ==============

==============**作者      : CaKen              ==============

==============**版本号    : V1.0               ==============

==============**时间      : 2014.08.12               ==============

==============**功能描述  : 1602液晶屏实验测试          ==============

========================================================================================

****************************************************************************************

 

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char     //宏定义

#define uint unsigned int     //宏定义

 

 

uchar code Table1[]="CaKen-2245286160";

uchar code Table2[]="                ";

 

 

sbit  LCD1602_RS=P2^4;      //数据命令端口

sbit  LCD1602_RW=P2^5;      //读写端口.我们在这里只写

sbit  LCD1602_EN=P2^6;      //使能端口

 

*****************************************************************************************

函数名:延时函数

调  用:delayms();

参  数:

返回值:

结  果:

备  注:

*****************************************************************************************

 

void delayms(unsigned int ms)   

{

      unsigned int i , j;          

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

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

}

 

 

*****************************************************************************************

函数名:写指令

调  用:Write_com();

参  数:

返回值:

结  果:

备  注:

*****************************************************************************************

void Write_com(uchar com)

 {

   LCD1602_RS=0;               //写指令时RS=L

   LCD1602_EN=0;              

   P0=com;              //给端口送指令

   delayms(5);                 

   LCD1602_EN=1;               //使能端高电平有效  

   delayms(5);      

   LCD1602_EN=0;     

 }

 

*****************************************************************************************

函数名:写数据

调  用:Write_Date();

参  数:

返回值:

结  果:

备  注:

*****************************************************************************************

 void Write_Date(uchar Date)

 {

   LCD1602_RS=1;                //写数据时RS=L

   LCD1602_EN=0;                

   P0=Date;            //给端口送数据

   delayms(5);                   

   LCD1602_EN=1;                //使能端高电平有效  

   delayms(5);

   LCD1602_EN=0;    

 }

 

*****************************************************************************************

函数名:LCD1602初始化

调  用:LCD1602_Init();

参  数:

返回值:

结  果:

备  注:

*****************************************************************************************

void LCD1602_Init()

 {

   unsigned char num; 

   LCD1602_RW=0;                 //写信号拉低

   LCD1602_EN=0;                 //使能端拉低

   Write_com(0x38);           //开显示

   Write_com(0x0c);              //开显示不显示光标

   Write_com(0x06);              //每写一个地址和光标加一 

   Write_com(0x01);           //显示清零

 

   Write_com(0x80);              //第一行的初始地址为0x80

   for(num=0;num<16;num++)       //循环的数字要看上面的占多少个字符

     {

       Write_Date(Table1[num]);  //多了和少了都不会对的。

    delayms(5);

     }

 

     Write_com(0x80+0x40);       //第二行初始地址为0x80+0x40

     for(num=0;num<16;num++)

      {

         Write_Date(Table2[num]);

      delayms(5);

      }

 }

*****************************************************************************************

函数名:主函数

调  用:

参  数:

返回值:

结  果:

备  注:

***************************************************************************************** 

void main(void)

{  

     unsigned char n;

     LCD1602_Init();

 

   while(1)

 {

      Write_com (0x80+0x40+6);   //第二行第六个格开始显示

   Write_Date(0x30+n/100);    delayms(5);

   Write_Date(0x30+n0/10); delayms(5);

   Write_Date(0x30+n);     delayms(5);

     delayms(100);

 }      

}

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面是一个提高版的程序:

 

**************************  Copyright(C) CaKe  ****************************************

========================================================================================

==============**文件名    : main.c              ==============

==============**作者      : CaKen              ==============

==============**版本号    : V1.0               ==============

==============**时间      : 2014.08.17               ==============

==============**功能描述  : LCD1602实验测试          ==============

========================================================================================

****************************************************************************************


#include <reg52.h>     //包含单片机寄存器的头文件

#include <intrins.h>   //包含_nop_()函数定义的头文件


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

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

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


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


unsigned char code string[ ]= {"abcdefghihklabc"};

unsigned char code string1[ ]={"QUICK STUDY MCU"};

unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃

 


void delay1ms()

{

     unsigned char i,j; 

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

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

 }


 void delay(unsigned int n)

 {

    unsigned int i;

 for(i=0;i

 delay1ms();

 }


 bit BusyTest(void)

  {

     bit result;

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

     RW=1;

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

     _nop_();      //空操作

     _nop_();

     _nop_();

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

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

  EN=0;

     return result;

  }


void Write_com (unsigned char dictate)

{  

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

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

  RW=0;  

  EN=0;                    //E置低电平(写指令时,

                             // 就是让E从0到1发生正跳变,所以应先置"0"

  _nop_();

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

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

  _nop_();

  _nop_();

  _nop_();

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

  EN=1;                    //E置高电平

  _nop_();

  _nop_();

  _nop_();

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

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

 }


 void WriteAddress(unsigned char x)

 {

     Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x" 

 }


 void WriteData(unsigned char y)

 {

    while(BusyTest()==1); 

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

   RW=0;

   EN=0;               //E置低电平(写指令时,,

                         // 就是让E从0到1发生正跳变,所以应先置"0"

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

   _nop_();

   _nop_();

    _nop_();

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

   EN=1;               //E置高电平

   _nop_();

   _nop_();

   _nop_();

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

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

 }


void LCD1602_Init(void)

{

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

    Write_com(0x38);       //显示模式设置:16×2显示,5×7点阵,8位数据接口

 delay(5);

 Write_com(0x38);

 delay(5);      //延时5ms

 Write_com(0x38);       //3次写 设置模式

 delay(5);

 Write_com(0x0F);       //显示模式设置:显示开,有光标,光标闪烁

 delay(5);

 Write_com(0x06);       //显示模式设置:光标右移,字符不移

 delay(5);            

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

 delay(5);

 }



void main(void)           

 {

  unsigned char i=0,j;

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

  delay(10);

  while(1)

    {



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

   delay(5);

   WriteAddress(0x00);                // 设置显示位置为第一行的第1个字

   delay(5);


   while(string[i] != '\0')           //'\0'是数组结束标志

   {                 // 显示字符 abcdefghihklabc

    WriteData(string[i]);

    i++;

    delay(100);

   }


    WriteAddress(0x40);         // 设置显示位置为第二行的第1个字

         i = 0;

    while(string[i] != '\0')          //'\0'是数组结束标志

     {               // 显示字符 QUICK STUDY MCU

   WriteData(string1[i]);

   i++;

   delay(100);

  } 

     //while(1);


 


  delay(1000); 

                        //右侧移位进来

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

  delay(5);

  WriteAddress(0x10);            // 设置显示位置为第一行的第1个字

  delay(5);

    i = 0;

  while(string[i] != '\0')       //'\0'是数组结束标志

   {             // 显示字符  abcdefghihklabc

   WriteData(string[i]);

   i++; 

   }

   

   WriteAddress(0x50);        // 设置显示位置为第二行的第1个字

         i = 0;

  while(string[i] != '\0')       //'\0'是数组结束标志

    {             // 显示字符 QUICK STUDY MCU

   WriteData(string1[i]);

   i++;

    }

   

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

    {

    Write_com(0x18);         //左移指令

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

          delay(30);   

    }    

   //while(1);


 


         delay(1000);

   Write_com(0x08);          //关闭显示

   //while(1);    

         delay(3000);           //延时  维持显示一段时间

   Write_com(0x0c);          //开显示   

       //while(1);

         delay(3000);              //延时  维持显示一段时间



   Write_com(0x0f);       //开光标

   // while(1);

         delay(1000);           //延时  维持显示一段时间


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

   {

    Write_com(0x1c);      //右移 移出

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

          delay(30);      

   }

   //while(1);



       Write_com(0x40);          //设定CGRAM地址

   delay(5);

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

   {

    WriteData(User[j]);  //写入自定义图形 ℃

   }

      WriteAddress(0x05);      //设定屏幕上的显示位置

    delay(5);

      WriteData(0x00);      //从CGRAM里取出自定义图形显示

      while(1); 

  }    

}

 

 

【发表评论】【告诉好友】【收藏此文】【】

(责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容