![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#4 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
code của bạn: Code:
#include "16F887.h" #include "def_877a.h" //*************cấu hình PIC ********************* # fuses NOWDT, HS, NOPROTECT, NOLVP, PUT//thêm vào # use delay (clock = 20000000)//thêm vào //******************************************** #include "lcd.c" //File nay co san trong CCS int8 second, minute, hour, date, day, month, year; int16 year1; int i; // ------- Chuyen du lieu mã BINARY cua MASTER -> du lieu mã BCD cho DS1307-------- int DECIMALtoBCD(int data) // MASTER -> DS1307 { // x -> y trong do x la du lieu cua MASTER, y la du lieu sau khi chuyen doi // Thuat toan thuc hien bien doi tu ma DECIMAL sang ma BCD he 10 int x, y, z; x = data; if(x<10) // vd: (x=9) -> (y=9) = 0x09 { y = x; } else if(x>=10) // vd: (x=29) -> (y=41) = 0x29 { y = (x/10 * 6) + x; } return y; } // ------- Chuyen du lieu mã BCD cua DS1307 -> du lieu mã BINARY cho MASTER------- int BCDtoDECIMAL(int data) // MASTER <- DS1307 { // x <- y trong do y la du lieu cua SLAVE, x la du lieu sau khi chuyen doi // Thuat toan thuc hien bien doi tu ma BCD he 10 sang ma DECIMAL int x,y,z; y = data; i=0; if(y<10) // vd: (x=9) <- (y=9) = 0x09 { x = y; } else if(y>=10) // vd: (x=10) <- (y=16) = 0x10 { do { x = y - (6 * i); z = (x/10 * 6) + x; i++; } while(z!=y); } return x; } #int_EXT void set_time() { // --------- Khoi tao hien thi ban dau: SAT, 15-10-2011, 07:30:00 -------- second = 0; //Giay: 00 minute = 30; //Phut: 30 hour = 7; //Gio: 07 (che do 24h) day = 7; //Thu 7: SAT (SATURDAY) date = 15; //Ngay: 15 month = 10; //Thang: 10 year = 11; //Nam: 11 // Ghi gia tri vao slave i2c_start(); // Bat dau ghi du lieu vao Slave i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) ) i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307 i2c_write(DECIMALtoBCD(second)); // Ghi gia tri BCD giay vao thanh ghi 0x00 i2c_write(DECIMALtoBCD(minute)); // Ghi gia tri BCD phut vao thanh ghi 0x01 i2c_write(DECIMALtoBCD(hour)); // Ghi gia tri BCD gio vao thanh ghi 0x02 i2c_write(DECIMALtoBCD(day)); // Ghi gia tri BCD thu vao thanh ghi 0x03 i2c_write(DECIMALtoBCD(date)); // Ghi gia tri BCD ngay vao thanh ghi 0x04 i2c_write(DECIMALtoBCD(month)); // Ghi gia tri BCD thang vao thanh ghi 0x05 i2c_write(DECIMALtoBCD(year)); // Ghi gia tri BCD nam vao thanh ghi 0x06 i2c_write(0x10); // Ghi gia tri vao thanh ghi 0x07 de tao xung vuong 1Hz i2c_stop(); // Ket thuc ghi du lieu } void update_time() { // Doc du lieu tu Slave i2c_start(); // Bat dau doc du lieu tu Slave i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) ) i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307 i2c_start(); // Dieu kien Restart i2c_write(0xD1); second = BCDtoDECIMAL(i2c_read()); // Doc gia tri giay tu thanh ghi 0x00 cua DS1307 minute = BCDtoDECIMAL(i2c_read()); // Doc gia tri phut tu thanh ghi 0x01 cua DS1307 hour = BCDtoDECIMAL(i2c_read()); // Doc gia tri gio tu thanh ghi 0x02 cua DS1307 day = BCDtoDECIMAL(i2c_read()); // Doc gia tri thu tu thanh ghi 0x03 cua DS1307 date = BCDtoDECIMAL(i2c_read()); // Doc gia tri ngay tu thanh ghi 0x04 cua DS1307 month = BCDtoDECIMAL(i2c_read()); // Doc gia tri thang tu thanh ghi 0x05 cua DS1307 year = BCDtoDECIMAL(i2c_read(0)); // Doc gia tri nam tu thanh ghi 0x06 cua DS1307 i2c_stop(); // Ket thuc doc du lieu } void display_LCD() { // --------------- Hàng 1 cua LCD: hien thi thu. ngay - thang - nam --------- lcd_gotoxy(1,1); // Bat dau o hang 1, cot 1 if(day==2) lcd_putc("Mon"); // Hien thi thu o hang 1, cot 1 else if(day==3) lcd_putc("Tue"); else if(day==4) lcd_putc("Wed"); else if(day==5) lcd_putc("Thu"); else if(day==6) lcd_putc("Fri"); else if(day==7) lcd_putc("Sat"); else if(day==1) lcd_putc("Sun"); lcd_gotoxy(4,1); // Nhay sang hang 1, cot 4 lcd_putc("."); // Hien thi dau "." o hang 1, cot 4 lcd_gotoxy(6,1); // Nhay sang hang 1, cot 6 if(date<10) { lcd_putc("0"); // Hien thi so 0 o hang 1, cot 6 lcd_gotoxy(7,1); // Nhay sang hang 1, cot 7 printf(lcd_putc,"%d", date); // Hien thi thang o hang 1, cot 7 } else if(date>=10) { printf(lcd_putc,"%d", date); } lcd_gotoxy(8,1); // Nhay sang hang 1, cot 8 lcd_putc("-"); // Hien thi dau "-" o hang 1, cot 8 lcd_gotoxy(9,1); // Nhay sang hang 1, cot 9 if(month==1) lcd_putc("Jan"); // Hien thi thang o hang 1, cot 9 else if(month==2) lcd_putc("Feb"); else if(month==3) lcd_putc("Mar"); else if(month==4) lcd_putc("Apr"); else if(month==5) lcd_putc("May"); else if(month==6) lcd_putc("Jun"); else if(month==7) lcd_putc("Jul"); else if(month==8) lcd_putc("Aug"); else if(month==9) lcd_putc("Sep"); else if(month==10) lcd_putc("Oct"); else if(month==11) lcd_putc("Nov"); else if(month==12) lcd_putc("Dec"); lcd_gotoxy(12,1); // Nhay sang hang 1, cot 12 lcd_putc("-"); // Hien thi dau "-" o hang 1, cot 12 lcd_gotoxy(13,1); // Nhay sang hang 1, cot 13 year1 = 2000 + year; printf(lcd_putc,"%ld", year1); // Hien thi nam o cac cot 13,14,15,16 // --------------- Hàng 2 cua LCD: hien thi gio : phut : giay --------- lcd_gotoxy(6,2); // Nhay xuong hang 2, cot 6 if(hour<10) // Gio { lcd_putc("0"); lcd_gotoxy(7,2); printf(lcd_putc,"%d", hour); } else if(hour>=10) { printf(lcd_putc,"%d", hour); } lcd_gotoxy(8,2); lcd_putc(":"); lcd_gotoxy(9,2); // Nhay sang hang 2, cot 9 if(minute<10) // Phut { lcd_putc("0"); lcd_gotoxy(10,2); printf(lcd_putc,"%d", minute); } else if(minute>=10) { printf(lcd_putc,"%d", minute); } lcd_gotoxy(11,2); lcd_putc(":"); lcd_gotoxy(12,2); // Nhay sang hang 2, cot 12 if(second<10) // Giay { lcd_putc("0"); lcd_gotoxy(13,2); printf(lcd_putc,"%d", second); } else if(second>=10) { printf(lcd_putc,"%d", second); } } void main() { setup_adc_ports(NO_ANALOGS|VSS_VDD); setup_adc(ADC_OFF); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); //Setup_Oscillator parameter not selected from Intr Oscillator Config tab // TODO: USER CODE!! lcd_init(); delay_ms(10); while(TRUE) { update_time(); display_LCD(); } }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. thay đổi nội dung bởi: tdm, 27-08-2011 lúc 08:02 PM. Lý do: chèn thêm code |
|
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|