Mr.Bi |
15-06-2008 12:02 PM |
Trích:
Nguyên văn bởi nguyendungdt12
(Post 16808)
làm mãi mà vẫn khong thiết lập được chán ghê, có bác nào giúp cho tiểu đệ 1 đoạn code để khởi taịo cho ds1307 giá trị đầu và nó chạy luôn mà không cần nút chỉnh bên ngoài không nhỉ? Em dung pic 16F877a và CCS
|
nè u ! làm gì mà than vãn ghê z thế
Code:
#include <16F877A.h>
#fuses NOPROTECT,HS,NOWDT,NOLVP,NODEBUG,NOPUT
#use delay(clock =20000000)
#use i2c(master,fast,sda=PIN_C4,scl=PIN_C3)
#define mode RE0
#define change RE1
#define IR RE2
// 0 1 2 3 4 5 6 7 8 9
unsigned char const maled[10] = {0x01,0xCF,0x92,0x86,0xCC,0xA4,0xA0,0x8F,0x80,0x04};
unsigned char sec,min,hour,dow,date,month,year; // bien data trong RTC
unsigned char day1,day2,month1,month2,year1,year2,hour1,hour2,min1,min2,sec1,sec2; // bien xuat data
unsigned char hour_wait1,hour_wait2,min_wait1,min_wait2;
unsigned char i=0;
unsigned int var_IR=0;
//------------ham thu tin hieu Sony------------------------
void scan_IR()
{ if (!IR) { delay_ms(1);
if(!IR){ RB1= RB2 = 1 ; // tat 2 led
while(!IR) continue ; // trong khi IR van muc 0 thi wait de doi sang muc 1
while(IR) continue ; // neu IR chuyen sang muc 1 thi wait tiep
delay_us(750);
for(i=1;i<=12;i++)
{ //if(IR==0){ bit_set(var_IR,i) ; };
//if(IR!=0){ bit_clear(var_IR,i); };
if(IR==0){ (var_IR ||0x01)<<i; };
if(IR!=0){ (var_IR ||0x01)<<i; };
while(!IR) continue ;
while(IR) continue ;
delay_us(750);
};
};
};
}
void test_IR()
{ for(i=0;i<=12;i++)
{
if(bit_test(var_IR,i)==1)
{RB1 = 0 ;delay_ms(1000); // bat led day1
RB1 = 1 ;delay_ms(1000);
};
if(bit_test(var_IR,i)==0)
{RB2 = 0;delay_ms(1000); // bat led day2
RB2 = 1;delay_ms(1000);
};
};
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++
//------------ cac ham lien quan den RTC--------------------
void init_time()
{ I2C_start(); // gui bit start
I2C_write(0xD0); // gui lenh write
I2C_write(0x07); // den dia chi 07H de
I2C_write(0x10); // cau hinh cho thanh ghi 07H
I2C_stop();
I2C_start();
I2C_write(0xD0);
I2C_write(0x00); // dia chi 00h
I2C_write(0x00); // nap gia tri cho thanh ghi giay = 0 , dong thoi xoa bit CH
I2C_write(0x01); // cho thanh ghi phut = 1
I2C_write(0x11); // chon mode 24h cho thanh ghi gio & nap gia tri la 11h
I2C_write(0x02); // thu 2
I2C_write(0x15); // ngay 15
I2C_write(0x06); // thang 6
I2C_write(0x08); // nam 2008 , nhap gia tri 2 so cuoi cua nam
i2c_read(0);
I2C_stop();
}
void up_date1307()
{
}
void update_time()
{I2C_start();
I2C_write(0xD0); // gui lenh ghi
I2C_write(0x00); // dia chi bat dau
I2C_start();
I2C_write(0xD1); // gui lenh doc
sec=i2c_read(1);
min=i2c_read(2);
hour=i2c_read(3);
dow =i2c_read(4);
date=i2c_read(5);
month=i2c_read(6);
year=i2c_read(7);
i2c_read(0);
i2c_stop();
sec1 = sec & 0x0F;
sec2 = (sec & 0xF0)>>4;
min1 = min & 0x0F;
min2 = (min & 0xF0)>>4;
hour1 = hour & 0x0F;
hour2 = (hour & 0xF0)>>4;
day1 = date & 0x0F ;
day2 = (date & 0xF0)>>4;
month1= month & 0x0F ;
month2= (month & 0xF0)>>4;
year1 = year & 0x0F ;
year2 = (year & 0xF0)>>4;
}
#int_ext
void read_time()
{ I2C_start();
I2C_write(0xD0);
I2C_write(0x00); // xoa bit CH
I2C_start();
I2C_write(0xD1);
sec = I2C_read(0x00);
I2C_stop();
if(sec==0) update_time();
sec1 = sec & 0x0F;// lay 4 bit thap
sec2 = (sec & 0xF0) >> 4 ;
}
void display()
{ PORTD = maled[sec1] ;RC6=0 ; delay_us(50); RC6=1 ;
PORTD = maled[sec2] ;RC5=0 ; delay_us(50); RC5=1 ;
PORTD = maled[min1] ;RC2=0 ; delay_us(50); RC2=1 ;
PORTD = maled[min2] ;RC1=0 ; delay_us(50); RC1=1 ;
PORTD = maled[hour1];RB7=0 ; delay_us(50); RB7=1 ;
PORTD = maled[hour2];RC0=0 ; delay_us(50); RC0=1 ;
PORTD = maled[day1]; RB2=0 ; delay_us(50); RB2=1 ;
PORTD = maled[day2]; RB1=0 ; delay_us(50); RB1=1 ;
PORTD = maled[month1];RB4=0; delay_us(50); RB4=1 ;
PORTD = maled[month2];RB3=0; delay_us(50); RB3=1 ;
PORTD = maled[year1];RB6=0 ; delay_us(50); RB6=1 ;
PORTD = maled[year2];RB5=0 ; delay_us(50); RB5=1 ;
}
main()
{ set_tris_A(0b0000000); PORTA = 0b00001111;
set_tris_B(0b00000001); PORTB = 0b11111111; // tat led 1-9
set_tris_C(0b00011000); PORTC = 0b11100111;
set_tris_D(0x00); PORTD = 0xFF;
set_tris_E(0xFF); PORTE = 0xFF;
delay_ms(500);
init_time();
GIE = 1; // cho phep ngat xay ra
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
while(1)
{display();
};
}
code chạy rùi đóa , nhưng ko hỉu sao khi giây về 00 thì tất cả các led đều nháy nháy ( khó chịu chỗ này lám , giống như ta quét led với tốc độ chậm í) wa 3s thì nó mới quét lại đúng thời gian 50ms . Tui cũng ko hỉu làm sao nữa . Nhưng nói chung thỏa mãn kì vọng khởi tạo DS1307 rùi đóa
|