51单片机LCD的数字时钟,实现修改和显示日期

这是一个使用单片机进行时间显示和按键控制的程序,包括了液晶屏显示、时间日期的增加减少、星期显示等功能。程序中使用了矩阵键盘进行操作,能够修改年、月、日、星期、时、分、秒,并有消抖和定时器实现时间自动更新。
摘要由CSDN通过智能技术生成

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Z-m5L2z5a6B,size_20,color_FFFFFF,t_70,g_se,x_16

  1. 仿真图的数码锁存器和温度传感器不用加,这是学校板

#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;//黑液晶屏
sbit rs=P3^5;
sbit lcden=P3^4;
sbit wr=P3^6;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
sbit fengming=P2^3;//蜂鸣器
uchar count;
uchar miao,shi,fen,month,day,week,year,selectDate,selectWei,weekChange=0;
uchar weekSelect=0;
uchar code tableYear[]="2000";
uchar code tableMonth[]="-01";
uchar code tableDay[]="-01";
uchar code tableWeek[]="-Mon-Tue-Wed-Thu-Fri-Sat-Sun";
uchar code tableTime[]="00:00:00    ";//初始化
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

 

uchar get_year() //判断是否是闰年
{
       uchar s=0;
    if(year%4==0)s=1;
      return s;
}

void write_com(uchar com)
{
    rs=0;
    lcden=0;
    P0=com;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;    
}

void write_date(uchar date)
{
    rs=1;
    lcden=0;
    P0=date;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;    
}

void write_sfm(uchar add,uchar date)
{
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x40+add);//写入的位置
    write_date(0x30+shi);//写入时间的十位
    write_date(0x30+ge);//写入时间的个位
}

void write_diyihang(uchar add,uchar date)//年月日
{
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x01+add);//写入的位置
    write_date(0x30+shi);//写入时间的十位
    write_date(0x30+ge);//写入时间的个位
}


uchar get_month()//获取每个月的时间
{
     uchar DAY;
   switch(month)
  { 
   case 1:DAY=31;break;
   case 2:
   {if(get_year()==1)DAY=29;
       else DAY=28;}break;
   case 3: DAY=31;break;
   case 4: DAY=30;break;
   case 5:DAY=31 ;break;
   case 6: DAY=30;break;
   case 7:DAY=31 ;break;
   case 8: DAY=31;break;
   case 9: DAY=30;break;
   case 10: DAY=31;break;
   case 11:DAY=30 ;break;
   case 12:DAY=31;break;
  }
   return DAY;
}

void AddmodifyWeek()//加星期
{
        uchar i=0;
         write_com(0x80+11);
         for(i;i<4;i++)
        {
            write_date(tableWeek[weekChange++]);
            delay(5);
        }
        if(weekChange==28)weekChange=0;
}

void MinusmodifyWeek()//减星期
{
         uchar i=0;
         write_com(0x80+11);
         if(weekChange==0)weekChange=32; //判断开始的日期
          for(i=8;i>0;i--)
           weekChange--;
         if(weekChange==-4)weekChange=24;
         for(i;i<4;i++)
        {
            write_date(tableWeek[weekChange++]);
            delay(5);
        }
        
}

void addModifyDate()//加日期
{
     if(selectWei==0)
     year++; if(year==100)year=0;
      if(selectWei==1)
     month++;if(month==13)month=1;
      if(selectWei==2)
    day++; if(day>get_month())day=1;
      if(selectWei==3)
      AddmodifyWeek() ;
      if(selectWei==4)
    shi++; if(shi==24)shi=0;
      if(selectWei==5)
     fen++; if(fen==60)fen=0;
      if(selectWei==6)
     miao++; if(miao==60)miao=0;
}

void MinusModifyDate()///减日期
{
     if(selectWei==0)
     year--; if(year==-1)year=99;
      if(selectWei==1)
     month--;if(month<1)month=12;
      if(selectWei==2)
    day--; if(day<1)day=get_month();
      if(selectWei==3)
        MinusmodifyWeek() ;
      if(selectWei==4)
    shi--; if(shi==-1)shi=23;
      if(selectWei==5)
     fen--; if(fen==-1)fen=59;
      if(selectWei==6)
     miao--; if(miao==-1)miao=59;
}

void ShowModifyDate()//显示日期
{
     if(selectWei==0)
     write_diyihang(2,year);
      if(selectWei==1)
     write_diyihang(5,month);
      if(selectWei==2)
     write_diyihang(8,day);
      if(selectWei==3)
                     ;
      if(selectWei==4)
     write_sfm(4,shi);
      if(selectWei==5)
     write_sfm(7,fen);
      if(selectWei==6)
     write_sfm(10,miao);
}

void WeiSelect(uchar wei) //显光标
{
       switch(wei)
  { 
   case 0: write_com(0x80+0x01+4);break;
   case 1: write_com(0x80+0x01+7);break;
   case 2: write_com(0x80+0x01+10);break;
   case 3: write_com(0x80+0x01+14);break;
   case 4: write_com(0x80+0x40+6);break;
   case 5:write_com(0x80+0x40+9);break;
   case 6: write_com(0x80+0x40+12);break;
  }     
}

void keyscan()
{
    //矩阵键盘当独立键盘用
    if(s1==0)//按下键盘    暂停
    {
        delay(5);//延时消抖
        if(s1==0)//再判断确实为0
        {    
            while(!s1);//等待松手                 
                TR0=0;//关定时器
                write_com(0x0f);
                WeiSelect(selectWei+1);    
                selectWei++;
                 if(selectWei==7)selectWei=0;
                 
        }
    }

    if(s2==0)//按下键盘     继续 加时间
    {
        delay(5);//延时消抖
        if(s2==0)//再判断确实为0
        {                        
             while(!s2);                        
            {addModifyDate();
            ShowModifyDate();}                                
        }
    }

        if(s3==0)//按下键盘     继续  减少时间
    {
        delay(5);//延时消抖
        if(s3==0)//再判断确实为0
        {        
           while(!s3);                        
            {MinusModifyDate();
            ShowModifyDate();}                            
        }
    }

    if(s4==0)//按下键盘     继续 
    {
        delay(5);//延时消抖
        if(s4==0)//再判断确实为0
        {    
            while(!s4);//等待松手            
                TR0=1;//开定时器
                selectWei=-1;
               write_com(0x0c);                            
        }
    }
}

void write_week() ///显示星期

           uchar  num1=0;
           write_com(0x80+11);
         for(weekSelect;num1<4;weekSelect++)
        {
            write_date(tableWeek[weekSelect]);
            delay(5);num1++;
        }
        if(weekSelect==16)weekSelect=0;
}

void init()
{
    uchar num;
    selectDate=0;
    selectWei =-1;
    dula=0;
    wela=0;
    lcden=0;
    wr=0;
    fen=0;
    miao=0;
    shi=0;
    month=1;
    year=0;
    day=1;
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
    write_com(0x80+0x01);

       for(num=0;num<4;num++)
        {
            write_date(tableYear[num]);
            delay(5);
        }
        for(num=0;num<3;num++)
        {
            write_date(tableMonth[num]);
            delay(5);
        }
        for(num=0;num<3;num++)
        {
            write_date(tableDay[num]);
            delay(5);
        }
        for(weekSelect=0;weekSelect<4;weekSelect++)
        {
            write_date(tableWeek[weekSelect]);
            delay(5);
        }

        write_com(0x80+0x44);
        for(num=0;num<12;num++)
        {
            write_date(tableTime[num]);
            delay(5);
        }

    TMOD=0x01; //00000001
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;//50000*1us=50ms
    EA=1;
    ET0=1;
    TR0=1;
}

void main()
{
    init();
    while(1)
    {
        keyscan();
        
    }
}

void timer0() interrupt 1
{
    TH0=(65536-50000)/256; //50000*1us=50ms
    TL0=(65536-50000)%256;
    count++;
     if(count==18)
        {
            count=0;
            miao++;
            if(miao==60)
            {
                miao=0;                               
                fen++;
                if(fen==60)
                {
                    fen=0;
                    shi++;
                        fengming=0;
                        delay(2);
                        fengming=1;
                        delay(2);
                    if(shi==24)
                    {
                        shi=0;
                        day++;
                        write_week();
                        if(day>get_month())
                        {
                          day=1;
                          month++;
                            if(month>12)
                            {
                               month=1;
                               year++;
                               write_diyihang(2,year);
                            }
                             write_diyihang(5,month);
                         }
                         write_diyihang(8,day);
                    }
                    write_sfm(4,shi);
                }
                write_sfm(7,fen);
            }
            write_sfm(10,miao);
            
        }    
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值