#define SCLK_RT(n) {PORTF=((PORTF&0XEF)^(n<<4));}
#define DIO_RT(n) {PORTF=((PORTF&0XDF)^(n<<5));}
#define RST_RT(n) {PORTF=((PORTF&0XBF)^(n<<6));}
//寄存器宏定义
#define W_SEC 0x80
#define W_MIN 0x82
#define W_HOUR 0x84
#define R_SEC 0x81
#define R_MIN 0x83
#define R_HOUR 0x85
#define W_PROTECT 0x8E
/***********************************DS1302******************************************/
void Write_RT(unsigned char add,unsigned char dat)
{
unsigned char i;
RST_RT(0);
SCLK_RT(0);
RST_RT(1); //允许操作芯片
for(i=0;i<8;i++) //送地址
{
SCLK_RT(0);
DIO_RT((add&0x01)?1:0);
add=(add>>1);
SCLK_RT(1);
}
for(i=0;i<8;i++) //送数据
{
SCLK_RT(0);
DIO_RT((dat&0x01)?1:0);
dat=(dat>>1);
SCLK_RT(1);
}
RST_RT(0);
}
unsigned char Read_RT(unsigned char add)
{
unsigned char i,dat;
RST_RT(0);
SCLK_RT(0);
RST_RT(1); //允许操作芯片
for(i=0;i<8;i++) //送地址
{
SCLK_RT(0);
DIO_RT((add&0x01)?1:0);
add=(add>>1);
SCLK_RT(1);
}
DDRF=0XDF; //PORTD为输入
dat=0;
for(i=0;i<8;i++) //读数据
{
dat=(dat|((PORTF&0x20)?0x80:0x00));
SCLK_RT(1);
dat=(dat>>1);
SCLK_RT(0);
}
DDRF=0XFF; //PORTD为输出
return(((dat/16)*10)+(dat%16));
RST_RT(0);
}
void Init_RT(void)
{
Write_RT(W_PROTECT,0X00); //禁止写保护
Write_RT(W_SEC,0x11); //秒位初始化
Write_RT(W_MIN,0x11); //分钟初始化
Write_RT(W_HOUR,0x11); //小时初始化
Write_RT(W_PROTECT,0x80); //允许写保护
}
主函数里
Init_RT();
while(1)
{
sec=Read_RT(R_SEC);
min=Read_RT(R_MIN);
hour=Read_RT(R_HOUR);
show_word(0x80,(hour/10+'0'),(hour%10+'0'));
show_word(0x90,(min/10+'0'),(min%10+'0'));
show_word(0x88,(sec/10+'0'),(sec%10+'0'));
}
应该没错啊,求指教 |