小德GD 发表于 2014-2-27 00:33:43

DS1302 时钟程序求助

/*
*        函数名        :        DS1302_WriteData
*        描述        :        向DS1302中的寄存器写入数据
*        输入        :        uint8_t cmd                控制字
                                uint8_t dat                           数据
*        输出        :        无
*        调用        :        内部调用
*/
void DS1302_WriteData(uchar cmd , uchar dat)
{
        uchar j,k=1;
        RST=0;
        SCLK=0;
        RST=1;
        for(j=0;j<=7;j++)                   //写控制字
        {
                if(cmd&k)
                        DATA=1;
                else
                        DATA=0;
                SCLK=1;
                k<<=1;
                SCLK=0;                                  //写完控制字,SCLK为低
        }
        k=1;
        for(j=0;j<=7;j++)                  //写数据
        {
                if(dat&k)
                        DATA=1;
                else
                        DATA=0;
                SCLK=1;                //写数据为下降沿写入,所以SCLK先拉高,然后再拉低,制造下降沿
                k<<=1;
                SCLK=0;
        }
        SCLK=1;
        RST=0;
}
/*
*        函数名        :        DS1302_ReadData
*        描述        :        从DS1302中的寄存器读出数据
*        输入        :        uint8_t cmd                控制字
*        输出        :        读出寄存器的数据
*        调用        :        内部调用
*/
uchar DS1302_ReadData(uchar cmd)
{
        uchar i,k=1;
        RST=0;
        SCLK=0;
        RST=1;
        for(i=0;i<8;i++)                          //写控制字
        {
                if(cmd&k)
                        DATA=1;
                else
                        DATA=0;
                SCLK=1;
                k<<=1;
                if(i!=7)
                        SCLK=0;                          //写完控制字,SCLK为低
        }
        k=0;
        for(i=0;i<8;i++)                         //读数据
        {
                k>>=1;
                SCLK=0;               //读数据为上升沿读出,所以SCLK先拉低,然后再拉高,制造上升沿
                if(DATA)         //所以在写完控制字的最后一位跟读出数据的第一位是在同个周期内完成
                        k|=0x80;
                SCLK=1;
        }
        RST=0;
        return(k);
}

/*
*        函数名        :        TimeEdit
*        描述        :        时间编辑函数
*        输入        :        uchar EditFlag   编辑标志位,1:加   0:减
                                uchar EditBit       编辑的位,1:小时2:分钟   3:秒钟
*        输出        :        无
*        调用        :        外部调用
*/
void TimeEdit(uchar EditFlag , uchar EditBit)
{
        uchar Data;                        //保存调整前读出的数据
        uchar NowData;                //保存调整后的数据

        switch(EditBit)        //判断编辑时间的哪一位
        {
                case EDIT_HOUR :{
                        Data = time.hour; //读取小时数据
                        if(EditFlag)                // +
                        {
                                NowData = Data+1;           //小时加1
                                if(NowData >= 24)            //溢出处理,小时大于24,则为0
                                        NowData=0;
                        }                                       
                        else                                   // -
                        {
                                if(Data == 0)                  //溢出处理,小时为0,减1变为23
                                        NowData = 23;
                                else
                                        NowData = Data-1;                               
                        }                                                                       
                        DS1302_WriteData(WR_HOUR , ((NowData/10)<<4)|(NowData%10)); //写入小时数据
                        break;
               }
                case EDIT_MIN :{
                        Data = time.min; //读取分数据
                        if(EditFlag)
                        {
                                NowData = Data+1;
                                if(NowData >= 60)        
                                        NowData=0;
                        }                                       
                        else
                        {
                                if(Data == 0)       
                                        NowData = 59;
                                else
                                        NowData = Data-1;                               
                        }
                        DS1302_WriteData(WR_MIN , ((NowData/10)<<4)|(NowData%10)); //写入分数据
                        break;
               }                  
                case EDIT_SEC :{
                        Data = time.sec; //读取秒数据
                        if(EditFlag)
                        {
                                NowData = Data+1;
                                if(NowData >= 60)        
                                        NowData=0;
                        }                                       
                        else
                        {
                                if(Data == 0)       
                                        NowData = 59;
                                else
                                        NowData = Data-1;                               
                        }
                        DS1302_WriteData(WR_SEC , ((NowData/10)<<4)|(NowData%10)); //写入秒数据
                        break;
                }
        }
}
哪位大侠能详细分析下DS1302_WriteData(uchar cmd , uchar dat)
和                   uchar DS1302_ReadData(uchar cmd)这两个程序,谢谢
页: [1]
查看完整版本: DS1302 时钟程序求助