⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 该程序是医院用的CPCR记录仪的终端控制程序
💻 C
字号:
#include <f:\yyjapp\yymk\software\main.h>
#include <f:\yyjapp\yymk\software\ds1302.h>
#include <iom128v.h>
#include <macros.h>
unsigned char code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/******************************************************************** 
 函 数 名:W_Byte()
 功    能:实时时钟写入一字节
 说    明:往DS1302写入1Byte数据
 入口参数:Data 写入的数据 
 返 回 值:无  
***********************************************************************/
void W_Byte(unsigned char Data) 
{ 
    unsigned char i;
    for(i=0;i<8;i++)
    {
		if(Data&0x01)      //相当于汇编的RRC命令
		SET_IO();
		else
		CLEAR_IO();
		Data>>=1;
		CLOCK();
    } 
}
/******************************************************************** 

 函 数 名:R_Byte()
 功    能:实时时钟读取一字节
 说    明:从DS1302读取1Byte数据
 入口参数:无  
 返 回 值:data
***********************************************************************/
unsigned char R_Byte(void) 
{ 
    unsigned char i,data=0;
	for(i=0;i<8;i++)
    {
		if(PINE&0x20)
		data|=code[i];
		CLOCK();
    } 
    return data; 
}
/******************************************************************** 

 函 数 名:W_1302()
 功    能:往DS1302写入数据
 说    明:先写地址,后写命令/数据
 调    用:W_Byte() , R_Byte()
 入口参数:Addr: DS1302地址, Data: 要写的数据
 返 回 值:无
***********************************************************************/
void W_1302(unsigned char Addr, unsigned char Data)
{
 	CLEAR_RST();
	CLEAR_CLK();
 	SET_RST();
	SET_IO();
    W_Byte(Addr);       /* 地址,命令 */
    W_Byte(Data);       /* 写1Byte数据*/
    SET_CLK();
    CLEAR_RST();
} 
/******************************************************************** 

 函 数 名:R_1302()
 功    能:读取DS1302某地址的数据
 说    明:先写地址,后读命令/数据
 调    用:W_Byte() , R_Byte()
 入口参数:ucAddr: DS1302地址
 返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R_1302(unsigned char Addr)
{
    unsigned char Data1;
	CLEAR_RST();
	CLEAR_CLK();
    SET_RST();
    W_Byte(Addr);             /* 地址,命令 */
    Data1 = R_Byte();         /* 读1Byte数据 */
    SET_CLK();
    CLEAR_RST();
    return Data1;
}
/******************************************************************** 

 函 数 名:BurstW1302T()
 功    能:往DS1302写入时钟数据(多字节方式)
 说    明:先写地址,后写命令/数据
 调    用:W_Byte() 
 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
                         8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
 返 回 值:无
***********************************************************************/
void BurstW1302T(unsigned char *Cdata)
{
    unsigned char i;
    W_1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
    CLEAR_RST();
	CLEAR_CLK();
	SET_RST();
    W_Byte(0xbe);        /* 0xbe:时钟多字节写命令 */
    for (i=0;i<8;i++)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
    {
        W_Byte(*Cdata); /* 写1Byte数据*/
        Cdata++;
    }
    SET_CLK();
    CLEAR_RST();
} 
/******************************************************************** 

 函 数 名:BurstR1302T()
 功    能:读取DS1302时钟数据
 说    明:先写地址/命令,后读数据(时钟多字节方式)
 调    用:W_Byte() , R_Byte()
 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                             7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
***********************************************************************/
void BurstR1302T(unsigned char *Cdata)
{
    unsigned char i;
	CLEAR_RST();
	CLEAR_CLK();
    SET_RST();
    W_Byte(0xbf);             /* 0xbf:时钟多字节读命令 */
    for (i=0;i<8;i++) 
    {
       *Cdata = R_Byte();   /* 读1Byte数据 */
       Cdata++;
    }
    SET_CLK();
    CLEAR_RST();
}
/******************************************************************** 

 函 数 名:BurstW1302R()
 功    能:往DS1302寄存器数写入数据(多字节方式)
 说    明:先写地址,后写数据(寄存器多字节方式)
 调    用:W_Byte()
 入口参数:pWReg: 寄存器数据地址
 返 回 值:无
***********************************************************************/
void BurstW1302R(unsigned char *Cdata)
{
    unsigned char i;
    W_1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
	CLEAR_RST();
	CLEAR_CLK();
    SET_RST();
    W_Byte(0xfe);         /* 0xbe:时钟多字节写命令 */
    for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
    {
        W_Byte(*Cdata);    /* 写1Byte数据*/
        Cdata++;
    }
    SET_CLK();
    CLEAR_RST();
} 
/******************************************************************** 

 函 数 名:BurstR1302R()
 功    能:读取DS1302寄存器数据
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:W_Byte() , R_Byte()
 入口参数:pRReg: 寄存器数据地址
 返 回 值:无
***********************************************************************/
void BurstR1302R(unsigned char *Cdata)
{
    unsigned char i;
    CLEAR_RST();
	CLEAR_CLK();
	SET_RST();
    W_Byte(0xff);            /* 0xff:时钟多字节读命令 */
    for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
    {
        *Cdata = R_Byte();  /* 读1Byte数据 */
        Cdata++;
    }
    SET_CLK();
    CLEAR_RST();
}
/******************************************************************** 

 函 数 名:Set_1302()
 功    能:设置初始时间
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:W1302()
 入口参数:pClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                            7Byte (BCD码)	1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
***********************************************************************/
void Set_1302(unsigned char *pClock) 
{
    unsigned char i;
    unsigned char Addr = 0x80; 
    W_1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
    for(i=0;i<7;i++)
    { 
        W_1302(Addr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        Addr +=2;
    }
    W_1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 

 函 数 名:Get_1302()
 功    能:读取DS1302当前时间
 说    明:
 调    用:R1302() 
 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
                                        7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
 返 回 值:无
***********************************************************************/
void Get_1302(unsigned char *Pclock) 
{
    unsigned char i;
    unsigned char Addr = 0x81;
    for (i=0; i<7; i++)
    {
        *Pclock++ = R_1302(Addr);/*格式为: 秒 分 时 日 月 星期 年 */
        Addr += 2;
    }
}
void Set_charge(void)
{
 	 unsigned char Addr=0x90;
	 W_1302(Addr,0xA6);    //10100110    diode is one  resistor is 4K
}
void delay_1(void)
{
  	 unsigned char i;
	 for(i=0;i<5;i++);
}
void CLOCK(void)
{ 
     SET_CLK();
     delay_1();
     CLEAR_CLK();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -