新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > PIC16F877A例程---DS1302程序

PIC16F877A例程---DS1302程序

作者: 時間:2016-11-24 來源:網絡 收藏

//檢查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讀一次

}

}


上一頁 1 2 下一頁

關鍵詞: PIC16F877ADS130

評論


技術專區(qū)

關閉