这是AVR驱动DS1302的源码,同样是在数码管上显示。源码如下:
#include<mega16.h>
#include<delay.h>
#define DS1302_PORT PORTC
#define DS1302_DDR DDRC
#define DS1302_PIN PINC
#define T_RST 0 //pc0
#define T_IO 1 //pc1
#define T_CLK 2 //pc2
#define SETBIT(x,y) (x|=(1<<y))//set appoint bit high
#define CLRBIT(x,y) (x&=(~(1<<y)))//set appoint bit low
#define CHKBIT(x,y) (x&(1<<y))//get appoint bit level
//write one byte data to ds1302
void ds1302_write_a_byte(unsigned char ucDa)
{
unsigned char i;
for(i=8; i>0; i--)
{
CLRBIT(DS1302_PORT,T_CLK);//set PC2 low
if (ucDa&1) SETBIT(DS1302_PORT,T_IO);//set PC1 high
else CLRBIT(DS1302_PORT,T_IO);//set PC1 low
SETBIT(DS1302_PORT,T_CLK);//set PC2 high
ucDa>>=1;
}
}
//read one byte data from ds1302
unsigned char ds1302_read_a_byte(void)
{
unsigned char i,t=0;
CLRBIT(DS1302_DDR,T_IO);//set pc1 input
CLRBIT(DS1302_PORT,T_IO);//set PC1 low(high resistance)
for(i=8; i>0; i--)
{
t>>=1;
SETBIT(DS1302_PORT,T_CLK);
delay_us(1);//can't remove!
CLRBIT(DS1302_PORT,T_CLK);
delay_us(1);//can't remove!
if(CHKBIT(DS1302_PIN,T_IO))t|=0x80;
}
SETBIT(DS1302_DDR,T_IO);//set pc1 OUTPUT
return(t);
}
//write data to appoint address
void write_1302(unsigned char ucAddr, unsigned char ucDa)
{
CLRBIT(DS1302_PORT,T_RST);
CLRBIT(DS1302_PORT,T_CLK);
SETBIT(DS1302_PORT,T_RST);
ds1302_write_a_byte(ucAddr);
CLRBIT(DS1302_PORT,T_CLK);
ds1302_write_a_byte(ucDa);
CLRBIT(DS1302_PORT,T_CLK);
CLRBIT(DS1302_PORT,T_RST);
}
//read data from appoint address
unsigned char read_1302(unsigned char ucAddr)
{
unsigned char ucDa;
CLRBIT(DS1302_PORT,T_RST);
CLRBIT(DS1302_PORT,T_CLK);
SETBIT(DS1302_PORT,T_RST);
ds1302_write_a_byte(ucAddr);
ucDa = ds1302_read_a_byte();
CLRBIT(DS1302_PORT,T_CLK);
CLRBIT(DS1302_PORT,T_RST);
return(ucDa);
}
//get data from ds1302
void v_Get1302(unsigned char ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime = read_1302(ucAddr);
ucAddr += 2;
}
CLRBIT(DS1302_PORT,T_CLK);
}
//init ds1302
void initialize_1302(void)
{
SETBIT(DS1302_PORT,T_CLK);
SETBIT(DS1302_PORT,T_IO);
SETBIT(DS1302_PORT,T_RST);
SETBIT(DS1302_DDR,T_CLK);
SETBIT(DS1302_DDR,T_IO);
SETBIT(DS1302_DDR,T_RST);
delay_us(1);//can't remove!
write_1302(0x8e,0x00);
write_1302(0x90,0xA5);
write_1302(0x80,0x00);
}
void display(unsigned char number,unsigned char position)//digtial show function
{
DDRA=0Xff;//set PORTA output
 ORTA=0XFF;//set PORTA output in high level
switch(position)//choice the position
{
case 1:{PORTA&=0xf8;break;}
case 2:{PORTA&=0xf9;break;}
case 3:{PORTA&=0Xfa;break;}
case 4:{PORTA&=0Xfb;break;}
case 5:{PORTA&=0Xfc;break;}
case 6:{PORTA&=0Xfd;break;}
case 7:{PORTA&=0Xfe;break;}
case 8:{PORTA&=0Xff;break;}
}
switch(number)//show number
{
case 0:{PORTA&=0x87;break;} //0
case 1:{PORTA&=0x8f;break;} //1
case 2:{PORTA&=0x97;break;} //2
case 3:{PORTA&=0x9f;break;} //3
case 4:{PORTA&=0xa7;break;} //4
case 5:{PORTA&=0xaf;break;} //5
case 6:{PORTA&=0xb7;break;} //6
case 7:{PORTA&=0xbf;break;} //7
case 8:{PORTA&=0xc7;break;} //8
case 9:{PORTA&=0xcf;break;} //9
default:{PORTA=0xff;break;} //null
}
}
//only 24 hours system
//change data from bin to dec
void revise(unsigned char t[7])
{
unsigned char t1,t2,temp,i;
for(i=0;i<7;i++)
{
temp=t;
temp<<=4;
temp>>=4;
t1=temp;
temp=t;
if(i!=2)temp>>=4;
else
{
temp<<=1;
temp>>=5;
}
t2=temp;
t=t1+t2*10;
}
}
void main()
{
unsigned char t1,t2;
unsigned char temp[7];
initialize_1302();
write_1302(0x8e,0x00);//set vialib
write_1302(0x80,0x33);//second set
write_1302(0x82,0x55);//minute set
write_1302(0x84,0x11);//hour set
write_1302(0x86,0x30);//day set
write_1302(0x88,0x05);//month set
write_1302(0x8a,0x03);//week set
write_1302(0x8c,0x07);//year set
write_1302(0x8e,0x80);//set unvialib
while(1)
{
v_Get1302(temp);
revise(temp);
t1=temp[0]%10;
t2=(temp[0]/10)%10;
display(t1,8);
delay_ms(1);
display(t2,7);
delay_ms(1);
t1=temp[1]%10;
t2=(temp[1]/10)%10;
display(t1,5);
delay_ms(1);
display(t2,4);
delay_ms(1);
t1=temp[2]%10;
t2=(temp[2]/10)%10;
display(t1,2);
delay_ms(1);
display(t2,1);
delay_us(500);
}
}
|