MSP430與DS1302之1602顯示
/*******************************************
函數(shù)名稱:Reset_DS1302
功 能:對(duì)DS1302進(jìn)行復(fù)位操作
********************************************/
void Reset_DS1302(void)
{
DS_RST_OUT; //RST對(duì)應(yīng)的IO設(shè)置為輸出狀態(tài)
DS_SCL_OUT; //SCLK對(duì)應(yīng)的IO設(shè)置為輸出狀態(tài)
DS_SCL0; //SCLK=0
DS_RST0; //RST=0
delay(10);
DS_SCL1; //SCLK=1
}
/*******************************************
函數(shù)名稱:Write1Byte
功 能:對(duì)DS1302寫入1個(gè)字節(jié)的數(shù)據(jù)
********************************************/
void Write_Byte(uchar wdata)
{
uchar i;
DS_SDA_OUT; //SDA對(duì)應(yīng)的IO設(shè)置為輸出狀態(tài)
DS_RST1; //REST=1;
for(i = 8; i > 0; i--)
{
if(wdata&0x01)
DS_SDA1;
else
DS_SDA0;
DS_SCL0;
delay(10);
DS_SCL1;
delay(10);
wdata>>= 1;
}
}
/*******************************************
函數(shù)名稱:Read1Byte
功 能:從DS1302讀出1個(gè)字節(jié)的數(shù)據(jù)
********************************************/
uchar Read_Byte()
{
uchar i;
uchar rdata = 0X00;
DS_SDA_IN; //SDA對(duì)應(yīng)的IO設(shè)置為輸入狀態(tài)
DS_RST1; //REST=1;
for(i = 8; i > 0; i--)
{
DS_SCL1;
delay(10);
DS_SCL0;
delay(10);
rdata >>= 1;
if(DS_SDA_BIT)
rdata |= 0x80;
}
return(rdata);
}
/*******************************************
函數(shù)名稱:Write_dat
功 能:向某個(gè)寄存器寫入一個(gè)字節(jié)數(shù)據(jù)
參 數(shù):add--寄存器地址
dat--寫入的數(shù)據(jù)
********************************************/
void Write_dat(uchar add, uchar dat)
{
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write_Byte(add); //寫入地址
Write_Byte(dat); //寫入數(shù)據(jù)
DS_SCL1;
DS_RST0;
}
/*******************************************
函數(shù)名稱:Read_dat
功 能:從某個(gè)寄存器讀出一個(gè)字節(jié)數(shù)據(jù)
參 數(shù):addr--寄存器地址
返回值 :讀出的數(shù)據(jù)
********************************************/
uchar read_1302add(uchar add)
{
uchar rdata;
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write_Byte(add); //寫入地址
rdata = Read_Byte(); //讀出數(shù)據(jù)
DS_SCL1;
DS_RST0;
return(rdata);
}
/***********初始化1302*************/
void init_1302()
{
flag=read_1302add(0x81);//讀秒寄存器最高位,讀出時(shí)鐘狀態(tài)
if(flag&0x80);//判斷時(shí)鐘是否關(guān)閉,若內(nèi)部關(guān)閉,則初始化,否則繼續(xù)走
{
Write_dat(0x8e,0x00);
Write_dat(0x80,((55/10)<<4|(55%10)));//寫秒寄存器,并寫入初值55
Write_dat(0x82,((59/10)<<4|(59%10)));//寫分寄存器,并寫入初值59
Write_dat(0x84,((22/10)<<4|(22%10)));//寫小時(shí)寄存器,并寫入初值23
Write_dat(0x86,((24/10)<<4|(24%10)));//寫日寄存器,并寫入初值18
Write_dat(0x88,((2/10)<<4|(2%10)));//寫月寄存器,并寫入初值2
Write_dat(0x8a,((5/10)<<4|(5%10)));//寫周寄存器,并寫入初值5
Write_dat(0x8c,((12/10)<<4|(12%10)));//寫年寄存器,并寫入初值12,不能寫2012年
Write_dat(0x90,0xa5);//寫充電方式
Write_dat(0x8e,0x80);//加上寫保護(hù)
}
}
/*****************讀出秒的十進(jìn)制數(shù)***************************/本文引用地址:http://m.butianyuan.cn/article/201612/324673.htm
uchar readsecond()
{
uchar dat;
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
return second;
}
/*****************讀出分的十進(jìn)制數(shù)***************************/
uchar readminute()
{
uchar dat;
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
return minute;
}
/*****************讀出小時(shí)的十進(jìn)制數(shù)***************************/
uchar readhour()
{
uchar dat;
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
return hour;
}
/*****************讀出天的十進(jìn)制數(shù)***************************/
uchar readday()
{
uchar dat;
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
returnday;
}
/*****************讀出月的十進(jìn)制數(shù)***************************/
uchar readmonth()
{
uchar dat;
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
return month;
}
/*****************讀出周的十進(jìn)制數(shù)***************************/
uchar readweek()
{
uchar dat;
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
return week;
}
評(píng)論