|
DS1302與1602顯示時(shí)間正常,程序上電第一次初始化能寫(xiě)進(jìn)數(shù)據(jù),但用按鍵無(wú)法重復(fù)調(diào)整時(shí)間,好像是數(shù)據(jù)沒(méi)有存入,找不到問(wèn)題請(qǐng)教大家了下面代碼是DS1302的驅(qū)動(dòng)代碼;補(bǔ)充說(shuō)明一下,單片機(jī)用的是stc12c5a60s2,程序用仿真軟件運(yùn)行都很正常,硬件部分DS1302的三個(gè)腳上都加上了1K的上拉電阻,上電后無(wú)法重復(fù)修改,程度邏輯在仿真軟件上運(yùn)行都正常,仿真時(shí)重復(fù)寫(xiě)入數(shù)據(jù)也正常,也對(duì)寫(xiě)保護(hù)進(jìn)行了重點(diǎn)的注意, write_ds1302(0x8e,0x00);//去除寫(xiě)保護(hù) write_ds1302(0x8e,0x80);//加入寫(xiě)保護(hù),針對(duì)stc12c5a60s2單片機(jī),對(duì)DS1302的讀寫(xiě)程序也分別加入了延時(shí),程序如下:
/**********************ds1302寫(xiě)一個(gè)字節(jié)數(shù)據(jù)*****************************/
void write_ds1302_byte(u8 temp){
//ds1302寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
u8 i;
for(i=0;i<8;i++)
{
scl=0;//scl為低時(shí)準(zhǔn)備數(shù)據(jù)
io=temp&0x01;//將數(shù)據(jù)放到IO口上
temp=temp>>1;
scl=1;//上升沿寫(xiě)入
}
}
/**********************向地址add寫(xiě)入數(shù)據(jù)datds1302*****************************/
void write_ds1302(u8 add,u8 dat){
//向地址add寫(xiě)入數(shù)據(jù)dat
rst=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
rst=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
io=1;
scl=1;
}
/**********************ds1302讀一個(gè)字節(jié)數(shù)據(jù)*****************************/
u8 read_ds1302(u8 add)
{
//ds1302讀數(shù)據(jù)
u8 i,dat;
rst=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
rst=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
write_ds1302_byte(add);//首先寫(xiě)入要讀的數(shù)據(jù)處的地址
for(i=0;i<8;i++)
{
dat=dat>>1;
scl=0;
if(io)dat=dat|0x80;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
}
rst=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間
_nop_();
scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
io=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
io=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return dat;
}
下面是時(shí)間調(diào)整程序,
/**********************ds1302設(shè)定時(shí)間*****************************/
void set_time(u8 *pSecDa){
//設(shè)定時(shí)間
u8 i;
u8 ucAddr = 0x80;
write_ds1302(0x8e,0x00);//去除寫(xiě)保護(hù)
for(i =7;i>0;i--){
write_ds1302(ucAddr,*pSecDa); //秒 分 時(shí) 日 月 星期 年
pSecDa++;
ucAddr+=2;
}
write_ds1302(0x8e,0x80);//加寫(xiě)保護(hù)
}
時(shí)間調(diào)整程序在主循環(huán)中,根據(jù)按鈕狀態(tài)調(diào)用
|
|