📄 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 + -