• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> 请师傅帮忙看看这个程序不能调整日期的原因
    请师傅帮忙看看这个程序不能调整日期的原因
    2016年05月03日 点击: 编辑: yangzs88
    [backcolor=#ffffff]单片机是89C52RC,显示是1602的LCD液晶屏,硬件接口:显示屏的D0--D7对应单片机的P0.0--P0.7,屏的E、RW、RS分别对应单片机P2.6、2.5、2.4。按键K1--K4对应单片机P2.0--2.3.调整时间没问题,就是调整不了日期。有劳大师帮忙看看,问题出在哪?[/backcolor]
    [backcolor=#ffffff]程序如下(复制代码请注意!!!有可能会把论坛里的颜色代码,程序编译时没有错误和警告)[/backcolor]

    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    uchar code  table[]=" 2016/05/03 THU";
    uchar code table1[]="TIME:00-00-00";
    sbit lcd_rs=P2^4;
    sbit lcd_rw=P2^5;
    sbit lcd_en=P2^6;
    sbit k1=P2^0;
    sbit k2=P2^1;
    sbit k3=P2^2;
    sbit k4=P2^3;
    uchar count,k1num;
    char shi,fen,miao;
    void delay(uchar z)
    {
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }
    void write_com(uchar com)
    {
    lcd_rs=0;
    lcd_en=0;
    lcd_rw=0;
    P0=com;
    delay(5);
    lcd_en=1;
    delay(5);
    lcd_en=0;
    }
    void write_data(uchar date)
    {
    lcd_rs=1;
    lcd_en=0;
    lcd_rw=0;
    P0=date;
    delay(5);
    lcd_en=1;
    delay(5);
    lcd_en=0;
    }
    void write_fsm(uchar add,uchar date)
    {
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x40+add);
    write_data(0x30+shi);
    write_data(0x30+ge);
    }
    void jiaxian()
    {
      if(k1num!=0)
       {
       if(k2==0)
       {
        delay(5);
        if(k2==0)
        {
         while(!k2);
         if(k1num==1)
         {
          miao++;
          if(miao==60)
        
           miao=0;
           write_fsm(11,miao);
           write_com(0x80+0x40+11);
        
         }
               if(k1num==2)
         {
          fen++;
          if(fen==60)
           fen=0;
           write_fsm(8,fen);
           write_com(0x80+0x40+8);
               }
            if(k1num==3)
            {
            shi++;
          if(shi==24)
           shi=0;
           write_fsm(5,shi);
           write_com(0x80+0x40+5);
      
         }
       }
      }
    }
    }
    void jianxian()
    {
    if(k1num!=0)
    {
      if(k3==0)
      delay(5);
      if(k3==0)
      {
       while(!k3);
       if(k1num==1)
       {
        miao--;
        if(miao==-1)
         miao=59;
         write_fsm(11,miao);
         write_com(0x80+0x40+11);
       }
       if(k1num==2)
       {
        fen--;
        if(fen==-1)
         fen=59;
         write_fsm(8,fen);
         write_com(0x80+0x40+8);
       }
       if(k1num==3)
       {
        shi--;
        if(shi==-1)
         shi=23;
         write_fsm(5,shi);
         write_com(0x80+0x40+5);
       }
      }
    }
    }
    void kbscan()
    {
    if(k1==0)
    {
      delay(5);
      if(k1==0)
      {
       while(!k1);
       k1num++;
       TR0=0;
       if(k1num==1)
       {
        write_com(0x80+0x40+11);
        write_com(0x0f);  
       }
       if(k1num==2)
       {
        write_com(0x80+0x40+8);
       }
       if(k1num==3)
       {
        write_com(0x80+0x40+5);
       }
       if(k1num==4)
       {
        k1num=0;
        write_com(0x0c);
        TR0=1;
       }
      }
    }
      jiaxian();
      jianxian();
      
    }


    void init()
    {
    uchar num;
    lcd_rw=0;
    lcd_en=0;
    shi=0;
    fen=0;
    miao=0;
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
    write_com(0x80);
    for(num=0;num<15;num++)
    {
      write_data(table[num]);
      delay(5);
    }
    write_com(0x80+0x40);
    for(num=0;num<13;num++)
    {
      write_data(table1[num]);
      delay(5);
    }
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;
    }
    void main()
    {
    init();
    while(1)
    {
      kbscan();
      if(count==18)
    {
      count=0;
      miao++;
      if(miao==60)
      {
       miao=0;
       fen++;
       if(fen==60)
       {
        fen=0;
        shi++;
        if(shi==24)
        {
         shi=0;
        }
        write_fsm(5,shi);
       }
       write_fsm(8,fen);
      }
      write_fsm(11,miao);
    }
      
    }
    }
    void time0() interrupt 1
    {
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    count++;

    }