|
#include
#include //寄存器宏定义
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
#define unit unsigned int
#define uchar unsigned char
#define SCLKH PORTB|=(1<
#define SCLKL PORTB&=~(1<
#define DIOH PORTB|=(1<
#define DIOL PORTB&=~(1<
#define CEH PORTB|=(1<
#define CEL PORTB&=~(1<
//数码管字型表,对应0,1,2,3,4,5,6,7,8,9,后十位数是带小数点的0-9//
uchar Table[22]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff} ;
uchar Data[6]={1,2,3,4,5,6} ; //显示初始值:0 0 0 0 0 0
//位寻址寄存器定义
uchar a;
int b,c,d;
//管脚定义
//地址、数据发送子程序
void Write1302 ( uchar addr,uchar dat )
{ unsigned char i;uchar temp;
DDRB=0XFF;
PORTB &= ~(1<
PORTB |= (1<
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
temp = addr;
if(temp&0x01)
{ PORTB|= (1<
else
{ PORTB&= ~(1<
PORTB|= (1<
addr >>= 1; //右移一位
PORTB&= ~(1<
}
//发送数据
for ( i=8; i>0; i-- )
{
PORTB&= ~(1<
temp = dat;
if(temp&0x01)
{ PORTB|= (1<
else
{ PORTB&= ~(1<
dat >>= 1;
PORTB|= (1<
_delay_loop_2(8*250);
}
PORTB&= ~(1<
}
//数据读取子程序
unsigned char Read1302 ( unsigned char addr )
{
unsigned char i,temp,dat1,dat2,dat3;
DDRB=0XFF;
PORTB&= ~(1<
PORTB|= (1<
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
temp = addr;
if(temp&0x01)
{ PORTB|= (1<
else
{ PORTB&= ~(1<
PORTB|= (1<
addr >>= 1; //右移一位
PORTB&= ~(1<
}
//读取数据
DDRB=0XFD;
for ( i=0; i<8; i++ )
{
a>>1;
PORTB&= ~(1<
if(PINB&0X02)
a|= 0x80;
else
a&=0x7F;
PORTB|= (1<
}
PORTB&=~(1<
dat1=a;
// dat2=dat1/16; //数据进制转换
// dat3=dat1%16; //十六进制转十进制
//dat1=dat3+dat2*10;
return (dat1);
}
//初始化DS1302
void Initial(void)
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x65); //秒位初始化
Write1302 (WRITE_MINUTE,0x34); //分钟初始化
Write1302 (WRITE_HOUR,0x12); //小时初始化
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
int main(void)
{int i;
DDRA=0XFF;
PORTA=0XFF;
DDRB=0XFF;
PORTB=0XFF;
DDRC=0XFF;
PORTC=0XFF;
void Initial(void);
while(1)
{b=Read1302(READ_HOUR );
Data[0]=b>>4;
Data[1]=b&0X0F;
c= Read1302(READ_MINUTE );
Data[2]=c>>4;
Data[3]=c&0X0F;
d= Read1302(READ_SECOND );
Data[4]=d>>4;
Data[5]=d&0X0F;
for(i=0;i<6;i++)
{
PORTC=~(1<
PORTA=Table[Data];
_delay_loop_2(20*250);
}
}
}
|
|