搜索
bottom↓
回复: 11

帮帮我吧!小弟在做电子时钟遇到问题,求高手解围!!!

[复制链接]

出0入0汤圆

发表于 2012-10-29 16:45:26 | 显示全部楼层 |阅读模式
本帖最后由 739211964 于 2012-10-29 16:42 编辑

//液晶显示与时钟,及摁健的使用,遇到一个问题:主要是时间刷新时,二月(28、29)号、小月30号、大月31号没有变为1号,其他都好使。主要看定时器0中断1后的代码,求各路人才、高手帮忙,看看能不能把代码修改正确,临表涕零,不胜感激!!!(声明:小弟还没有用到ds12c887,只用到简单的定时器中断;还有,代码也是网上找的
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;

uchar count,s1num;
char shi,fen,miao,xq,nian,yue,ri;
uchar code table1[]="2012-10-31 SUN";
uchar code table2[]="   23:59:00";
                     //    周一周二 周三 周四周五 周六周日            
uchar code table3[]={0xff,0x4d,0x54,0x57,0x54,0x46,0x53,0x53};
                     //    M    T     W   T    F    S     S
uchar code table4[]={0xff,0x4f,0x55,0x45,0x48,0x52,0x41,0x55};
                    //     O    U     E   H    R     A    U
uchar code table5[]={0xff,0x4e,0x45,0x44,0x55,0x49,0x54,0x4e};
                    //     N    E     D   U    I     T    N
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

void write_com(uchar com)
{
  lcdrs=0;
  lcdrw=0;
  lcden=0;
  delay(5);
  P1=com;
  lcden=1;
  delay(5);
  lcden=0;
}

void write_date(uchar date)
{
  lcdrs=1;
  lcdrw=0;
  lcden=0;
  delay(5);
  P1=date;
  lcden=1;
  delay(5);
  lcden=0;
}

void write_sfm(uchar add,uchar date)
{
  uchar shi,ge;
  shi=date/10;
  ge=date%10;
  write_com(0x80+0x40+add);
  write_date(0x30+shi);
  write_date(0x30+ge);
}

void write_nyrx(uchar add,uchar date)
{
  uchar shi,ge;
  shi=date/10;
  ge=date%10;
  write_com(0x80+add);
  write_date(0x30+shi);
  write_date(0x30+ge);
}
void init()
{
  uchar num;
  shi=23;
  fen=59;
  miao=55;
//  nian=2012;
  yue=10;
  ri=31;
  lcden=0;
  write_com(0x38);
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01);
  write_com(0x80);
  for(num=0;num<14;num++)
  {
    write_date(table1[num]);
    delay(5);
  }
  write_com(0x80+0x40);
  for(num=0;num<11;num++)
  {
    write_date(table2[num]);
    delay(5);
  }
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=1;
  ET0=1;
  TR0=1;
}
void keyscan()
{
  if(s1==0)
  {
    delay(5);
    if(s1==0)
    {
      s1num++;
      while(!s1);   //判断松手
      if(s1num==1)
      {
        TR0=0;                  //关闭定时器,让时间停住
        write_com(0x80+0x40+9);
        write_com(0x0f);
      }
      if(s1num==2)
      {
        write_com(0x80+0x40+6);
      }
      if(s1num==3)
      {
        write_com(0x80+0x40+3);
      }
      if(s1num==4)
      {
        write_com(0x80+11);
      }
      if(s1num==5)
      {
        write_com(0x80+8);
      }
      if(s1num==6)
      {
        write_com(0x80+5);
      }
      if(s1num==7)
      {
        write_com(0x80+2);
      }
      if(s1num==8)
      {
        s1num=0;
        write_com(0x0c);
        TR0=1;                //打开定时器,让时间行走
      }
    }
  }
  if(s1num!=0)
  {
    if(s2==0)            //功能键:加
    {  
      delay(5);
      if(s2==0)
      {
        while(!s2);
        if(s1num==1)
        {
          miao++;
          if(miao==60)
            miao=0;
          write_sfm(9,miao);
          write_com(0x80+0x40+9);
        }
        if(s1num==2)
        {
          fen++;
          if(fen==60)
            fen=0;
          write_sfm(6,fen);
          write_com(0x80+0x40+6);
        }
        if(s1num==3)
        {
          shi++;
          if(shi==24)
            shi=0;
          write_sfm(3,shi);
          write_com(0x80+0x40+3);
        }
        if(s1num==4)
        {
          xq++;
          if(xq==8)
            xq=0;
//          write_nyrx(9,xq);
            write_date(table3[xq]);
            write_date(table4[xq]);
            write_date(table5[xq]);
            write_com(0x80+11);
        }
        if(s1num==5)
        {
          ri++;
          if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
          {
            if(ri==32)
            ri=1;
          }
          else if(yue==4||yue==6||yue==9||yue==11)
          {
            if(ri>=31)
            ri=1;
          }
          else
          {
            if(nian%4==0)
            {
              if(ri>=30)
              ri=1;
            }
            else
            {
              if(ri>=29)
              ri=1;
            }
          }
          write_nyrx(8,ri);
          write_com(0x80+8);
        }
        if(s1num==6)
        {
          yue++;
          if(yue==13)
            yue=1;
          write_nyrx(5,yue);
          write_com(0x80+5);
        }
        if(s1num==7)
        {
          nian++;
          if(nian==100)
            nian=0;
          write_nyrx(2,nian);
          write_com(0x80+2);
        }
      }
    }
    if(s3==0)     //功能键:减
    {
      delay(5);
      if(s3==0)
      {
        while(!s3);
        if(s1num==1)
        {
          miao--;
          if(miao==-1)
            miao=59;
            write_sfm(9,miao);
            write_com(0x80+0x40+9);
        }
        if(s1num==2)
        {
          fen--;
          if(fen==-1)
            fen=59;
            write_sfm(6,fen);
            write_com(0x80+0x40+6);
        }
        if(s1num==3)
        {
          shi--;
          if(shi==-1)
            shi=23;
            write_sfm(3,shi);
            write_com(0x80+0x40+3);
        }
        if(s1num==4)
        {
          xq--;
          if(xq==0)
            xq=7;
          write_date(table3[xq]);
          write_date(table4[xq]);
          write_date(table5[xq]);
          write_com(0x80+11);
        }
        if(s1num==5)
        {
          ri--;
          if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
          {
            if(ri==0)
            ri=31;
          }
          else if(yue==4||yue==6||yue==9||yue==11)
          {
            if(ri==0)
            ri=30;
          }
          else
          {
            if(nian%4==0)
            {
              if(ri==0)
              ri=29;
            }
            else
            {
              if(ri==0)
              ri=28;
            }
          }
          write_nyrx(8,ri);
          write_com(0x80+8);
        }
        if(s1num==6)
        {
          yue--;
          if(yue==0)
            yue=12;
          write_nyrx(5,yue);
          write_com(0x80+5);
        }
        if(s1num==7)
        {
          nian--;
          if(nian==-1)
            nian=99;
          write_nyrx(2,nian);
          write_com(0x80+2);
        }
      }
    }
  }
}

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

void timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  count++;
  if(count==18)
  {
    count=0;
    miao++;
    if(miao==60)
    {
      miao=0;
      fen++;
      if(fen==60)
      {
        fen=0;
        shi++;
        if(shi==24)
        {
          shi=0;
          ri++;
         if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
          {
            if(ri==31)
            {
            ri=1;
            yue++;
            }
            xq++;
            if(xq==8)
            xq=1;
            if(yue==12)
            {
              yue=1;
              nian++;
              write_nyrx(2,nian);
            }
            write_nyrx(5,yue);
            write_com(0x80+11);
            write_date(table3[xq]);
            write_date(table4[xq]);
            write_date(table5[xq]);
          }
          else if(yue==4||yue==6||yue==9||yue==11)
          {
            if(ri==30)
            {
            ri=1;
            yue++;
            }
            xq++;
            if(xq==8)
            xq=1;
            if(yue==12)
            {
              yue=1;
              nian++;
              write_nyrx(2,nian);
            }
            write_nyrx(5,yue);
            write_com(0x80+11);
            write_date(table3[xq]);
            write_date(table4[xq]);
            write_date(table5[xq]);
     //       write_com(0x80+9);
          }
          else
          {
            if(nian%4==0)
            {
              if(ri==29)
              {
              ri=1;
              yue++;
              }
              xq++;
              if(xq==8)
              xq=1;
              if(yue==12)
              {
                yue=1;
                nian++;
                write_nyrx(2,nian);
              }
              write_nyrx(5,yue);
              write_com(0x80+11);
              write_date(table3[xq]);
              write_date(table4[xq]);
              write_date(table5[xq]);
       //       write_com(0x80+9);
            }
            else
            {
              if(ri==28)
              {
              ri=1;
              yue++;
              }
              xq++;
              if(xq==8)
              xq=1;
              if(yue==12)
              {
                yue=1;
                nian++;
                write_nyrx(2,nian);
              }
              write_nyrx(5,yue);
              write_com(0x80+11);
              write_date(table3[xq]);
              write_date(table4[xq]);
              write_date(table5[xq]);
     //         write_com(0x80+9);
            }
     }

          write_nyrx(8,ri);
        }
        write_sfm(3,shi);
      }
      write_sfm(6,fen);
    }
    write_sfm(9,miao);
  }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-29 16:48:02 | 显示全部楼层
那么多判断咋不用switch啊,看起来舒服点嘛

出0入0汤圆

 楼主| 发表于 2012-10-29 16:54:32 | 显示全部楼层
其实,这代码是我从网上找的,毕竟是新手,当时也没有想到那么多!

出0入0汤圆

发表于 2012-10-29 17:34:23 | 显示全部楼层
看着费劲

出0入0汤圆

发表于 2012-10-29 17:36:16 | 显示全部楼层
甚是费劲。。

出0入0汤圆

发表于 2012-10-29 21:48:33 | 显示全部楼层
费劲                                                                          

出0入0汤圆

发表于 2012-10-29 23:28:14 | 显示全部楼层
楼主的猴子头像好可爱

出0入0汤圆

发表于 2012-10-30 09:02:14 | 显示全部楼层
那么长那么乱的代码很少人帮你看的吧

出0入0汤圆

 楼主| 发表于 2012-10-30 10:00:26 | 显示全部楼层
不要酱紫嘛!各位就帮帮晚辈,算是给小弟的一些鼓励!小弟感激涕零!!!

出0入0汤圆

发表于 2012-10-30 20:19:56 | 显示全部楼层
void Exter0() interrupt 1
{
        static t=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;

        if(++t==20)
        {
                t=0;
                if(++Dat.second==60)
                {
                        Dat.second=0;
                        if(++Dat.minute==60)
                        {
                                Dat.minute=0;
                                if(++Dat.hour==24)
                                {
                                        Dat.hour=0;
                                        Dat.date++;
                                       
                                        switch(Dat.month)
                                        {
                                                case 2:
                                                                if(((Dat.year%4==0)||(Dat.year%100==0))&&(Dat.year%400!=0))
                                                                {
                                                                        if((Dat.month==2)&&(Dat.date==30))
                                                                        {
                                                                                Dat.date=1;
                                                                                if(++Dat.month==13)
                                                                                {
                                                                                        Dat.month=1;
                                                                                        Dat.year++;
                                                                                }
                                                                        }
                                                                }
                                                                if((Dat.month==2)&&(Dat.date==29))
                                                                {
                                                                                Dat.date=1;
                                                                                if(++Dat.month==13)
                                                                                {
                                                                                        Dat.month=1;
                                                                                        Dat.year++;
                                                                                }
                                                                }                                               
                                                                break;
                                                case 4:
                                                case 6:                                                       
                                                case 9:                                                               
                                                case 11:
                                                                if(Dat.date==31)
                                                                {
                                                                        Dat.date=1;
                                                                        if(++Dat.month==13)
                                                                        {
                                                                                Dat.month=1;
                                                                                Dat.year++;
                                                                        }
                                                                }
                                                                break;
                                                default:
                                                                if(Dat.date==32)
                                                                {
                                                                        Dat.date=1;
                                                                        if(++Dat.month==13)
                                                                        {
                                                                                Dat.month=1;
                                                                                Dat.year++;
                                                                        }
                                                                }
                                        }
                                }
                        }
                }
        }
}

你自己对着看看。。

出0入0汤圆

发表于 2012-10-30 20:26:55 | 显示全部楼层
请呼叫 一个小朋友吧,他的东东不错。

http://www.amobbs.com/thread-5503624-1-1.html

出0入0汤圆

发表于 2012-10-30 20:31:05 | 显示全部楼层
中断只做1秒加1,剩下的主程序里处理,显示放在最后,把逻辑弄好一点应该没问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 20:25

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

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