Trích:
Nguyên văn bởi tinhthanthep
Ban đầu, ds1307 chưa có giá trị nào cả trong các thanh ghi. Vì vậy, việc đầu tiên là phải nạp một giá trị bất kỳ cho các thanh ghi. Chương trình sau sẽ thực hiện công việc này. Sau này , bạn có thể dùng 4 nút bấm để hiệu chỉnh lại thời gian cho đúng với thực tế.
Code:
void INIT_MAIN() {
// Khoi tao truyen thong I2C
I2C_Init(100000); // Kích hoạt môddun truyền thông i2c với tốc độ baud là 100kHz
// Khoi tao DS1307
I2C_Start(); // điều kiện start
I2C_Wr(0xD0); // truyền địa chỉ của ds1307 và chọn ghi dữ liệu lên ds1307
I2C_Wr(0x00); // Truyền địa chỉ ô nhớ đầu tiên của ds1307
I2C_Wr(0x13); // Khoi tao gia tri ban dau cho thanh ghi giây
I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi phút
I2C_Wr(0x02); // Khoi tao gia tri ban dau cho thanh ghi giờ
I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi thứ
I2C_Wr(0x05); // Khoi tao gia tri ban dau cho thanh ghi ngày
I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi tháng
I2C_Wr(0x03); // Khoi tao gia tri ban dau cho thanh ghi năm
I2C_Wr(0x90); // đặt cấu hình cho thanh ghi điều khiển, sử dụng xung 1Hz.
I2C_Stop(); // Điều kiện stop
}
Chương trình chính
Code:
void MAIN() {
INIT_MAIN();
}
|
Chào các huynh !
Theo "lịch vạn niên" của Bác Thép, mình còn thắc mắc 1 điều, nhờ các Huynh xem giúp:
Trong hàm INIT_MAIN() có đoạn khởi tạo cho ds1307 như trên. Như thế cứ mỗi lần con PIC được cấp điện lại (mất điện lưới rồi có lại ấy !) thi đồng hồ lại bị Reset theo giá trị mình khởi tạo ban đầu cho nó. Thế hoá ra mỗi lần như vậy phải đi chỉnh lại giờ cho đồng hồ à !
Hay phải xử lý thế nào đây ? mong các Huynh chỉ giúp, xin cám ơn !