![]() |
|
Tài trợ cho PIC Vietnam |
PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#24 | |
Đệ tử 1 túi
Tham gia ngày: Jul 2009
Bài gửi: 11
: |
Trích:
Tuy dùng Proteus mô phỏng ngon lành, nhưng mình test trên mạch thật thì gặp vấn đề này không giải thích được! Mong anh em giúp đỡ. Mình đặt giá trị cho DS1307: setDateDs1307(01, 02, 03, 04, 05, 06, 07); với mục đích hiển thị trên LCD là: Time: 03:02:01 Date: 05:06:07 Nhưng trên LCD lại hiển thị: Time: 05:03:00 Date: 07:00:00 Hic! Hiển thị sai rồi! Biết làm sao đây??? Code: //////////////////////////////////////////////////////////////////////////////// #include <16f877a.h> #include <def_877a.h> #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #include <lcd_lib_4bit.c> #use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9) #use i2c(Master,Fast,sda=PIN_A1,scl=PIN_A0) #use fast_io(b) #use fast_io(c) #use fast_io(d) #define DS1307_SDA PIN_A1 #define DS1307_SCL PIN_A0 //************************************************ int8 val_sec1, val_min1, val_hou1, val_dat1, val_mon1, val_yea1; int8 val_sec2, val_min2, val_hou2, val_dat2, val_mon2, val_yea2; //************************************************ void display_lcd(); //************************************************ #int_ext // Khai bao chuong trinh ngat RB0_isr() { display_lcd(); return input(PIN_B1); } //********************************************** int8 decToBcd(int8 val) { return ( (val/10*16) + (val%10) ); } //*********************************** int8 bcdToDec1(int8 val) { //Tach lay so hang chuc return (val/16*10); } //*********************************** int8 bcdToDec2(int8 val) { //Tach lay so hang don vi return (val%16); } //*********************************** void init_DS1307() { output_float(DS1307_SCL); //Bus free output_float(DS1307_SDA); //Bus free } //*********************************** void write_DS1307(byte address, byte data) { short int status; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_write(data); i2c_stop(); i2c_start(); status=i2c_write(0xd0); while(status==1) { i2c_start(); status=i2c_write(0xd0); } } //*********************************** BYTE read_DS1307(byte address) { BYTE data; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); data=i2c_read(0); i2c_stop(); return(data); } //*********************************** void setDateDs1307(int8 second, // 0-59 int8 minute, // 0-59 int8 hour, // 1-23 int8 dayOfWeek, // 1-7 int8 dayOfMonth, // 1-28/29/30/31 int8 month, // 1-12 int8 year) // 0-99 { write_DS1307(0x0, decToBcd(second)); delay_ms(10); write_DS1307(0x1, decToBcd(minute)); delay_ms(10); write_DS1307(0x2, decToBcd(hour)); delay_ms(10); write_DS1307(0x3, decToBcd(dayOfWeek)); delay_ms(10); write_DS1307(0x4, decToBcd(dayOfMonth)); delay_ms(10); write_DS1307(0x5, decToBcd(month)); delay_ms(10); write_DS1307(0x6, decToBcd(year)); } //*********************************** void display_lcd() { LCD_putcmd(0x80); Printf(LCD_putchar,"Time: "); LCD_putcmd(0xC0); Printf(LCD_putchar,"Date:"); //******************************************* val_sec1 = bcdToDec1(read_DS1307(0x00)); //So giay hang chuc val_sec2 = bcdToDec2(read_DS1307(0x00)); //So giay hang don vi val_min1 = bcdToDec1(read_DS1307(0x01)); val_min2 = bcdToDec2(read_DS1307(0x01)); val_hou1 = bcdToDec1(read_DS1307(0x02)); val_hou2 = bcdToDec2(read_DS1307(0x02)); val_dat1 = bcdToDec1(read_DS1307(0x04)); val_dat2 = bcdToDec2(read_DS1307(0x04)); val_mon1 = bcdToDec1(read_DS1307(0x05)); val_mon2 = bcdToDec2(read_DS1307(0x05)); val_yea1 = bcdToDec1(read_DS1307(0x06)); val_yea2 = bcdToDec2(read_DS1307(0x06)); //******************************************* //In lan luot cac so ra LCD LCD_putcmd(0x8E); Printf(LCD_putchar,"%u",val_sec1); LCD_putcmd(0x8F); Printf(LCD_putchar,"%u",val_sec2); LCD_putcmd(0x8A); Printf(LCD_putchar,"%u:",val_min1); LCD_putcmd(0x8B); Printf(LCD_putchar,"%u:",val_min2); LCD_putcmd(0x86); Printf(LCD_putchar,"%u:",val_hou1); LCD_putcmd(0x87); Printf(LCD_putchar,"%u:",val_hou2); LCD_putcmd(0xC6); Printf(LCD_putchar,"%u/",val_dat1); LCD_putcmd(0xC7); Printf(LCD_putchar,"%u/",val_dat2); LCD_putcmd(0xCA); Printf(LCD_putchar,"%u/",val_mon1); LCD_putcmd(0xCB); Printf(LCD_putchar,"%u/",val_mon2); LCD_putcmd(0xCE); Printf(LCD_putchar,"%u",val_yea1); LCD_putcmd(0xCF); Printf(LCD_putchar,"%u",val_yea2); } //*********************************** void main() { set_tris_b (0x01); set_tris_d (0x00); output_b (0x00); output_c (0x00); output_d (0x00); LCD_init(); //Khoi tao LCD LCD_putcmd(0x80); Printf(LCD_putchar,"Time: "); LCD_putcmd(0xC0); Printf(LCD_putchar,"Date:"); init_DS1307(); //Khoi tao DS1307 write_DS1307(0x07, 0x90); //Cau hinh thanh ghi cua DS1307 setDateDs1307(01, 02, 03, 04, 05, 06, 07); //Vi du Time: 03:02:01 Date: 05:06:07 enable_interrupts(GLOBAL); enable_interrupts(INT_ext); while (1) { } } //************************************************** ** //////////////////////////////////////////////////////////////////////////////// //************************************************** ** |
|
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Làm ơn giúp đỡ lập trình PIC với DS1307, EEPROM | enti | PIC - Thiết kế và Ứng dụng | 1 | 20-11-2006 06:19 PM |