vậy là từ bây giờ con ds1307 đã bắt đầu hoạt động và tự cập nhật dữ liệu về thời gian. chỉ khi nào hết pin nó mời ngừng hoạt động. Tiếp theo ta viết một chương trình đọc dữ liệu từ ds1307 rồi xuất ra màn hình LCD. Cứ 1s thì dữ liệu được cập nhật một lần và gửi ra màn hình LCD. Chương trình sẽ như sau:
Code:
/* KHAI BAO BIEN */
unsigned short second, minute, hour, day, date, month, year, flag_time;
char *day_txt;
/* KHOI TAO */
void INIT_MAIN() {
// Khoi tao cong A
PORTA = 0;
TRISA = 0xFF;
// Khoi tao cong B
PORTB = 0;
TRISB = 0xFF;
// Khoi tao cong D
PORTD = 0;
TRISD = 0;
// Khoi tao cong E
PORTE = 0;
TRISE = 0;
ADCON1 = 0xE;
// Khoi tao LCD
Lcd_Config(&PORTD,4,7,6,3,2,1,0);
Lcd_Cmd(Lcd_CLEAR);
Lcd_Cmd(Lcd_CURSOR_OFF);
// Khoi tao truyen thong I2C
I2C_Init(100000);
// Khoi tao ngat ngoai
INTCON = 0x90; // Mo ngat toan cuc, mo ngat ngoai, xoa co ngat ngoai, OPTION_REG = 0x87; // Chon suon len cho ngat ngoai
}
/* DOC DU LIEU RTC TU DS1307 */
void READ_RTC() {
I2C_Start();
I2C_Wr(0xD0);
I2C_Wr(0x00);
I2C_Repeated_Start();
I2C_Wr(0xD1);
second = I2C_Rd(1u);
minute = I2C_Rd(1u);
hour = I2C_Rd(1u);
day = I2C_Rd(1u);
date = I2C_Rd(1u);
month = I2C_Rd(1u);
year = I2C_Rd(1u);
I2C_Stop();
}
/* XU LY DU LIEU RTC */
void TRANSFORM_RTC() {
switch (day) {
case 1: day_txt = "ERO"; break;
case 2: day_txt = "T.2"; break;
case 3: day_txt = "T.3"; break;
case 4: day_txt = "T.4"; break;
case 5: day_txt = "T.5"; break;
case 6: day_txt = "T.6"; break;
case 7: day_txt = "T.7"; break;
case 8: day_txt = "C.N"; break;
}
}
/* HIEN THI LCD */
void BCD(unsigned short x, unsigned short y,unsigned short var) {
unsigned short var1, var2;
var1 = (var >> 4) + 0x30;
LCD_Chr(x,y,var1);
var2 = (var & 0x0F) + 0x30;
LCD_Chr_Cp(var2);
}
void LCD_DISPLAY() {
LCD_Out(1,1,day_txt);
BCD(1,5,date);
LCD_Chr_Cp('/');
BCD(1,8,month);
LCD_Out_Cp("/20");
BCD(1,13,year);
BCD(2,1,hour);
LCD_Chr_Cp(':');
BCD(2,4,minute);
LCD_Chr_Cp(':');
BCD(2,7,second);
LCD_Out(2,10,"T=");
BCD(2,12,temp);
LCD_Chr_Cp(223);
LCD_Chr_Cp('C');
}
void DISPLAY_TIME() {
READ_RTC();
TRANSFORM_RTC();
LCD_DISPLAY();
PORTE.F0 = ~PORTE.F0;
}
/* XU LY NGAT */
void interrupt() {
flag_time = 1;
INTCON.INTF = 0; // Xoa co ngat ngoai
}
/* CHUONG TRINH CHINH */
void MAIN() {
INIT_MAIN();
while(1) {
INTCON.INTE = 1;
if (flag_time == 1) {
DISPLAY_TIME();
flag_time = 0;
}
}
}