View Single Post
Old 18-09-2007, 03:43 PM   #11
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
Tham gia ngày: Jun 2005
Bài gửi: 141
:
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;
    }
  }
}

thay đổi nội dung bởi: namqn, 19-09-2007 lúc 02:48 AM. Lý do: định dạng lại code
tinhthanthep vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn