?? ds1302.c
字號:
//******************************************************
//文 件 名:Drive.c
//功能描述:提供時鐘芯片DS1302的底層源碼
//IDE 環境:凌陽u'nSP IDE 2.0.0
//單 片 機:凌陽SPCE061A
//硬件連接:Drive中硬件連接如:
// DS1302的片選線(/RST) 接IOA15
// DS1302的數據線(I/O) 接IOA14
// DS1302的時鐘線(CLK) 接IOA13
//
//使用說明:本文件為凌陽SPCE061A上接DS1302的驅動程序
// 使用時不用改動函數的任何部分
// 只需改動下面的宏定義中的IO口即可
//
//作 者:山東大學曹香鵬xpstudio
//維護記錄:2006.07.19 文件創建
// 2006.07.20 調試成功
//****************************************************
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOA_Latch (volatile unsigned int *)0x7004
//位操作宏定義,使用時只需修改以下宏定義即可
#define set_RST *P_IOA_Data|=0x8000 //RST=1
#define clr_RST *P_IOA_Data&=0x7fff //RST=0
#define set_IO *P_IOA_Data|=0x4000 //IO=1
#define clr_IO *P_IOA_Data&=0xbfff //IO=0
#define set_CLK *P_IOA_Data|=0x2000 //CLK=1
#define clr_CLK *P_IOA_Data&=0xdfff //CLK=0
/******************************向DS1302寫入1B數據***********************
* 名稱: void InputByte(unsigned int data)
* 功能: 向DS1302寫入1B的指令或數據(內部函數)
* 調用: 無
* 輸入: data
* 返回值: 無
* 作者:山東大學曹香鵬xpstudio
* 時間:2006.07.20
***********************************************************************/
void InputByte(unsigned int data)
{ //向DS1302寫入1B數據(內部函數)
int i;
unsigned int temp;
temp=data;//ACC
for(i=8;i>0;i--)
{
if(temp&1) set_IO;//IO=ACC0
else clr_IO;
set_CLK;//CLK=1
clr_CLK;//CLK=0
temp>>=1;
}//for
}
/*****************************從DS1302讀出1B數據************************
* 名稱: OutputByte()
* 功能: 從DS1302讀出1B數據(內部函數)
* 調用: 無
* 輸入: 無
* 返回值: 1B數據
* 作者:山東大學曹香鵬xpstudio
* 時間:2006.07.20
***********************************************************************/
unsigned int OutputByte()
{ //從DS1302讀出1B數據(內部函數)
int i;
unsigned int temp=0;
//設IOA14為輸入口
*P_IOA_Dir&=0xbfff;
for(i=8;i>0;i--)
{
temp>>=1;
temp&=0x7fff;
if(*P_IOA_Data&0x4000)temp+=0x8000;//
set_CLK;//CLK=1
clr_CLK;//CLK=0
}//for
//將IOA14改回輸出口
*P_IOA_Dir|=0x4000;
temp>>=8;
temp&=0x00ff;
return temp;
}
/*******************************向DS1302寫入指令或數據*******************
* 名稱: void WR1302(unsigned int add,unsigned int data)
* 功能: 向DS1302寫入以add為地址的data數據
* 調用: void InputByte(unsigned int data)
* 輸入: add,data
* 返回值: 無
* 作者:山東大學曹香鵬xpstudio
* 時間:2006.07.20
***********************************************************************/
void WR1302(unsigned int add,unsigned int data)
{//add 為寫入數據的地址,data為要寫入的數據----寫入單個的數據
clr_RST;//RST=0
clr_CLK;//CLK=0
set_RST;//RST=1,啟動數據傳輸
InputByte(add);
InputByte(data);
clr_RST;//RST=0
}
/******************************讀DS1302里對應寄存器的數據***************
* 名稱: unsigned int RE1302(unsigned int add)
* 功能: 從DS1302讀出以add為地址的數據
* 調用: void InputByte(unsigned int data)
unsigned int OutputByte()
* 輸入: add
* 返回值: temp
* 作者:山東大學曹香鵬xpstudio
* 時間:2006.07.20
***********************************************************************/
unsigned int RE1302(unsigned int add)
{//add 為寫入數據的地址,data為要寫入的數據
unsigned int temp;
clr_RST;//RST=0
clr_CLK;//CLK=0
set_RST;//RST=1,啟動數據傳輸
InputByte(add);//寫入地址
temp=OutputByte();
clr_RST;//RST=0
return temp;
}
/******************************設置DS1302的初始時間*********************
* 名稱: void SET1302(unsigned int* pClock)
* 功能: 設置DS1302的初始時間,pClock寄存器的順序為:秒,分,時,日,月,周,年,為BCD碼形式
* 調用:void WR1302(unsigned int add,unsigned int data)
* 輸入: pClock
* 返回值: 無
* 作者:山東大學曹香鵬xpstudio
* 時間:2006.07.20
***********************************************************************/
void SET1302(unsigned int* pClock)
{ //入口條件:pClock寄存器的順序為:秒,分,時,日,月,周,年
// 為BCD碼的形式
int i;
unsigned int add=0x80;
WR1302(0x80,0x00);//將控制寄存器設為0,最高位WP=0,DS1302允許寫入
for(i=0;i<7;i++)//將七個初始值依次寫入對應的七個寄存器
{
WR1302(add,*pClock);
pClock++;
add+=2;
}
WR1302(0x8e,0x80);//寫保護,防止干擾
}
/******************************讀取DS1302的初始時間*********************
* 名稱: void GET1302(unsigned int* cur_time)
* 功能: 記取DS1302的當前時間,
cur_time寄存器的順序為:秒,分,時,日,月,周,年
數據數組為BCD碼形式
* 調用:unsigned int RE1302(unsigned int add)
* 輸入:cur_time
* 返回值: cur_time數組值
* 作者:山東大學曹香鵬xpstudio
* 時間:2006.07.20
***********************************************************************/
void GET1302(unsigned int* cur_time)
{ //出口條件:cur_time數組的順序為:秒,分,時,日,月,周,年
// 為BCD碼的形式
int i;
unsigned int add=0x81;
for(i=0;i<7;i++)//將七個初始值依次寫入對應的七個寄存器
{
cur_time[i]=RE1302(add);
add+=2;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -