?? ds1302._h
字號:
//#include <iom16v.h>
//復位腳
#define RST_CLR PORTE&=~(1<<PE4)
#define RST_SET PORTE|=(1<<PE4)
#define RST_IN DDRE&=~(1<<PE4)
#define RST_OUT DDRE|=(1<<PE4)
//雙向數據
#define IO_CLR PORTE&=~(1<<PE3)
#define IO_SET PORTE|=(1<<PE3)
#define IO_R PINE&(1<<PE3)
#define IO_IN DDRE&=~(1<<PE3)
#define IO_OUT DDRE|=(1<<PE3)
//時鐘信號
#define SCK_CLR PORTE&=~(1<<PE2)
#define SCK_SET PORTE|=(1<<PE2)
#define SCK_IN DDRE&=~(1<<PE2)
#define SCK_OUT DDRE|=(1<<PE2)
#define ds1302_sec_add 0x80 //秒數據地址
#define ds1302_min_add 0x82 //分數據地址
#define ds1302_hr_add 0x84 //時數據地址
#define ds1302_date_add 0x86 //日數據地址
#define ds1302_month_add 0x88 //月數據地址
#define ds1302_day_add 0x8a //星期數據地址
#define ds1302_year_add 0x8c //年數據地址
#define ds1302_control_add 0x8e //控制數據地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
unsigned char time_buf[8] = {0x20,0x08,0x03,0x21,0x20,0x20,0x00,0x02};
/*向DS1302寫入一字節數據*/
void ds1302_write_byte(unsigned char addr, unsigned char d)
{
unsigned char i;
RST_SET; /*啟動DS1302總線*/
/*寫入目標地址:addr*/
IO_OUT;
addr = addr & 0xFE;/*最低位置零*/
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
IO_SET;
}
else {
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}
/*寫入數據:d*/
IO_OUT;
for (i = 0; i < 8; i ++) {
if (d & 0x01) {
IO_SET;
}
else {
IO_CLR;
}
SCK_SET;
SCK_CLR;
d = d >> 1;
}
RST_CLR; /*停止DS1302總線*/
}
/*從DS1302讀出一字節數據*/
unsigned char ds1302_read_byte(unsigned char addr) {
unsigned char i;
unsigned char temp;
RST_SET; /*啟動DS1302總線*/
/*寫入目標地址:addr*/
IO_OUT;
addr = addr | 0x01;/*最低位置高*/
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
IO_SET;
}
else {
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}
/*輸出數據:temp*/
IO_IN;
for (i = 0; i < 8; i ++) {
temp = temp >> 1;
if (IO_R) {
temp |= 0x80;
}
else {
temp &= 0x7F;
}
SCK_SET;
SCK_CLR;
}
RST_CLR; /*停止DS1302總線*/
return temp;
}
/*向DS302寫入時鐘數據*/
void ds1302_write_time(void) {
ds1302_write_byte(ds1302_control_add,0x00); //關閉寫保護
ds1302_write_byte(ds1302_sec_add,0x80); //暫停
//ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充電
ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_hr_add,time_buf[4]); //時
ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_control_add,0x80); //打開寫保護
}
/*從DS302讀出時鐘數據*/
void ds1302_read_time(void) {
time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
time_buf[4]=ds1302_read_byte(ds1302_hr_add); //時
time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
}
/*DS302初始化函數*/
void ds1302_init(void) {
RST_CLR; /*RST腳置低*/
SCK_CLR; /*SCK腳置低*/
RST_OUT; /*RST腳設置為輸出*/
SCK_OUT; /*SCK腳設置為輸出*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -