微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > DS1302驱动程序问题

DS1302驱动程序问题

时间:10-02 整理:3721RD 点击:
小白真诚求助 想问下 DS1302这个驱动程序配上这个原理图哪个地方有错误 12864能显示 就是时钟不走 是什么原因  万分感谢 知道的大神指点一下 感谢。下边是 驱动程序//DS1302时钟芯片驱动程序
/*****************************************************************************/
//常用时钟数据读取
void Read1302S(void){
        ss = Read1302(0x81);//读取秒数据
        mm = Read1302(0x83);//读取分钟数据
        hh = Read1302(0x85);//小时
        dd = Read1302(0x87);//日
        mo = Read1302(0x89);//月
        xq = Read1302(0x8b);//星期
        yy = Read1302(0x8d);//年
}
/*****************************************************************************/
//调时用加1程序
void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
  signed char address,item;
  signed char max,mini;
  LCM_WriteDatOrCom(0,0x9a);
  LCM_WriteString("调整");
  //if(sel==6)  {LCM_WriteString("秒钟");address=0x80; max=0;mini=0;}     //秒7
  if(sel==5)  {LCM_WriteString("分钟");address=0x82; max=59;mini=0;}    //分钟6
  if(sel==4)  {LCM_WriteString("小时");address=0x84; max=23;mini=0;}    //小时5
  if(sel==3)  {LCM_WriteString("星期");address=0x8a; max=7;mini=1;}    //星期4  
  if(sel==2)  {LCM_WriteString("日期");address=0x86; max=31;mini=1;}    //日3
  if(sel==1)  {LCM_WriteString("月份");address=0x88; max=12;mini=1;}    //月2
  if(sel==0)  {LCM_WriteString("年份");address=0x8c; max=99; mini=0;}    //年1
  //读取1302某地址上的数值转换成10进制赋给item
  item=((Read1302(address+1))/16)*10 + (Read1302(address+1))%16;
  if(KEY_2 == 0){
          item++;//数加 1  
  }
  if(KEY_4 == 0){
          item--;//数减 1
  }
  if(item>max) item=mini;//查看数值有效范围   
  if(item<mini) item=max;           
  Write1302(0x8e,0x00);//允许写操作
  Write1302(address,(item/10)*16+item%10);//转换成16进制写入1302
  Write1302(0x8e,0x80);//写保护,禁止写操作
  updata ();        //刷新数据
  lcm_w_mm();//刷新 分
}
/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
        unsigned char f;
        if(Read1302(0xc1) != 0xaa){
                Write1302(0x8e,0x00);//允许写操作
                Write1302(0x8c,0x10);//年
                Write1302(0x8a,0x01);//星期
                Write1302(0x88,0x01);//月
                Write1302(0x86,0x01);//日
                Write1302(0x84,0x00);//小时
                Write1302(0x82,0x00);//分钟
                Write1302(0x80,0x00);//秒
                Write1302(0x90,0xa5);//充电       
                Write1302(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
                for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
                        Write1302(0xc2+f,0x00);
                }
                Write1302(0x8e,0x80);//禁止写操作
        }
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void Write1302(unsigned char ord, unsigned char dd){
        clock_clk=0;
        clock_Rst=0;
        clock_Rst=1;
        DS1302OutputByte(ord);
        DS1302OutputByte(dd);
        clock_Rst=0;
        clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void DS1302OutputByte(unsigned char dd){
        ACC=dd;
        clock_dat=a0; clock_clk=1; clock_clk=0;
        clock_dat=a1; clock_clk=1; clock_clk=0;
        clock_dat=a2; clock_clk=1; clock_clk=0;
        clock_dat=a3; clock_clk=1; clock_clk=0;
        clock_dat=a4; clock_clk=1; clock_clk=0;
        clock_dat=a5; clock_clk=1; clock_clk=0;
        clock_dat=a6; clock_clk=1; clock_clk=0;
        clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char DS1302InputByte(void){
        clock_dat=1;
        a0=clock_dat;
        clock_clk=1; clock_clk=0; a1=clock_dat;
        clock_clk=1; clock_clk=0; a2=clock_dat;
        clock_clk=1; clock_clk=0; a3=clock_dat;
        clock_clk=1; clock_clk=0; a4=clock_dat;
        clock_clk=1; clock_clk=0; a5=clock_dat;
        clock_clk=1; clock_clk=0; a6=clock_dat;
        clock_clk=1; clock_clk=0; a7=clock_dat;
        return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char Read1302(unsigned char ord){
        unsigned char dd=0;
        clock_clk=0;
        clock_Rst=0;
        clock_Rst=1;
        DS1302OutputByte(ord);
        dd=DS1302InputByte();
        clock_Rst=0;
        clock_clk=1;
        return(dd);
}
附件是原理图


请大神指点 很着急啊

有没有知道的 说一下   万分感激

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top