📄 ds1302.txt
字号:
//*************************************************************************
// DS1302子程序
//*************************************************************************
#include <pic.h>
#define uchar unsigned char
//////////////////////////////////端口定义////////////////////////////
#define T_RST RC1
#define T_IO RC2
#define T_CLK RC3
#define K RE0
//////////////////////////////////位变量定义/////////////////////////
static volatile uchar acc @ 0x20;
static volatile bit acc0 @ (unsigned)&acc*8+0;
static volatile bit acc7 @ (unsigned)&acc*8+7;
//////////////////////////////////变量定义///////////////////////////
uchar data;
//uchar BCD[4]; //显示缓冲区
//uchar get1302[7];
//uchar key_t; //按键号
///////////////////////////////////////////////////////////
uchar second0,second1,minute0,minute1,hour0,hour1,date0;
uchar date1,day,month0,month1,year0,year1;
/////////////////////////函数申明/////////////////////////
void Delay(char x); //功能:延时10us
void v_RTInputByte(uchar ucDa) ; //功能:写入1Byte数据
uchar uc_RTOutputByte(void) ; //功能:读取1Byte数据
void v_W1302(uchar ucAddr, uchar ucDa); //功能:先写地址,后写命令/数据
uchar uc_R1302(uchar ucAddr); //功能:先写地址,后读命令/数据
void v_BurstW1302T(uchar *pSecDa); //功能:先写地址,后写数据(时钟多字节方式)
void v_BurstR1302T(uchar *pSecDa); //功能:先写地址,后读命令/数据(时钟多字节方式)
void v_BurstW1302R(uchar *pReDa); //功能:先写地址,后写数据(寄存器多字节方式RAM)
void v_BurstR1302R(uchar *pReDa); //功能:先写地址,后读命令/数据(寄存器多字节方式RAM)
void v_Set1302(uchar *pSecDa) ; //功能:设置初始时间
void v_Get1302(uchar ucCurtime[]); //功能:读取DS1302当前时间
void Display (uchar x,uchar y,uchar m,uchar n); //功能:显示两种时间
void read_sec(); //功能:读秒REG
void read_min(); //功能:读分REG
int Read_min();
void read_hour(); //功能:读时REG
int Read_hour();
void read_data(); //功能:读日REG
void read_day(); //功能:读周REG
void read_month(); //功能:读月REG
void read_year(); //功能:读年REG
void key_to(); //功能:按键处理
void initial(); //功能:端口定义
void Delay(char x)
{
char i;
while(x--)
for(i=0;i<5;i++);
}
//********************************************************************
//* 功能: 往DS1302写入1Byte数据
//***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i,temp; //先低位后高位
temp = ucDa;
TRISC=0x00;
T_CLK=0;
for(i=8; i>0; i--)
{
if(temp&0x01)
{
T_IO = 1; //先发第0位
}
else
{
T_IO = 0;
}
T_CLK=1; //要在调用此函数前先DS1302_CLK = 0
Delay(1);
T_CLK=0; //上升沿
Delay(1);
temp = temp>>1; //移第1位至第0位,发送
}
}
//********************************************************************
//* 功能: 从DS1302读取1Byte数据
//***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i,temp;
TRISC=0x04;
T_CLK = 0;
for(i=8; i>0; i--)
{ //因为temp=0,先移位再接收和后接再接收可以
temp = (temp >>1); //先移位再接收//移第7位到第6位//移位后,空位补0
//所以说最先接收的是第0位,暂放第7位
if(T_IO)
{
temp=(temp|0x80);
}
else
{
temp=(temp&0x7f);
}
T_CLK = 1; //要产生上升沿
Delay(1);
T_CLK = 0; //在输出读命令字的8个slk周期后,
Delay(1);
} //数据开始输出,从0位开始,在每个时钟下降沿输出??????????/
return(temp); //书上例程:时钟上升沿,发送数据有效
}
//********************************************************************
//先写地址,后写命令/数据
//***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_CLK = 0;
Delay(5);
T_RST = 0;
Delay(5);
T_RST = 1;
Delay(1);
v_RTInputByte(ucAddr); // 地址,命令
v_RTInputByte(ucDa); ///写1Byte数据
T_RST =0 ;
T_CLK =1;
Delay(1);
}
//********************************************************************
//* 说明: 先写地址,后读命令/数据
//***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
Delay(2);
T_CLK = 0;
Delay(2);
T_RST = 1;
v_RTInputByte(ucAddr); ///* 地址,命令 */
ucDa = uc_RTOutputByte(); ///* 读1Byte数据 */
T_RST =0;
T_CLK =1;
Delay(1);
return(ucDa);
}
//********************************************************************
//* 说明: 先写地址,后读命令/数据(寄存器多字节方式RAM)
//***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
uchar i;
T_RST = 0;
Delay(1);
T_CLK = 0;
Delay(1);
T_RST = 1;
Delay(1);
v_RTInputByte(0xff); //* 0xbf:时钟多字节读命令 */
for (i=31; i>0; i--) //*31Byte 寄存器数据 */
{
*pReDa = uc_RTOutputByte(); //* 读1Byte数据 */
Delay(5);
pReDa++;
}
T_RST =0;
T_CLK = 1;
Delay(1);
}
//********************************************************************
//* 功能: 设置初始时间
//* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
//***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?*/
Delay(5);
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); ////* 秒 分 时 日 月 星期 年 */
Delay(5);
pSecDa++;
ucAddr +=2;
}
//v_W1302(0x8e,0x80); //* 控制命令,WP=1,写保护?*/
}
//********************************************************************
//* 功能: 读取DS1302当前时间
//* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
//***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr=0x81;
for(i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr); //格式为: 秒 分 时 日 月 星期 年
Delay(5);
ucAddr+=2;
}
}
//********************************************************************
//* 功能:读数据并进行BCD-十进制处理
//*********************************************************************
void read_sec()
{
uchar data;
data=uc_R1302(0x81);//秒
second0=data&0x0f;
second1=(data>>4)&0x07;
}
void read_min()
{
uchar data;
data=uc_R1302(0x83);//分
minute0=data&0x0f;
minute1=(data>>4)&0x07;
}
int Read_min()
{
uchar data;
data=uc_R1302(0x83);//分
return data;
}
void read_hour()
{
uchar data;
data=uc_R1302(0x85);//时
hour0=data&0x0f;
hour1=(data>>4)&0x03;
}
int Read_hour()
{
uchar data;
data=uc_R1302(0x85);//时
return data;
}
void read_data()
{
uchar data;
data=uc_R1302(0x87);//日
date0=data&0x0f;
date1=(data>>4)&0x03;
}
void read_day()
{
uchar data;
data=uc_R1302(0x8b);//周
day=data&0x07;
}
void read_month()
{
uchar data;
data=uc_R1302(0x89);//月
month0=data&0x0f;
month1=(data>>4)&0x01;
}
void read_year()
{
uchar data;
data=uc_R1302(0x8d);//年
year0=data&0x0f;
year1=data>>4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -