首先確定地址:讀取小時的地址為85H,寫入時的地址為84H。
AM-PM/12-24模式選擇:
小時寄存器的bit7是AM-PM/12-24模式選擇選擇位,這一位為“1”時,選擇了12小時制。因此,這樣實現
12小時制:Write_DS1302(0x84,80)
小時寄存器的bit5為“1”時,為上午。這樣實現12小時制的上午:Write_DS1302(0x84,90)
寫入時間后,我們就可以讀取了:temp=Read_DS1302(0x83)
關鍵就在于顯示,與12小時有關的是bit0—bit4,因此,讀到的值需去掉無關的位,可以這樣:
temp=Read_DS1302(0x85);//小時數保存在低5位
temp<<=3;
temp>>=3;
左移三位,再右移三位后,temp中就是真正的12小時的16進制碼了。
下面附完整原代碼,將其保存為DS1302.h,然后在main中調用就行。
希望這篇文章對你有用。
/************************************************************
時間函數
系統時鐘:89C52 12M時鐘頻率
原創作者:花瓣雨 QQ:1276652066
************************************************************/
#ifndef _DS1302_h
#define _DS1302_h
sbit DS1302_scl=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
unsigned char Read_DS1302(unsigned char Addr) //讀取DS1302
{
unsigned char i,Value;
rst=0;
DS1302_scl=0;
rst=1;
for(i=0;i<8;i++)
{
DS1302_scl=0;
io=Addr & 0x01;
DS1302_scl=1;
Addr>>=1;
}
for(i=0;i<8;i++)
{
Value>>=1;
DS1302_scl=0;
if(io) Value|=0x80;
DS1302_scl=1;
}
rst=0;
return Value;
}
void Write_DS1302(unsigned char Addr,unsigned char Value) //寫入DS1302
{
unsigned char i;
rst=0;
DS1302_scl=0;
rst=1;
for(i=0;i<8;i++)
{
DS1302_scl=0;
io=Addr & 0x01;
DS1302_scl=1;
Addr>>=1;
}
for(i=0;i<8;i++)
{
DS1302_scl=0;
io=Value & 0x01;
DS1302_scl=1;
Value>>=1;
}
rst=0;
}
void Set_MIN(unsigned char s) //1為分鐘加,0為分鐘減
{
unsigned char temp;
Write_DS1302(0x8E,0x00);//去除寫保護
temp=Read_DS1302(0x83);
if(s)
{
temp+=1;
if(temp>0x59)
temp=0;
if(temp%0x10>0x09)
temp=((temp+0x10) & 0xf0);
}
else
{
if(temp>0)
temp-=1;
else
temp=0x59;
if((temp%0x10)>0x09)
temp=((temp/0x10)*0x10 + 0x09);
}
Write_DS1302(0x82,temp);
Write_DS1302(0x80,0x00);
}
void Set_HR(unsigned char s) //1為小時加,0為小時減
{
unsigned char temp;
Write_DS1302(0x8E,0x00);//去除寫保護
temp=Read_DS1302(0x85);//小時數保存在低5位
temp<<=3;
temp>>=3;
if(s)
{
temp+=1;
if(temp==0x0a)
temp=0x10;
if(temp>0x12)
temp=0;
}
else
{
if(temp==0)
temp=0x12;
temp-=1;
if(temp==0x0f)
temp=0x09;
}
temp=temp | 0x80;
Write_DS1302(0x84,temp);
}
#endif