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);
}
附件是原理图
/*****************************************************************************/
//常用时钟数据读取
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);
}
附件是原理图
请大神指点 很着急啊
有没有知道的 说一下 万分感激