//檢查1302狀態(tài)
uchar check_ds1302(void)
{
ds1302_write(ds1302_control_add,0x80);
if(ds1302_read(ds1302_control_add)==0x80)
return 1;
return 0;
}
//向1302中寫入時鐘數據
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_add,0x00); //關閉寫保護
ds1302_write(ds1302_sec_add,0x80); //暫停
ds1302_write(ds1302_charger_add,0xa9); //涓流充電
ds1302_write(ds1302_year_add,timer[1]); //年
ds1302_write(ds1302_month_add,timer[2]); //月
ds1302_write(ds1302_date_add,timer[3]); //日
ds1302_write(ds1302_day_add,timer[7]); //周
ds1302_write(ds1302_hr_add,timer[4]); //時
ds1302_write(ds1302_min_add,timer[5]); //分
ds1302_write(ds1302_sec_add,timer[6]); //秒
ds1302_write(ds1302_control_add,0x80); //打開寫保護
}
//從1302中讀出當前時鐘
void ds1302_read_time(void)
{
timer[1]=ds1302_read(ds1302_year_add); //年
timer[2]=ds1302_read(ds1302_month_add); //月
timer[3]=ds1302_read(ds1302_date_add); //日
timer[7]=ds1302_read(ds1302_day_add); //周
timer[4]=ds1302_read(ds1302_hr_add); //時
timer[5]=ds1302_read(ds1302_min_add); //分
timer[6]=ds1302_read(ds1302_sec_add); //秒
}
//延時函數1
void delay_us(uchar i)
{
for(;i;i--);
}
//延時函數2
void delay(uint i)
{
uchar j;
for(;i;i--)
for(j=220;j;j--);
}
void timer0_init(void)
{
OPTION=0x07; //TMR0----256分頻
INTCON=0XA0; //開總中斷及TMR0計數溢出斷
TMR0=0xE8; //定時器初值
}
void interrupt TMR0INT()
{
T0IF=0;
TMR0=0xE8;
PORTD=0xff; //先關顯示
PORTA=0XFF;
PORTD=s[sel];
switch(sel)
{
case 0x00: PORTA=0XFD;break;
case 0x01: PORTA=0XFB;break;
case 0x02: PORTA=0XF7;break;
case 0x03: PORTA=0XEF;break;
}
if(++sel>3)sel=0;
}
//顯示數據轉換函數
void Process(void)//(uint i)
{
s[3]=Table[(timer[5]&0xF0)>>4];
s[2]=Table[(timer[5]&0x0F)]&0x7F; //初始化顯示數據,并將時分之間加小數點
s[1]=Table[(timer[6]&0xF0)>>4];
s[0]=Table[(timer[6]&0x0F)];
}
//主函數
void main(void)
{
uint n,m=0;
TRISA=0x00; //設置按鍵A口為帶上拉輸入;
PORTA=0xFF;
TRISD=0X00;
PORTD=0XFF;
TRISC=0x00; //定義B口為輸出
PORTC=0xff;
timer[1]=0x09; //年
timer[2]=0x08; //月
timer[3]=0x20; //日
timer[4]=0x12; //時
timer[5]=0x12; //分
timer[6]=0x00; //秒
timer[7]=0x04; //周
ds1302_write_time(); //寫入初始時鐘
timer0_init(); //設定定時器0
while(1)
{
ds1302_read_time(); //讀出當前時鐘
Process(); //顯示數據轉換
delay(100); //每100MS讀一次
}
}
評論