lxg1989 发表于 2011-4-11 20:16:17

DS12C887和1602 proteu中仿真行的 下载到单片机中时钟不走

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uintunsigned int
uchar miao,fen,shi,ri,zhou,yue,nian,key_num,time_flag;
sbit DS_cs   =P2^7;
sbit DS_as   =P2^3;
sbit DS_rw   =P3^6;
sbit DS_ds   =P3^7;
sbit RS    = P2^4;
sbit RW    = P2^5;
sbit E   = P2^6;
sbit key1      =P2^0;
sbit key2      =P2^1;       
uchar code table1[]={"20--      "};
uchar code table2[]={"      ::      "};
void delay(uchar z)
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

//void ds12887_judge_busy( void)
//{
// while(P1&0x80);
//}
void DS_write(uchar add,uchar date)
{
          DS_as=1;
          DS_ds=1;
          DS_rw=1;
          DS_cs=0;
          P1=add;
          DS_as=0;
          DS_rw=0;
          P1=date;
          DS_rw=1;
          DS_as=1;
          DS_cs=1;
      //ds12887_judge_busy;//不知道要不要忙时检测/?????
}
uchar DS_read(uchar add)   //   有错吗???
{
          ucharDS_read_dat;
          DS_as=1;
          DS_ds=1;
          DS_rw=1;
          DS_cs=0;
          P1=add;
          DS_as=0;
          DS_ds=0;
          P1=0xff;
          DS_read_dat = P1;
          DS_ds=1;
          DS_as=1;
          DS_cs=1;
          return(DS_read_dat);
      //ds12887_judge_busy;
}
/*************************************************************
**功能:判断LCD忙                                                                                        **
**参数:无                                                                                               **
*************************************************************/

void check_busy(void)
{
        while(1)
        {
        P0=0xff;
        E=0;
        _nop_();
        RS=0;
        _nop_();
        _nop_();
        RW=1;
        _nop_();
        _nop_();
        E=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        if((P0&0x80)==0)
        {
                break;
               
        }
        E=0;
        }
}


//******************************************
//      将数据码写入LCD数据寄存器
//******************************************      
void write_command(uchar tempdata)
{
    E=0;
        _nop_();
        _nop_();
        RS=0;
        _nop_();
        _nop_();
        RW=0;
        P0=tempdata;
        _nop_();
        _nop_();
        E=1;
        _nop_();
        _nop_();
        E=0;
        _nop_();
        check_busy();

}
//*******************************************
//         写LCD1602使能程序
//*******************************************
void write_data(uchar tempdata)
{
           E=0;
        _nop_();
        _nop_();
        RS=1;
        _nop_();
        _nop_();
        RW=0;
        P0=tempdata;
        _nop_();
        _nop_();
        E=1;
        _nop_();
        _nop_();
        E=0;
        _nop_();
        check_busy();

}

void Display_Btime(uchar add,uchar date)
{
                write_command(add);
                ;
                write_data(date);
}
void Display_BCDtime(uchar add,uchar date)
{
        uchar gw,sw;
        sw=date/10;
        gw=date%10;
        write_command(0x80+add);
        write_data(0x30+sw);
    write_data(0x30+gw);
}

void BCD_time()
{
                miao=DS_read(0x00);
                Display_BCDtime(0x4a,miao);

                fen=DS_read(0x02);
                Display_BCDtime(0x47,fen);

                shi=DS_read(0x04);
                Display_BCDtime(0x44,shi);

                ri=DS_read(0x07);
                Display_BCDtime(0x0a,ri);

                yue=DS_read(0x08);
                Display_BCDtime(0x07,yue);

                nian=DS_read(0x09);
                Display_BCDtime(0x04,nian);
               
               zhou=DS_read(0x06);
      switch(zhou)
                {
                        case 1:
                        {
                                Display_Btime(0x80+0x0d,'M');
                                Display_Btime(0x80+0x0e,'O');
                                Display_Btime(0x80+0x0f,'N');
                        }
                        break;
                        case 2:
                        {
                                Display_Btime(0x80+0x0d,'T');
                                Display_Btime(0x80+0x0e,'U');
                                Display_Btime(0x80+0x0f,'E');
                        }
                        break;
                        case 3:
                        {
                                Display_Btime(0x80+0x0d,'W');
                                Display_Btime(0x80+0x0e,'E');
                                Display_Btime(0x80+0x0f,'D');
                        }
                        break;
                        case 4:
                        {
                                Display_Btime(0x80+0x0d,'T');
                                Display_Btime(0x80+0x0e,'H');
                                Display_Btime(0x80+0x0f,'U');
                        }
                        break;
                        case 5:
                        {
                                Display_Btime(0x80+0x0d,'F');
                                Display_Btime(0x80+0x0e,'R');
                                Display_Btime(0x80+0x0f,'I');
                        }
                        break;
                        case 6:
                        {
                                Display_Btime(0x80+0x0d,'S');
                                Display_Btime(0x80+0x0e,'A');
                                Display_Btime(0x80+0x0f,'T');
                        }
                        break;
                        case 7:
                        {
                                Display_Btime(0x80+0x0d,'S');
                                Display_Btime(0x80+0x0e,'U');
                                Display_Btime(0x80+0x0f,'N');
                        }
                        break;
                        default :break;
          }
                }       

void keyscan()
{
        if(key1==0)
        {
                delay(10);
                if(key1==0)
                {
                        key_num++;
                        time_flag=1;
                        switch(key_num)
                        {
                                        case 1:
                                        {       
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                                write_command(0x80+0x40+11);
                                                write_command(0x0f);                                                                                                       
                                        }
                                        break;
                                        case 2 :
                                        {
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                          write_command(0x80+0x40+8);
                                          write_command(0x0f);                                               
                                       
                                        }
                                        break;
                                        case 3 :
                                        {                                       
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                                write_command(0x80+0x40+5);
                                                write_command(0x0f);                                               
               
                                        }       
                                        break;
                                        case 4:
                                        {
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                          write_command(0x80+15);
                                          write_command(0x0f);                                               
               
                                        }
                                        break;
                                        case 5 :
                                        {
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                                write_command(0x80+11);
                                          write_command(0x0f);                                               
               
                                        }
                                        break;
                                        case 6 :
                                        {
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                                write_command(0x80+0x08);
                                          write_command(0x0f);                                               
               
                                        }
                                        break;
                                        case 7 :
                                        {
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                                write_command(0x80+0x05);
                                                write_command(0x0f);                                         
                                       }
                                       break;
                                       case 8 :
                                        {
                                                write_command(0x0c);
                                                key_num=0;
                                                time_flag=0;
                                                while(!key1);
                                                delay(10);
                                                while(!key1);
                                                DS_write(0x09,nian);
                                                DS_write(0x08,yue);
                                                DS_write(0x07,ri);
                                                DS_write(0x06,zhou);
                                                DS_write(0x04,shi);
                                                DS_write(0x02,fen);
                                                DS_write(0x00,miao);

                                       }
                                       break;
                                       default :break;
                        }
                                       
       
                        }
        }
        if(key2==0)
                {
                        delay(10);
                        if(key2==0)
                        {
                                switch(key_num)
                                {
                                        case 1:
                                        {
                                                miao++;
                                                if(miao==60)
                                                {
                                                        miao=0;
                                                }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                                                Display_BCDtime(0x4a,miao);
                                                write_command(0x80+0x40+11);
                                                write_command(0x0f);

                                        }
                                        break;
                                        case 2:
                                        {
                                                fen++;
                                                if(fen==60)
                                                {
                                                        fen=0;
                                                }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                                                Display_BCDtime(0x47,fen);
                                                write_command(0x80+0x40+8);
                                                write_command(0x0f);
                                        }
                                        break;
                                        case 3:
                                        {
                                                shi++;
                                                if(shi==24)
                                                {
                                                        shi=0;
                                               }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                                                Display_BCDtime(0x44,shi);
                                                write_command(0x80+0x40+5);
                                                write_command(0x0f);
                                        }
                                        break;
                                        case 4:
                                        {
                                                zhou++;
                                                if(zhou==8)
                                                {
                                                        zhou=1;
                                                }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                               
         switch(zhou)
                  {
                        case 1:
                        {
                                Display_Btime(0x80+0x0d,'M');
                                Display_Btime(0x80+0x0e,'O');
                                Display_Btime(0x80+0x0f,'N');
                        }
                        break;
                        case 2:
                        {
                                Display_Btime(0x80+0x0d,'T');
                                Display_Btime(0x80+0x0e,'U');
                                Display_Btime(0x80+0x0f,'E');
                        }
                        break;
                        case 3:
                        {
                                Display_Btime(0x80+0x0d,'W');
                                Display_Btime(0x80+0x0e,'E');
                                Display_Btime(0x80+0x0f,'D');
                        }
                        break;
                        case 4:
                        {
                                Display_Btime(0x80+0x0d,'T');
                                Display_Btime(0x80+0x0e,'H');
                                Display_Btime(0x80+0x0f,'U');
                        }
                        break;
                        case 5:
                        {
                                Display_Btime(0x80+0x0d,'F');
                                Display_Btime(0x80+0x0e,'R');
                                Display_Btime(0x80+0x0f,'I');
                        }
                        break;
                        case 6:
                        {
                                Display_Btime(0x80+0x0d,'S');
                                Display_Btime(0x80+0x0e,'A');
                                Display_Btime(0x80+0x0f,'T');
                        }
                        break;
                        case 7:
                        {
                                Display_Btime(0x80+0x0d,'S');
                                Display_Btime(0x80+0x0e,'U');
                                Display_Btime(0x80+0x0f,'N');
                        }
                        break;
                        default :break;
                     }          
                                                write_command(0x80+15);
                                                write_command(0x0f);
                                        }
                                        break;
                                        case 5:
                                        {
                                                ri++;
                                                if(ri==32)
                                                {
                                                        ri=0;
                                                }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                                                Display_BCDtime(0x0a,ri);
                                                write_command(0x80+11);
                                                write_command(0x0f);
                                        }
                                        break;
                                        case 6:
                                        {
                                                yue++;
                                                if(yue==13)
                                                {
                                                        yue=0;
                                                }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                                                Display_BCDtime(0x07,yue);
                                                write_command(0x80+0x08);
                                                write_command(0x0f);
                                        }
                                        break;
                                        case 7:
                                        {
                                                nian++;
                                                if(nian==100)
                                                {
                                                        nian=0;
                                                }
                                                while(!key2);
                                                delay(10);
                                                while(!key2);
                                                Display_BCDtime(0x04,nian);
                                                write_command(0x80+0x08);
                                                write_command(0x0f);
                                        }
                                        break;
                                        default:break;

                                }
                        }
                }
}

void init_dis(uchar add,uchar table[])
{
        uchar *app ;
        write_command(0x80+add);
        for(app=table;app<(table+16);app++)
        {
                write_data(*app);
        }
}
void set_time()
{
        DS_write(0x09,11);
        DS_write(0x08,12);
        DS_write(0x07,15);
        DS_write(0x06,2);
        DS_write(0x04,23);
        DS_write(0x02,59);
        DS_write(0x00,35);
}

void init()
{

        write_command(0x01);
         write_command(0x38);
         write_command(0x0C);
         write_command(0x06);
        init_dis(0,table1);
        init_dis(0x40,table2);
        DS_write(0x0a,0x20);   // 打开内部晶振,寄存器A设置
        DS_write(0x0b,0x06);   // 寄存器B设置
        time_flag=0;
        key_num=0;
        set_time();   //实际应用中set_alarm()和set_time()仅第一次烧写需要,然后屏蔽掉重烧第二次,12887才正常工作,否则每次开机必须重设时间。
}
void main()
{
        init();
        while(1)
        {
                keyscan();
                if(time_flag==0)
                {
                        BCD_time();
                }
          
        }


}


proteus 中仿真可以的下载到at89s52中 时钟就是不走啊秒都不跳一下跪求高手帮忙******

lxg1989 发表于 2011-4-11 20:26:45

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_630033U6UNO5.jpg
原理图 (原文件名:未命名.jpg)

cong2010 发表于 2011-5-26 13:32:23

你检测下你的硬件连接,或者看看ds12c887,程序没有问题,我试验过可以走

pubuntu 发表于 2012-7-23 20:48:06

我也没有成功。明天成功就告诉你
页: [1]
查看完整版本: DS12C887和1602 proteu中仿真行的 下载到单片机中时钟不走