Trích:
Nguyên văn bởi tnt_bkfet
(Post 49015)
Code và mô phỏng, bạn xem giúp mình với. Mô phỏng thì chạy tốt mỗi tội đưa ra test thử trên mạch thì không chạy.
Thanks!
|
chưa cấu hình cho PIC thì làm sao nó chạy được.
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();
}
}
|