找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3024|回复: 1
收起左侧

各位大侠,帮帮忙,下面的程序怎么加几个闹钟,现在只有一个,谢谢

[复制链接]
ID:55629 发表于 2013-10-5 22:29 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 2013-09-23 MON";                          //设定开始显示的时间
uchar code table1[]="    00:00:01";
uchar code table2[7][3]= {{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};          //定义二维字符数组
sbit wr=P1^1;                                   //           1602液晶的读/写端
sbit lcden=P1^2;                           //           1602液晶使能端
sbit lcdrs=P1^0;                           //                1602液晶命令/数据端   
sbit key1=P3^2;                                   //                声明s1按键时间调整
sbit key2=P3^3;                                          //         声明s2按键+1
sbit key3=P3^4;                                          //         声明s3按键-1
sbit key4=P3^5;                                          //         声明s4按键闹钟调整
sbit beep=P1^4;                                          //         声明蜂鸣器
uchar num1,shi=00,fen=00,miao=01,yue=9,ri=23,shi1,fen1,miao1,keynum1,week;                                //定义时分秒变量
uint nian=2013;                                                   //定义年变量
void delayms(uint x)                                               
{
        uint i,j;
        for(i=x;i>0;i--)                                           //定义带参数延时函数
                for(j=110;j>0;j--);
}
        void write_com(uchar com)                                 //1602液晶写指令函数
        {        wr=0;
                lcdrs=0;
                P0=com;
                delayms(1);
                lcden=1;
                delayms(1);
              lcden=0;
                       
        }
        void write_date(uchar date)                                                   //1602液晶写数据函数
        {           wr=0;
                lcdrs=1;
                P0=date;
                delayms(1);
                lcden=1;
                delayms(1);
                lcden=0;
               
        }
                       
                        void write_addate1(uchar add,uint date)                                //定义显示年的函数
                {                uint qian;
                        uchar bai,shi,ge;
                        qian=date/1000;
                        bai=date%1000/100;
                        shi=date%1000%100/10;
                        ge=date%10;
                        write_com(add+0x80);
                        write_date(0x30+qian);
                        write_date(0x30+bai);
                        write_date(0x30+shi);
                        write_date(0x30+ge);
                }
                        void write_addate2(uchar add,uchar date)                                //定义显示月、日、时、分、秒函数
                {
                        uchar shi,ge;
                        shi=date/10;
                        ge=date%10;
                        write_com(add+0x80);
                        write_date(0x30+shi);
                        write_date(0x30+ge);
                }
                void write_rq(uchar i)                                                                                   //定义显示星期的函数
                {         uchar x;
                        for(x=0;x<3;x++)
                                {        write_date(table2[i][x]);
                                        delayms(1);
                                }       
                }                       
                                       
                       
                void init ()                                                                                 //定义初始化函数
                {                                                                                                                                                                                            
                   TMOD=0x01;                                                                                 //          定时器0工作方式为11.0592M晶振 16位
                        TH0=(65536-45566)/256;                                                          //   装初值
                        TL0=(65536-45566)%256;
                        EA=1;                                                                                          //          开总中断
                        ET0=1;                                                                                           //        开定时器0中断
                        write_com(0x38);                                                                   // 设置16*2显示,5*7点阵,8位数据口
                        write_com(0x06);                                                                   // 写一个字符后地址指针加1
                        write_com(0x0c);                                                                   //        设置开显示,不显示光标
                        write_com(0x01);                                                                   //           显示清0,数据清0
                        write_com(0x80);                                                                   //   使指针指向第1行第1列
                }
                void keyscan()                                                                                    // 定义按键函数
                {       
                        uchar keynum;
                        if(key1==0)                           //s1按键被按下
                                {        delayms(3);                                 //去抖延时
                                        if(key1==0)                                   //确认s4按键被按下,进入调时间模式
                                                {
                                                        keynum++;
                                                        while(!key1);                            //松手检测
                                                }
                                        if(keynum==1)                                                 //s1按下一次
                                        {        TR0=0;                                                         //关闭定时器0
                                                write_com(0x81);                                  //指针指向第1行2列
                                                write_com(0x0f);                                   //开启光标显示,光标闪烁
                                        }
                                        if(keynum==2)                                               
                                        {
                                                write_com(0x86);                                         //光标跳到月份
                                        }
                                        if(keynum==3)                                                          
                                        {                                                                                                                       
                                                write_com(0x89);                                        //光标跳到日
                                           }
                                         if(keynum==4)
                                         {
                                                 write_com(0x8c);                                         //光标跳到星期
                                      }
                                          if(keynum==5)
                                         {
                                                 write_com(0xc4);                                         //光标跳到时
                                      }
                                         if(keynum==6)
                                         {
                                           write_com(0xc7);                                                 //光标跳到分
                                         }
                                         if(keynum==7)
                                         {
                                                 write_com(0xca);                                         //光标跳到秒
                                      }
                                       if(keynum==8)
                                         {        keynum=0;                                                           //退出调时间模式
                                                 TR0=1;                                                                   //开启定时器0
                                                 write_com(0x0c);                                            //关闭光标显示
                                      }

                                 }
                                          if(keynum)                                                                 //当进入调时间模式时
                                           {
                                                   if(key2==0)                                                          //s2按键按下
                                                 {
                                                         delayms(3);                                                           //去抖延时
                                                        if(key2==0)
                                                        {
                                                                 if(keynum==1)                                            
                                                                         {                                                         
                                                                            nian++;                                          //s2每按下一次年份加1
                                                                                if(nian==10000)                          //  加满清0
                                                                                nian=0;
                                                                                write_addate1(1,nian);         //         显示年份
                                                                                write_com(0x81);                 //写完数据指针指向年份原来位置
                                                                         }
                                                                   if(keynum==2)
                                                                         {               
                                                                                    yue++;                                 //s2每按下一次月份加1
                                                                                if(yue==13)
                                                                                          yue=0;                                   //加满清0
                                                                                write_addate2(6,yue);          //显示月份
                                                                                write_com(0x86);                  //写完数据指针指向月份原来位置
                                                                         }
                                                                                         if(keynum==3)
                                                                                         {        ri++;
                                                                                                if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)   //1,3,5,7,8,10,12月有31天
                                                                                                        if(ri==32)                                                            //加满还原
                                                                                                        ri=1;
                                                                                                        if(yue==4||yue==6||yue==9||yue==11)                //4,6,9,11月有30天
                                                                                                                if(ri==31)
                                                                                                                ri=1;
                                                                                                        if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))                //闰年2月有30天
                                                                                                                if(ri==30)
                                                                                                                ri=1;
                                                                                                        if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))           //非闰年2月有31天
                                                                                                                if(ri==29)
                                                                                                                ri=1;       
                                                                                                write_addate2(9,ri);                   //显示日
                                                                                           write_com(0x89);                           //写完数据指针指向日原来位置
                                                                                         }
                                                                                 if(keynum==4)
                                                                                 {
                                                                                         week++;                                                   //s2每按下一次星期加1
                                                                                        if(week==7)                                                    //加满还原
                                                                                                week=0;
                                                                                         write_rq(week);                                    //显示星期
                                                                                        write_com(0x8c);                                    //写完数据指针指向星期原来位置
                                                                                 }
                                                                                 
                                                                                                  if(keynum==5)
                                                                                                 {       
                                                                                                         shi++;                                          //s2每按下一次时加1
                                                                                                        if(shi==24)
                                                                                                          shi=0;                                           //加满还原
                                                                                                        write_addate2(0x44,shi);   //显示时
                                                                                                        write_com(0xc4);                   //写完数据指针指向时原来位置
                                                                                                 }
                                                                                                 if(keynum==6)                                         
                                                                                                 {               
                                                                                                                 fen++;                                         //s2每按下一次分加1
                                                                                                                if(fen==60)
                                                                                                                  fen=0;                                          //加满还原
                                                                                                                write_addate2(0x47,fen);  //显示分
                                                                                                                write_com(0xc7);                  //写完数据指针指向分原来位置
                                                                                                 }
                                                                               
                                                                                                 if(keynum==7)
                                                                                                 {               
                                                                                                    miao++;                                                   //s2每按下一次秒加1
                                                                                                        if(miao==60)
                                                                                                          miao=0;                                                         //加满还原
                                                                                                        write_addate2(0x4a,miao);           //显示秒
                                                                                                        write_com(0xca);                          //写完数据指针指向秒原来位置
                                                                                                 }

                                                                                               
                                                                         while(!key2);                                                         //松手检测
                                                         }         
                                                 }
                                                                               
                                                    if(key3==0)                                                                       
                                                 {                
                                                         delayms(3);
                                                        if(key3==0)       
                                                          {                                                                                           //s3按下时减1
                                                                if(keynum==1)
                                                                         {       
                                                                                nian--;
                                                                                if(nian==-1)
                                                                                        nian=9999;
                                                                                write_addate1(1,nian);
                                                                                write_com(0x81);
                                                                        }       
                                                                          if(keynum==2)
                                                                                 {        yue--;
                                                                                        if(yue==-1)
                                                                                                  yue=12;
                                                                                        write_addate2(6,yue);
                                                                                        write_com(0x86);
                                                                                }
                                                                             if(keynum==3)
                                                                         {       
                                                                                        ri--;
                                                                                if(ri==0)               
                                                                                {        if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
                                                                                                ri=31;
                                                                                        if(yue==4||yue==6||yue==9||yue==11)
                                                                                                ri=30;
                                                                                        if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))
                                                                                                ri=29;
                                                                                        if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))
                                                                                                ri=28;       
                                                                                 }
                                                                                        write_addate2(9,ri);               
                                                                                   write_com(0x89);
                                                                        }
                                                                       
                                                                                 if(keynum==4)
                                                                            {       
                                                                                        week--;
                                                                                        if(week==-1)
                                                                                        week=6;
                                                                                 write_rq(week);       
                                                                                write_com(0x8c);
                                                                          }
                                                                       
                                                                                  if(keynum==5)
                                                                                 {       
                                                                                         shi--;
                                                                                        if(shi==-1)
                                                                                          shi=23;
                                                                                        write_addate2(0x44,shi);
                                                                                        write_com(0xc4);
                                                                                 }
                                                                                 if(keynum==6)
                                                                                 {       
                                                                                         fen--;
                                                                                        if(fen==-1)
                                                                                          fen=59;
                                                                                        write_addate2(0x47,fen);
                                                                                        write_com(0xc7);
                                                                                  }
                                                                                if(keynum==7)
                                                                                 {       
                                                                                        miao--;
                                                                                        if(miao==-1)
                                                                                          miao=59;
                                                                                        write_addate2(0x4a,miao);
                                                                                        write_com(0xca);
                                                                                }
                                                                         while(!key3);                                                           //松手检测
                                                         }
                                }                                       
                        }       
                                                                               
                                                                        if(key4==0)                                                          //s4被按下进入调闹钟模式
                                                                        {  delayms(3);
                                                                                if(key4==0)
                                                                                        {       
                                                                                                keynum1++;       
                                                                                                while(!key4);
                                                                                        }
                                                                                                   if(keynum1==1)                               
                                                                                                 {        write_com(0x01);                //清屏,指针清0
                                                                                                         write_com(0xc6);                //在时分之间显示“:”
                                                                                                         write_date(':');
                                                                                                        write_com(0xc9);                        //在分秒之间显示“:”
                                                                                                        write_date(':');
                                                                                                         write_com(0x0f);                 //开启光标
                                                                                                         write_com(0xc4);                 //光标指向时
                                                                                              }
                                                                                                 if(keynum1==2)
                                                                                                 {
                                                                                                   write_com(0xc7);                                  //光标指向分
                                                                                                 }
                                                                                                 if(keynum1==3)
                                                                                                 {
                                                                                                         write_com(0xca);                          //光标指向秒
                                                                                              }
                                                                                               if(keynum1==4)
                                                                                                 {        keynum1=0;
                                                                                                         write_com(0x0c);                  //关闭光标
                                                                                              }

                                                                        }
                                                                                        if(keynum1)
                                                                                   {
                                                                                           if(key2==0)                                          //s2按下加1
                                                                                         {
                                                                                                 delayms(3);       
                                                                                                if(key2==0)
                                                                                                {
                                                                                                    if(keynum1==1)
                                                                                                 {       
                                                                                                         shi1++;
                                                                                                        if(shi1==24)
                                                                                                          shi1=0;
                                                                                                        write_addate2(0x44,shi1);
                                                                                                        write_com(0xc4);
                                                                                                 }
                                                                                                 if(keynum1==2)
                                                                                                         {               
                                                                                                                 fen1++;
                                                                                                                if(fen1==60)
                                                                                                                  fen1=0;
                                                                                                                write_addate2(0x47,fen1);
                                                                                                                write_com(0xc7);
                                                                                                         }
                                                                               
                                                                                                 if(keynum1==3)
                                                                                                 {               
                                                                                                    miao1++;
                                                                                                        if(miao1==60)
                                                                                                          miao1=0;
                                                                                                        write_addate2(0x4a,miao1);
                                                                                                        write_com(0xca);
                                                                                                 }
                                                                                                 while(!key2);
                                                                                      }
                                                                                  }
                                                                                                  if(key3==0)                          //s3每按一次减1
                                                                                                 {                
                                                                                                         delayms(3);
                                                                                                        if(key3==0)       
                                                                                                          {       
                                                                                                         if(keynum1==1)
                                                                                                                 {       
                                                                                                                         shi1--;
                                                                                                                        if(shi1==-1)
                                                                                                                          shi1=23;
                                                                                                                        write_addate2(0x44,shi1);
                                                                                                                        write_com(0xc4);
                                                                                                                 }
                                                                                                                         if(keynum1==2)
                                                                                                                         {       
                                                                                                                                 fen1--;
                                                                                                                                if(fen1==-1)
                                                                                                                                  fen1=59;
                                                                                                                                write_addate2(0x47,fen1);
                                                                                                                                write_com(0xc7);
                                                                                                                          }
                                                                                                                        if(keynum1==3)
                                                                                                                         {       
                                                                                                                                miao1--;
                                                                                                                                if(miao1==-1)
                                                                                                                                  miao1=59;
                                                                                                                                write_addate2(0x4a,miao1);
                                                                                                                                write_com(0xca);
                                                                                                                        }
                                                                                                                        while(!key3);                                                //松手检测
                                                                                                           }
                                                                                          }       

                                                                                                                                                                                   
                                                                                   }          
                }                                  
                                                    


                void main()                                  
                {                uchar num;
                                init();
                                for(num=0;num<15;num++)
                                { write_date(table[num]);
                                        delayms(5);
                                }                                                                         //显示初始时间
                                write_com(0xc0);
                                for(num=0;num<12;num++)
                                { write_date(table1[num]);
                                        delayms(5);
                                }
                                          TR0=1;        //开启定时器0
                        while(1)
                        {       
                           if(shi==shi1&&fen==fen1&&miao==miao1)                                   //闹钟到了蜂鸣器响
                                        beep=0;
                 if(shi==shi1&&fen==fen1&&miao==miao1+30)                                   //闹钟到了蜂鸣器响
                                        beep=1;
                       
                                keyscan();                                 //扫描键盘
                        }                                               

                 }
                  
                   void time() interrupt  1                                 //中断函数
                   {
                           TH0=(65536-45566)/256;
                                TL0=(65536-45566)%256;                         //进入中断装初值
                                num1++;
                                if(num1==20)                                           //一秒到了
                                        { num1=0;                                           //清0
                                          miao++;
                                          if(miao==60)                                         //一分到了
                                                   { miao=0;        fen++;        }
                                                  if(!keynum1)        write_addate2(0x4a,miao);                   //当调闹钟模式按下时不显示当前时间
                                                        if(fen==60)
                                                        { fen=0;
                                                           shi++;
                                                        }
                                                          if(!keynum1)         write_addate2(0x47,fen);           //当调闹钟模式按下时不显示当前时间
                                                                if(shi==24)
                                                                {
                                                                        shi=0;
                                                                        ri++;
                                                                        week++;
                                                                }
                                                                 if(!keynum1)         write_addate2(0x44,shi);           //当调闹钟模式按下时不显示当前时间
                                                                        if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
                                                                                if(ri==32)
                                                                        {        ri=1;        yue++;        }
                                                                                if(yue==4||yue==6||yue==9||yue==11)
                                                                                        if(ri==31)
                                                                                {        ri=1;         yue++; }
                                                                                if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))
                                                                                        if(ri==30)
                                                                                {        ri=1;          yue++;        }
                                                                                if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))
                                                                                        if(ri==29)
                                                                                {        ri=1;          yue++;        }
                                                                         if(!keynum1)                          write_addate2(9,ri);                     //当调闹钟模式按下时不显示当前时间
                                                                                               
                                                                                                        if(week==7)
                                                                                                                week=0;
                                                                                                 if(!keynum1)                                                     //当调闹钟模式按下时不显示当前时间
                                                                                                         {        write_com(0x8c);
                                                                                                                 write_rq(week);
                                                                                                        }                
                                                                                                if(yue==13)
                                                                                                {        yue=0;                  
                                                                                                        nian++;
                                                                                                }
                                                                                 if(!keynum1)                                                            //当调闹钟模式按下时不显示当前时间
                                                                                  {       
                                                                                                 write_addate2(6,yue);
                                                                                                write_com(0x88);
                                                                                                write_date('-');
                                                                                  }
                                                                                               
                                                                                        if(nian==10000)
                                                                                                   nian=0;       
                                                                                 if(!keynum1)
                                                                                  {        write_addate1(1,nian);                                   //当调闹钟模式按下时不显示当前时间
                                                                                         write_com(0x85);
                                                                                    write_date('-');         
                                                                                }
                                                                                 
                                                }                               
                        }                                                            
       
                                             
                                          


回复

使用道具 举报

ID:52286 发表于 2013-10-13 23:47 | 显示全部楼层
支持支持!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表