
程序:main函數:/*程序功能:DS1302實時時鐘顯示作者:朱波時間:2012年2月3日通信方式:3線串行通信使用說明:本程序模仿家用萬年歷,能夠進行時間的設定時間設定方法:1.按下設置鍵進入設置模式2.按選擇鍵對要設置的項進行選擇3.按加一鍵對選擇項加一4.完成全部選擇后出現(xiàn)"please check OK!"此時按下確定鍵就回到時間模式備注:可以通過主函數中的宏定義進行時間設置*/#include iom16v.h>#include macros.h>#include "delay.h" #include "display.h"#include "ds1302.h"#include "key.h"#define uchar unsigned char#define uint unsigned int//用于校準時間#define year 12//年份#define week 4//星期#define month 12//月#define daytime 23//日#define hour 12//小時#define minute 59//分鐘#define seconds 55//秒uint time_data[7]={year,week,month,daytime,hour,minute,seconds};
//年星期月日時分秒(設置初始時間)void main(){ int_init();//中斷初始化SEI();//開啟總中斷LCD_init();//1602液晶初始化SCK_OUT;//對時鐘進行操作將SCK設置成輸出RST_OUT;//對時鐘進行操作將RST設置成輸出set_rtc();//設置時間hour_mode(24);//時間顯示模式設定,12小時顯示沒有做好處理//只是注意此函數的寫法while(1){read_rtc();//讀取時間time_pro();//時間處理display();//顯示時間}}delay.c:#include"delay.h"void delay(unsigned int ms){unsigned int i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}delay.h:#ifndef delay_h#define delay_hextern void delay(unsigned int ms);#endifds1302.c:#include iom16v.h>#include macros.h>#include "key.h"#include "display.h"#define uchar unsigned char#define uint unsigned int#define SCK_CLR PORTA=~BIT(6)#define SCK_SET PORTA|=BIT(6)#define SCK_OUT DDRA|=BIT(6)#define RST_CLR PORTC=~BIT(7)#define RST_SET PORTC|=BIT(7)#define RST_OUT DDRC|=BIT(7)#define IO_CLR PORTA=~BIT(7)//IO引腳輸出低電平#define IO_SET PORTA|=BIT(7)//IO引腳輸出高電平#define IO_OUT DDRA|=BIT(7)//IO引腳設置為輸出#define IO_IN DDRA=~BIT(7)//IO引腳設置為輸入#define IO_R PINABIT(7)//IO引腳進行讀取操作extern int time_data[7];uchar write_add[7]={0X8C,0X8A,0X88,0X86,0X84,0X82,0X80};//寫地址(最低位為0)uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀地址(最低位為1)uchar table[];//用于計算void write_ds1302_byte(uchar dat)//在ds1302中寫指令字節(jié){uint i;IO_OUT;for(i=0;i8;i++)//一位一位往里寫,共寫8位{SCK_CLR;//開始時時序為0//先準備好數據,在給上升沿if(dat0x01)//如果數據位為1{IO_SET;//IO為1}else//如果數據位為0{IO_CLR;//IO為0}SCK_SET;//SCLK拉高開始傳輸數據dat=dat>>1;//移位進行下一個字節(jié)的傳輸(寫的時候放到后面)}}uchar read_ds1302(uchar add)//單字節(jié)讀{uchar i,value;//定義變量RST_CLR;SCK_CLR;//開始RET和SCLK時序為低RST_SET;//根據時序要傳輸命令write_ds1302_byte(add);//執(zhí)行完此句后,SCLK時序到下降沿處開始讀數據IO_IN;//IO設置成輸入for(i=0;i8;i++)//一個字節(jié)為8位,一位一位的讀{SCK_CLR;//時鐘拉低開始傳輸value=value>>1;//讀的時候放到前面if(IO_R)//讀的結果如果為1{value=value|0X80;//從低位開始讀取}SCK_SET;//時鐘拉高結束傳輸}//循環(huán)結束后SCLK時序到了最后,將RST拉低RST_CLR;return value;//將數據返回 }void write_ds1302(uchar add,uchar dat)//單字節(jié)寫(傳遞兩個參數一個是地址一個是數據){RST_CLR;NOP();SCK_CLR;//開始RET和SCLK時序為低RST_SET;//根據時序開始寫入東西時將RST拉高write_ds1302_byte(add);//寫入地址write_ds1302_byte(dat);//寫入數據RST_CLR;//根據時序,當寫完東西時RST拉低}
評論