?? ds1302.h
字號:
/********************************************************************
THE REAL TIMER DS1302 DRIVER LIB
File Name: DS1302.h
Created: Jiang Jian Jun Date: 2003/7/21
Modified: Zhang Yu Xiang Date: 2008/10/10
Revision: 1.1
********************************************************************/
#ifndef _DS1302_H_
#define _DS1302_H_
/*
sbit DS1302_CLK = P3^0; //實時時鐘時鐘線引腳
sbit DS1302_IO = P3^1; //實時時鐘數據線引腳
sbit DS1302_RST = P3^2; //實時時鐘復位線引腳
*/
#define DS1302_DIR P6DIR
#define DS1302_IN P6IN
#define DS1302_OUT P6OUT
#define DS1302_RST BIT2
#define DS1302_SCLK BIT0
#define DS1302_SDI BIT1 //定義端口
#define DS1302_RST_LO DS1302_OUT &= ~DS1302_RST
#define DS1302_RST_HI DS1302_OUT |= DS1302_RST
#define DS1302_SCLK_LO DS1302_OUT &= ~DS1302_SCLK
#define DS1302_SCLK_HI DS1302_OUT |= DS1302_SCLK
#define DS1302_SDI_LO DS1302_OUT &= ~DS1302_SDI
#define DS1302_SDI_HI DS1302_OUT |= DS1302_SDI
#define Time_24_Hour 0x00 //24時制控制
#define Time_Start 0x00 //開始走時
#define Time_Stop 0x80 //停止走時
#define DS1302_SECOND 0x80 //DS1302各寄存器操作命令定義(寫的時候可以直接用,但是讀的時候要加一)
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_WRITE 0x8E
#define DS1302_POWER 0x90
#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于將BCD碼轉成十進制的宏
#define DEC2BCD(X) ((X/10)<<4 | (X%10)) //用于將十進制轉成BCD碼的宏
typedef struct __SYSTEMTIME__ //定義的時間類型結構體,全部數為十進制
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
}SYSTEMTIME;
//延時函數
void DS1302_Delay(unsigned int dtime) {
unsigned int temp;
for(temp=0;temp<dtime;temp++);
}
//向DS1302寫入一個字節
void DS1302InputByte(unsigned char w_dat) {
unsigned char temp;
DS1302_RST_HI;
DS1302_DIR |= DS1302_SDI;
for(temp=8;temp>0;temp--) {
DS1302_SDI_LO;
if(w_dat&BIT0) DS1302_SDI_HI;
DS1302_SCLK_LO;
DS1302_Delay(10);
DS1302_SCLK_HI;
DS1302_Delay(10);
w_dat >>=1;
}
}
//從DS1302中讀取一個字節
unsigned char DS1302OutputByte(void) {
unsigned char temp,rdata;
rdata = 0x00;
DS1302_RST_HI;
DS1302_DIR &= ~DS1302_SDI;
for(temp=0;temp<8;temp++){rdata >>= 1;//將移位放到前面,否則讀不到最高一位
DS1302_SCLK_HI;
DS1302_Delay(10);
DS1302_SCLK_LO;
DS1302_Delay(10);
if((DS1302_IN&DS1302_SDI)==DS1302_SDI)
rdata |= BIT7;
//rdata >>= 1;
}
return(rdata);
}
//向DS1302中寫入地址后寫入數據
void Write1302(unsigned char addr,unsigned char w_dat) {
DS1302_RST_LO;
DS1302_SCLK_LO;
DS1302_RST_HI;
DS1302InputByte(addr); //寫入地址
DS1302InputByte(w_dat); //寫入數據
DS1302_SCLK_HI;
DS1302_RST_LO;
}
//向DS1302寫入地址后,從DS1302中讀取數據
unsigned char Read1302(unsigned char addr) {
unsigned char r_dat;
DS1302_RST_LO;
DS1302_SCLK_LO;
DS1302_RST_HI;
DS1302InputByte(addr); //寫入地址
r_dat = DS1302OutputByte(); //讀出數據
DS1302_SCLK_LO;
DS1302_RST_LO;
return(r_dat);
}
//讀取時間函數
void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND+1);
Time->Second = BCD2DEC(ReadValue&0x7F);
ReadValue = Read1302(DS1302_MINUTE+1);
Time->Minute = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_HOUR+1);
Time->Hour = BCD2DEC(ReadValue&0x7F);
ReadValue = Read1302(DS1302_DAY+1);
Time->Day = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_WEEK+1);
Time->Week = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_MONTH+1);
Time->Month = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_YEAR+1);
Time->Year = BCD2DEC(ReadValue);
}
//設置時間函數
void DS1302_SetTime(SYSTEMTIME *Time)
{
Write1302(DS1302_WRITE,0x00); //關閉寫保護
Write1302(DS1302_YEAR,DEC2BCD(Time->Year));
Write1302(DS1302_MONTH,DEC2BCD(Time->Month));
Write1302(DS1302_WEEK,DEC2BCD(Time->Week));
Write1302(DS1302_DAY,DEC2BCD(Time->Day));
Write1302(DS1302_HOUR,DEC2BCD(Time->Hour)|Time_24_Hour);
Write1302(DS1302_MINUTE,DEC2BCD(Time->Minute));
Write1302(DS1302_SECOND,DEC2BCD(Time->Second)|Time_Start);
Write1302(DS1302_WRITE,0x80); //打開寫保護
}
//初始化DS1302
void DS1302_Initial(void)
{
P6DIR |= BIT0+BIT1+BIT2;
Write1302(DS1302_WRITE,0x00); //關閉寫保護
Write1302(DS1302_SECOND,Time_Stop);//停止計時
Write1302(DS1302_HOUR,Time_24_Hour);//24時制
Write1302(DS1302_POWER,0xA6); //單二極管,4K電阻充電
Write1302(DS1302_WRITE,0x80); //打開寫保護
}
//DS1302復位
void DS1302_Reset(void) {
DS1302_DIR |= (DS1302_RST + DS1302_SCLK);
DS1302_SCLK_LO;
DS1302_RST_LO;
DS1302_Delay(10);
DS1302_SCLK_HI;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -