搜索
bottom↓
回复: 0

年月日可调时钟星期可调

[复制链接]

出0入0汤圆

发表于 2012-2-18 17:04:46 | 显示全部楼层 |阅读模式
年月日可调时钟星期可调
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 2012-02-00 [U]";
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[num]);//写入要显示数据
                  delay(2);//延时
         }
write_com(0x80+0x40);//调整光标位置指向下一行
  for(num=0;num<12;num++)//判断是否显示完
         {
            write_date(table1[num]);//写入要显示数据
                  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);//时位写入新数据
         }
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 01:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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