基于51单片机的LCD1602液晶显示时钟

描述

51单片机结构简单,架构体系完备,学习资料丰富,应用领域广泛。通过对51单片机的学习,可帮助小白实现快速入门电子设计,理解电路系统工作原理,为高级嵌入式芯片的学习及开发打下坚实基础。

本篇描述

 

1、51+Proteus8.10;

2、学习1302时钟芯片、1602液晶驱动;

仿真设计

  采用Proteus作为仿真设计工具。Proteus是一款著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,真正实现了从概念到产品的完整设计。

软件设计

 

采用Keil作为软件设计工具。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。

#include 
#include 
#include 
#define uint unsigned int
#define uchar unsigned char


sbit DS1302_IO = P1^7;
sbit DS1302_SCLK = P1^6;
sbit DS1302_RST = P1^5;
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_EN = P2^2;


uchar LCD_1[]={"DATE: 00-00-00  "};
uchar LCD_2[]={"TIME: 0000  "};
uchar DateTime[7];


void DelayMS(uint ms)
{
   uchar i;
  while(ms--)
  {
     for(i=0;i<120;i++);
  }
}


uchar Get_A_Byte_FROM_DS1302()
{
   uchar i,b=0x00;
  for(i=0;i<8;i++)
  {
     b |= _crol_((uchar)DS1302_IO,i);
    DS1302_SCLK=1;
    DS1302_SCLK=0;
  }
  return b/16*10+b%16;
}


void Write_A_Byte_TO_DS1302(uchar x)
{
   uchar i;
  for(i=0;i<8;i++)
  {
     DS1302_IO=x&0x01;
    DS1302_SCLK=1;
    DS1302_SCLK=0;
    x>>=1;
  }
}


uchar Read_Data(uchar addr)
{
   uchar dat;
  DS1302_RST = 0;
  DS1302_SCLK=0;
  DS1302_RST=1;
  Write_A_Byte_TO_DS1302(addr);
  dat = Get_A_Byte_FROM_DS1302();
  DS1302_SCLK=1;
  DS1302_RST=0;
  return dat;
}


uchar Read_LCD_State()
{
   uchar state;
  LCD1602_RS=0;
  LCD1602_RW=1;
  LCD1602_EN=1;
  DelayMS(1);
  state=P0;
  LCD1602_EN = 0;
  DelayMS(1);
  return state;
}


void LCD_Busy_Wait()
{
   while((Read_LCD_State()&0x80)==0x80);
  DelayMS(5);
}


void Write_LCD_Data(uchar dat)
{
   LCD_Busy_Wait();
  LCD1602_RS=1;
  LCD1602_RW=0;
  LCD1602_EN=0;
  P0=dat;
  LCD1602_EN=1;
  DelayMS(1);
  LCD1602_EN=0;  
}


void Write_LCD_Command(uchar cmd)
{
   LCD_Busy_Wait();
  LCD1602_RS=0;
  LCD1602_RW=0;
  LCD1602_EN=0;
  P0=cmd;
  LCD1602_EN=1;
  DelayMS(1);
  LCD1602_EN=0;  
}


void Set_LCD_POS(uchar p)
{
   Write_LCD_Command(p|0x80);  
}


void Display_LCD_String(uchar p,uchar *s)
{
   uchar i;
  Set_LCD_POS(p);
  for(i=0;i<16;i++)
  {
    Write_LCD_Data(s[i]);
    DelayMS(1);   
  }
}


void Format_DateTime(uchar d,uchar *a)
{
   a[0]=d/10+'0';
  a[1]=d%10+'0';
}


void Init_LCD()
{
   Write_LCD_Command(0x38);
  DelayMS(1);  
  Write_LCD_Command(0x01);
  DelayMS(1);  
  Write_LCD_Command(0x06);
  DelayMS(1);  
  Write_LCD_Command(0x0c);
  DelayMS(1);  
}


void GetTime()
{
   uchar i,addr = 0x81;
  for(i=0;i<7;i++)
  {
     DateTime[i]=Read_Data(addr);addr+=2;
  }
}


void main()
{
   Init_LCD();
  while(1)
  {
     GetTime();


    Format_DateTime(DateTime[6],LCD_1+6);
    Format_DateTime(DateTime[4],LCD_1+9);
    Format_DateTime(DateTime[3],LCD_1+12);
    Format_DateTime(DateTime[2],LCD_2+6);
    Format_DateTime(DateTime[1],LCD_2+9);
    Format_DateTime(DateTime[0],LCD_2+12);


    Display_LCD_String(0x00,LCD_1);
    Display_LCD_String(0x40,LCD_2);
  }
}

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分