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

📄 ds1302._c

📁 使用mega16单片机对dallas公司的定时器芯片DS1302进行读取与写入的驱动程序
💻 _C
字号:
#include <iom16v.h>
#include <macros.h>

//秒
#define SEC_W 0x80
#define SEC_R 0x81

//分
#define MIN_W 0x82
#define MIN_R 0x83

//小时
#define HR_W 0x84
#define HR_R 0x85

//日期
#define DATE_W 0x86
#define DATE_R 0x87

//月
#define MONTH_W 0x88
#define MONTH_R 0x89

//星期几
#define DAY_W 0x8A
#define DAY_R 0x8B

//年
#define YEAR_W 0x8C
#define YEAR_R 0x8D

//控制写保护
#define CONTROL_W 0x8E
#define CONTROL_R 0x8F

//控制充电
#define TRIC_CHARGE_W 0x90
#define TRIC_CHARGE_R 0x91

//突发模式
#define CLOCK_BURST_W 0xBE
#define CLOCK_BURST_R 0xBF

//写入时钟控制信息
//SZRST--PD5
//SZSDA--PD6
//SZSCK--PD7
void SetDateTime(unsigned char cmd,unsigned char data)
{
    unsigned char i=0;
	PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
	DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
	PORTD|=0x20;//RESET为高 0010 0000
	for(i=0;i<8;i++)
	{
	    if(cmd&0x01)
		{
		    PORTD|=0x40;  //0100 0000
		}
		else
		{
		    PORTD&=0xBF;  //1011 1111
		} 
		PORTD|=0x80;    //1000 0000
		PORTD&=0x7F;    //0111 1111
		cmd=cmd>>1;
	}
	for(i=0;i<8;i++)
	{
	    if(data&0x01)
		{
		    PORTD|=0x40;//0100 0000
		}
		else
		{
		    PORTD&=0xBF;//1011 1111
		}
		PORTD|=0x80;//SZSCK=1;
		PORTD&=0x7F;//SZSCK=0;
		data=data>>1;
	}
	PORTD&=0xDF;//设置RESET为低
}


//读出时钟控制信息
//SZRST--PD5
//SZSDA--PD6
//SZSCK--PD7
unsigned char ReadDateTime(unsigned char cmd)
{
    unsigned char i=0;
	unsigned char code;//返回的数据值
	PORTD&=0x1F;//设置PD5~PD7为低 0001 1111
	DDRD|=0xE0;//设置PD5~PD7为输出 1110 0000
	PORTD|=0x20;//RESET为高 0010 0000
    for(i=0;i<8;i++)
	{
	    if(cmd&0x01)
		{
		    PORTD|=0x40;  //0100 0000
		}
		else
		{
		    PORTD&=0xBF;  //1011 1111
		} 
		PORTD|=0x80;    //1000 0000 SZSCK=1
		PORTD&=0x7F;//SZSCK=0;
		cmd=cmd>>1;
	}
	DDRD&=0xBF;//设置PD6(SZSDA)为输入模式
	for(i=0;i<8;i++)
	{
	    code=code>>1;
	    PORTD&=0x7F;//0111 1111 设置PD7(SZSCK)为低
		if(PIND&0x40)
		{
		    code|=0x80;
		}
		PORTD|=0x80;//SZSCK=1;
		PORTD&=0x7F;//SZSCK=0;
	}
	PORTD&=0xDF;//设置RESET为低 1101 1111
	return code;
}

//ASCII码转换为BCD码
//输入参数data为输入的数字
//返回值为BCD码表示的数字
unsigned char ASCIItoBCD(unsigned char data)
{
    unsigned char tmp;
    if(data>10)
    {
        tmp=data/10;
        data=data%10;
        data=(tmp<<4)|data;
    }
    return data;
}

//BCD码转换为ASCII码
//输入参数data为BCD码
//输入参数num为转换从最右边开始到第mask位结束
//返回值为ASCII表示的数字
unsigned char BCDtoASCII(unsigned char data,unsigned char mask)
{
    unsigned char tmp=0xff;
    tmp=tmp>>(8-mask);
    data=data&tmp;
    if(data>0x0f)
    {
        tmp=data&0x0f;
        data=data>>4;
        data=data*10+tmp;
    }
    return data;
}


void main()
{
    unsigned char data;
    SetDateTime(TRIC_CHARGE_W,0xA5);
    data=ReadDateTime(TRIC_CHARGE_R);
    while(1)
        ;
}

⌨️ 快捷键说明

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