zhulinshenchu 发表于 2012-2-18 17:04:46

年月日可调时钟星期可调

年月日可调时钟星期可调
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 2012-02-00 ";
uchar code table1[]="    00:00:00";
sbit rs=P2^5;//设置rs端
sbit en=P2^7;//设置en
sbit d1=P2^6;//设置
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
uchar num;
uchar count,num,s1num,zhou=7,w;
char shi,fen,miao,nian,yue,ri;
void delay(uchar z)//1ms延时程序
{
uchar x,y;
for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void write_com(uchar com)//1602写入命令子程序
{
rs=0;//rs为低电平
en=0;//en为低
P0=com;//写入命令
delay(2);//延时
en=1;//en高脉冲读入命令
delay(1);
en=0;
}
void write_date(uchar date)//1602写入数据子程序
{
rs=1;//rs为高电平写入疏浚
en=0;//en为低电平
P0=date;//读入数据
delay(2);//延时
en=1;//en高脉冲读入数据
delay(2);
en=0;
}
void init()//初始化子程序
{
en=0;
d1=0;//d1为低时钟向1602写入数据
write_com(0x38);
write_com(0x0c);//开显示关光标
write_com(0x06);//光标加1
write_com(0x01);//清屏
write_com(0x80);//初始化光标位置
for(num=0;num<15;num++)//判断是否显示完
       {
          write_date(table);//写入要显示数据
              delay(2);//延时
       }
write_com(0x80+0x40);//调整光标位置指向下一行
for(num=0;num<12;num++)//判断是否显示完
       {
          write_date(table1);//写入要显示数据
              delay(2);//延时
       }
TMOD=0x01;//定时器中断0方式1
TH0=(65536-46000)/256;//付初值
TL0=(65536-46000)%256;
EA=1;//开总中断
ET0=1;//开t0中断
TR0=1;//启动t0
}
void write_sfm(uchar add,uchar date)//写入时、分、秒子函数
{
uchar shi,ge;//将date拆分成两个数
shi=date/10;//date十位数
ge=date%10;//date的个位数
write_com(0x80+0x40+add);//写入date的地址
write_date(0x30+shi);//写入date十位数
write_date(0x30+ge);//写入date个位数
}
void write_zhou(uchar n)
{
write_com(0x80+13);//写入date的地址
write_date(0x30+n);//写入date十位数
}
void write_nyr(uchar ad,uchar da)
{
uchar sh,g;//将date拆分成两个数
sh=da/10;//date十位数
g=da%10;//date的个位数
write_com(0x80+ad);//写入date的地址
write_date(0x30+sh);//写入date十位数
write_date(0x30+g);//写入date个位数
}
void keyscan()//按键扫描子程序
{
if(s1==0)//判断s1是否按下
{
    delay(5);//延时消抖
       if(s1==0)//s1确实按下
                       {
                                   s1num++;//s1按下次数加1
                                        while(!s1);//松手检测
                                       if(s1num==1)//s1按下1次,进入秒调模式
                                                {
                                                        TR0=0;//关t0时钟停跑
                                                        write_com(0x80+0x40+11);//光标指在秒
                                                        write_com(0x0f);//光标闪烁
                                                }
                                       if(s1num==2)//s1按下2次,进入分调模式
                                                {
                                                        write_com(0x80+0x40+8);//光标指在分
                                                }
                                         if(s1num==3)//s1按下3次,进入时调模式
                                                {
                                                        write_com(0x80+0x40+5);//光标指在时
                                                }
                                       if(s1num==4)//s1按下1次,进入秒调模式
                                                {
                                                        write_com(0x80+9);//光标指在秒
                                                }
                                       if(s1num==5)//s1按下2次,进入分调模式
                                                {
                                                        write_com(0x80+6);//光标指在分
                                                }
                                         if(s1num==6)//s1按下3次,进入时调模式
                                                {
                                                        write_com(0x80+3);//光标指在时
                                                }
                                         if(s1num==7)//s1按下3次,进入时调模式
                                                {
                                                        write_com(0x80+13);//光标指在时
                                                }
                                       if(s1num==8)//s1按下4次,时钟恢复
                                                {
                                                        TR0=1;//开t0
                                                        s1num=0;//s1按下次数清零
                                                        write_com(0x80+0x40+11);//光标复位
                                                        write_com(0x0c);//光标不闪烁
                                                }
                       }
   }
        if(s1num!=0)//s1被按下
       {                       
                          if(s2==0)//s2是否按下?
                          {
                          delay(5);
                                       if(s2==0)//s2按下进入加调模式
                                       {
                                           while(!s2);//松手检测
                                                        if(s1num==1)//s1被按下1次,调秒。
                                                                        {
                                                                                  miao++;
                                                                                  if(miao==60)//秒是否溢出
                                                                                                  {
                                                                                                  miao=0;//清零
                                                                                                       fen++;//同时分加1
                                                                                                               if(fen==60)//分溢出?
                                                                                                                               {
                                                                                                                                   fen=0;//清零
                                                                                                                                        shi++;//时加1
                                                                                                                                                        if(shi==24)//时溢出
                                                                                                                                                                {
                                                                                                                                                                   shi=0;//清零
                                                                                                                                                                }
                                                                                                                                   write_sfm(4,shi);//写入时位数
                                                                                                                                        write_com(0x80+0x40+4);//光标指在时
                                                                                                                               }
                                                                                                                write_sfm(7,fen);//写入分位数
                                                                                                                write_com(0x80+0x40+7);//光标指在分
                                                                                                  }
                                                                                  write_sfm(10,miao);//写入秒位数
                                                                                  write_com(0x80+0x40+10);//光标指在秒
                                                                                }
                                                        if(s1num==2)//进入分调模式
                                                                        {
                                                                                   fen++;
                                                                                                  if(fen==60)
                                                                                                  {
                                                                                                                  fen=0;
                                                                                                                       shi++;
                                                                                                                               if(shi==24)
                                                                                                                                       {
                                                                                                                                                   shi=0;
                                                                                                                                       }
                                                                                                                          write_sfm(4,shi);
                                                                                                                          write_com(0x80+0x40+4);
                                                                                                  }
                                                                                  write_sfm(7,fen);
                                                                                  write_com(0x80+0x40+7);
                                                                        }
                                                        if(s1num==3)//进入时调模式
                                                                {
                                                                  shi++;
                                                                          if(shi==24)
                                                                                  {
                                                                                  shi=0;
                                                                                  }
                                                                  write_sfm(4,shi);
                                                                  write_com(0x80+0x40+4);
                                                                }
                                                        if(s1num==4)//s1被按下1次,调秒。
                                                                        {
                                                                                  ri++;
                                                                                  if(ri==31)//秒是否溢出
                                                                                                  {
                                                                                                  ri=1;//清零
                                                                                                       yue++;//同时分加1
                                                                                                               if(yue==13)//分溢出?
                                                                                                                               {
                                                                                                                                   yue=1;//清零
                                                                                                                                        nian++;//时加1
                                                                                                                                                        if(nian==10)//时溢出
                                                                                                                                                                {
                                                                                                                                                                   nian=0;//清零
                                                                                                                                                                }
                                                                                                                                   write_nyr(3,nian);//写入时位数
                                                                                                                                        write_com(0x80+3);//光标指在时
                                                                                                                               }
                                                                                                                write_nyr(6,yue);//写入分位数
                                                                                                                write_com(0x80+6);//光标指在分
                                                                                                  }
                                                                                  write_nyr(9,ri);//写入秒位数
                                                                                  write_com(0x80+9);//光标指在秒
                                                                                }
                                                        if(s1num==5)//进入分调模式
                                                                        {
                                                                                   yue++;
                                                                                                  if(yue==13)
                                                                                                  {
                                                                                                     yue=1;
                                                                                                                       nian++;
                                                                                                                               if(nian==10)
                                                                                                                                       {
                                                                                                                                                   nian=0;
                                                                                                                                       }
                                                                                                                          write_nyr(3,nian);
                                                                                                                          write_com(0x80+3);
                                                                                                  }
                                                                                  write_nyr(6,yue);
                                                                                  write_com(0x80+6);
                                                                        }
                                                        if(s1num==6)//进入时调模式
                                                                {
                                                                  nian++;
                                                                          if(nian==10)
                                                                                  {
                                                                                  nian=0;
                                                                                  }
                                                                  write_nyr(3,nian);
                                                                  write_com(0x80+3);
                                                                }
                                                        if(s1num==7)//进入时调模式
                                                                {
                                                                  w++;
                                                                          if(w==8)
                                                                                  {
                                                                                  w=1;
                                                                                  }
                                                                  write_zhou(w);
                                                                  write_com(0x80+13);
                                                                }
                                               }
                          }
         if(s3==0)//s3按下?
                                          {
                                          delay(5);
                                               if(s3==0)//s3按下进入减调模式
                                                                {
                                                                   while(!s3);//松手检测
                                                                       if(s1num==1)//秒调
                                                                                        {
                                                                                          miao--;
                                                                                         if(miao==-1)
                                                                                                  {
                                                                                                     miao=59;
                                                                                                          fen--;
                                                                                                           if(fen==-1)
                                                                                                                {
                                                                                                                  fen=59;
                                                                                                                  shi--;
                                                                                                                   if(shi==-1)
                                                                                                                        {
                                                                                                                          shi=23;
                                                                                                                        }
                                                                                                   write_sfm(4,shi);
                                                                                                   write_com(0x80+0x40+4);
                                                                                                                }
                                                                                                write_sfm(7,fen);
                                                                                                write_com(0x80+0x40+7);
                                                                                                  }
                                                                                          write_sfm(10,miao);
                                                                                          write_com(0x80+0x40+10);
                                                                                        }
                                                                       if(s1num==2)//分调
                                                                                       {
                                                                                          fen--;
                                                                                         if(fen==-1)
                                                                                                  {
                                                                                                  fen=59;
                                                                                                       shi--;
                                                                                                          if(shi==-1)
                                                                                                          shi=23;
                                                                                                write_sfm(4,shi);
                                                                                                write_com(0x80+0x40+4);
                                                                                                  }
                                                                                          write_sfm(7,fen);
                                                                                          write_com(0x80+0x40+7);
                                                                                        }                                       
                                                                         if(s1num==3)//时调
                                                                                        {
                                                                                          shi--;
                                                                                          if(shi==-1)
                                                                                                   shi=23;
                                                                                              write_sfm(4,shi);
                                                                                              write_com(0x80+0x40+4);
                                                                                        }
                                                                       if(s1num==4)//秒调
                                                                                        {
                                                                                       ri--;
                                                                                         if(ri==0)
                                                                                                  {
                                                                                                     ri=30;
                                                                                                          yue--;
                                                                                                           if(yue==0)
                                                                                                                {
                                                                                                               yue=12;
                                                                                                                  nian--;
                                                                                                                   if(nian==-1)
                                                                                                                        {
                                                                                                                          nian=9;
                                                                                                                        }
                                                                                                   write_nyr(3,nian);
                                                                                                   write_com(0x80+3);
                                                                                                                }
                                                                                                write_nyr(6,yue);
                                                                                                write_com(0x80+6);
                                                                                                  }
                                                                                          write_nyr(9,ri);
                                                                                          write_com(0x80+9);
                                                                                        }
                                                                       if(s1num==5)//分调
                                                                                       {
                                                                                       yue--;
                                                                                         if(yue==0)
                                                                                                  {
                                                                                                  yue=12;
                                                                                                       nian--;
                                                                                                          if(nian==-1)
                                                                                                          nian=9;
                                                                                                write_nyr(3,nian);
                                                                                                write_com(0x80+3);
                                                                                                  }
                                                                                          write_nyr(6,yue);
                                                                                          write_com(0x80+6);
                                                                                        }                                       
                                                                         if(s1num==6)//时调
                                                                                        {
                                                                                       nian--;
                                                                                          if(nian==-1)
                                                                                                   nian=9;
                                                                                              write_nyr(3,nian);
                                                                                              write_com(0x80+3);
                                                                                        }
                                                                         if(s1num==7)//时调
                                                                                        {
                                                                                       w--;
                                                                                          if(w==0)
                                                                                                   w=7;
                                                                                              write_zhou(w);
                                                                                              write_com(0x80+13);
                                                                                        }
                               
                                                               }
                                }

        }
}
void main()
{
init();//初始化程序
while(1)
{
keyscan();

}
}
void time0() interrupt 1//定时器t0中断程序
{
TH0=(65536-46000)/256;
TL0=(65536-46000)%256;
count++;
    if(count==20)//是否到1s
       {
           count=0;//清时间标志位
                miao++;//秒数加1
                if(miao==60)//秒是否溢出
                {
                  miao=0;//清零
                  fen++;//分数加1
                  if(fen==60)//分溢出?
                          {
                          fen=0;//分数清零
                               shi++;//小时数加1
                                  if(shi==24)//小时数溢出
                                       {
                                           zhou++;
                                                w=zhou%7;
                                                if(w==0)
                                                        {
                                                          write_zhou(7);
                                                        }
                                                else
                                                   {
                      write_zhou(w);
                                                        }
                                           shi=0;//小时数清零
                            ri++;
                                               if(ri==30)
                                                        {
                                                          ri=0;
                                                          yue++;
                                                           if(yue==13)
                                                                          {
                                                                             yue=1;
                                                                                  nian++;
                                                                                       if(nian==10)
                                                                                               {
                                                                                                   nian=0;
                                                                                               }
                                                                        write_nyr(3,nian);
                                                                           }
                                                        write_nyr(6,yue);
                                                     }
                                          write_nyr(9,ri);
                                     }
                          write_sfm(4,shi);//秒位写入新数据
                  }
                  write_sfm(7,fen);//分位写入新数据
                }
                write_sfm(10,miao);//时位写入新数据
       }
}
页: [1]
查看完整版本: 年月日可调时钟星期可调