Yangyang_hhu 发表于 2012-9-1 06:56:27

Mega128模拟方式读写DS12C887出问题了。老是读到地址


    #include "AVR/IO.h"
    #include "cpu.h"
        #include "key.h"
        #include "lcd.h"
        #include "rtc.h"
        #include "sd.h"
    #include "timer.h"
   

void init_887();
uchar READ_DATA_887(uchar addr);
void WRITE_DATA_887(uchar addr ,uchar data);
unsigned char size_month(unsigned char year,unsigned char month);
uchar week(uchar g,uchar k,uchar m);
void RESET_887();
void delay(uint ms);
void delay_us(uint us);

const uchartable_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const uchartable_wei[]={0x01,0X02,0X04,0X08};
uchar ge=0,shi=0,bai=0,qian=0;

void init_887()
{   AS_L;
    DS_L;
    RW_L;
        WRITE_DATA_887(0x0A,0x20);
        WRITE_DATA_887(0x0B,0x76); //DS12887初始化设置
        delay(1);
}
/********************************************************************
* 名称 : READ_DATA_887()
* 功能 : 初始化DS12C887
* 输入 : 无
* 输出 : 无
***********************************************************************/
void RESET_887()
{
        WRITE_DATA_887(4,23);//设定时
        WRITE_DATA_887(2,59);//设定分
        WRITE_DATA_887(0,55);//设定秒
        WRITE_DATA_887(9,0x0a);//设定年
        WRITE_DATA_887(8,0x0c);//设定月
        WRITE_DATA_887(7,0x1f);//设定日
        WRITE_DATA_887(6,5);//设定星期
}
/********************************************************************
* 名称 : READ_DATA_887()
* 功能 : 从DS12C887中读取数据
* 输入 :
* 输出 : 无
***********************************************************************/
uchar READ_DATA_887(uchar add)
{
   uchar ds_date;                                                                        //设置临时变量
      AS_H;                                                                                        //置地址选通信号有效
      DS_H;                                                                                        //置数据信号有效
      RW_H;                                                                                        //置写地址信号有效
      CS_L;                                                                                        //置片选信号为有效
      PORTA=add;                                                                                        //写入要取数据的地址
      AS_L;                                                                                        //置数据选通信号有效
      DS_L;                                                                                        //置数据信号有效
      PORTA=0xff;                                                                              //送0xff准备取数标识给DS12C887
      ds_date=PINA;                                                                              //取对应地址的有效数据
      DS_H;                                                                                        //置地址/数据为高
      AS_H;                                                                                        //置地址选通为高
      CS_H;                                                                                           //置片选为高
      return ds_date;                                                                        //返回所取到的时钟数据
}
/********************************************************************
* 名称 : WRITE_DATA_887()
* 功能 : 往DS12C887中写入数据
* 输入 :
* 输出 : 无
***********************************************************************/
void WRITE_DATA_887(uchar add,uchar data)
{
      CS_L;                                                                                        //置片选信号为有效
      AS_H;                                                                                        //置地址选通信号有效
      DS_H;                                                                                        //置地址信号有效
      RW_H;                                                                                        //置写地址信号有效
      PORTA=add;                                                                                        //写入要写数据的地址
      AS_L;                                                                                        //置数据选通信号有效
      RW_L;                                                                                        //置写数据信号有效
      PORTA=data;                                                                                        //写入数据
      RW_H;                                                                                           //置读/写为高
      AS_H;                                                                                        //置地址选通为高
      CS_H;                                                                                        //置片选为高
}
/*-----阳历月份最大天数计算-----*/
unsigned char size_month(unsigned char year,unsigned char month)
{
      return(30+(((month&1)^(month&8)>>3)!=0)-(month==2)*2+(!(year%4)&&(year%100)&&(month==2)||!(year

%400)));
}
/*-----时间调整后星期的计算-----*/
uchar week(uchar g,uchar k,uchar m)//g=nian k=yue m=ri
{
        uint y1,l1;
        uchar zhou,z1;
        if(g%4==0)
                z1=g/4;
        else
                z1=g/4+1;
        if(g%4!=0)
        {
                switch(k)
                {
                        case 1:y1=0;break;
                        case 2:y1=31;break;
                        case 3:y1=59;break;
                        case 4:y1=90;break;
                        case 5:y1=120;break;
                        case 6:y1=151;break;
                        case 7:y1=181;break;
                        case 8:y1=212;break;
                        case 9:y1=243;break;
                        case 10:y1=273;break;
                        case 11:y1=304;break;
                        case 12:y1=334;break;
                }
        }
        else
        {
                switch(k)
                {
                        case 1:y1=0;break;
                        case 2:y1=31;break;
                        case 3:y1=60;break;
                        case 4:y1=91;break;
                        case 5:y1=121;break;
                        case 6:y1=152;break;
                        case 7:y1=182;break;
                        case 8:y1=213;break;
                        case 9:y1=244;break;
                        case 10:y1=274;break;
                        case 11:y1=305;break;
                        case 12:y1=335;break;
                }       
        }
        y1=y1+m-36;//从12887中读出的时间距2000.02.05几天即为值l的大小
        l1=g*365+z1+y1;       

        l1=l1%7;
        switch(l1)
        {
                case 0:y1=6;break;
                case 1:y1=7;break;
                case 2:y1=1;break;
                case 3:y1=2;break;
                case 4:y1=3;break;
                case 5:y1=4;break;
                case 6:y1=5;break;
        }
        zhou=y1;
        return zhou;
}

Yangyang_hhu 发表于 2012-9-1 06:57:00

求大神啊

thomascao 发表于 2012-9-2 05:18:45

uchar READ_DATA_887(uchar add)
{
   uchar ds_date;                     
        AS_L;
        DS_H;
        RW_H;
        AS_H;
        DDRA = 0xFF;   
        PORTA = add;
        CS_L;
        AS_L;
        DDRA = 0x00;   
        PORTA =0x00;
        DS_L;
        asm("nop");
        ds_date = PINA;
        DS_H;
        AS=H;
        CS=H;
        return ( ds_date );
}
/********************************************************************
* 名称 : WRITE_DATA_887()
* 功能 : 往DS12C887中写入数据
* 输入 :
* 输出 : 无
***********************************************************************/
void WRITE_DATA_887(uchar add,uchar data)
{
        AS_L;
        DS_H;
        RW_H;
        AS_H;
        DDRA = 0xFF;
        PORTA = add;
        CS_L;
        AS_L;
        RW_L;
        DDRA = 0xFF;
        PORTA = data;
        asm("nop");
        RW_H;
        asm("nop");
        CS_H;
        AS_H;
}

页: [1]
查看完整版本: Mega128模拟方式读写DS12C887出问题了。老是读到地址