PDA

View Full Version : Làm một cái đồng hồ điện tử mini thời gian thực với LCD


cuong86vt
21-06-2008, 04:08 AM
Sau đây mình xin post một loại bài nói về một ứng dụng của chức năng giao tiếp I2C kết hợp với IC đếm thời gian thực DS1307 để làm một cái đồng hồ mini (nói là cái đồng hồ mini cho hay thôi chứ làm 1 cái ứng dụng modun nhỏ cũng được) hiển thị thứ, ngày, tháng, năm, giờ, phút và giây. Cái hay khi ta làm đồng hồ đếm thời gian thực (chắc các bạn cũng đã biết) đó chính là bạn có thể biết thời gian hiện tại chính xác là bao nhiêu cho dù bạn ko bật nguồn cho cái đồng hồ này chạy (vì IC đếm thời gian thực luôn luôn chạy bằng cục PIN như đồng hồ điện tử casio vậy).
Mong các bạn ủng hộ theo dõi và góp ý để cùng nhau chúng ta làm cho cái đồng hồ này PRO hơn nhé !

cuong86vt
21-06-2008, 04:13 AM
Linh kiện mình cần làm cho một cái đồng hồ cũng ko nhiều: (mình đã làm thật 1 cái chạy được nhưng các bạn có thể dùng ít lk hơn mình tùy bạn).

Trước hết mình xin post sơ đồ mạch nguyên lý cái đồng hồ này để các bạn hình dung ra trước cái đồng hồ này cần tối thiểu những gì, sau đó mình sẽ post code và cố gẳng dẫn giải thật chi tiết để các bạn hiểu và làm có thể làm 1 cái đồng hồ khác tốt hơn của mình nhiều...

cuong86vt
21-06-2008, 04:24 AM
Còn đây là hình mô phỏng bằng Proteus khi đồng hồ chạy...
Mô phỏng Proteus chỉ có một chỗ thiếu sót là cái LCD LM016L này chỉ hiển thị được dòng 1 thôi vì mình chưa sữa lại địa chỉ cho nó, nhưng ko sao vì cái mạch thật mình đã làm hoàn toàn đúng và hình proteus chỉ có 1 nút nhấn ngắt ngoài, mình sẽ giải thích sau...

cuong86vt
21-06-2008, 04:57 AM
Để viết ct cho mạch, ta cần hiểu một chút về lý thuyết:

Mạch trên là sử dụng chức năng giao tiếp I2C của vdk, trong đó con PIC là MASTER, còn DS1307 là SLAVE, là loại IC đếm thời gian thực đời mới hỗ trợ phần cứng chỉ với 8 chân so với các loại DS khác trước đây thường dùng (vd như DS12887 có tới và khó điều khiển...), nhưng bù lại viết ct cho con này khá phức tạp một chút, thế nên giá của nó bán ở Thật Tảo mình mua là 35k!

Về phần cứng, khi ta gắn pin lithium 3V vào cho nó và 1 thạch anh 32.768KHz thôi là tự bản thân nó đã "đếm thời gian" thực vĩnh viễn rồi.

Bên trong ds1307 có 8 thanh ghi, trong đó có 7 thanh ghi tương ứng mỗi thanh ghi mang 1 giá trị lần lượt là: phút, giây, giờ, thứ, ngày, tháng, năm, ta có truy xuất, tức là ghi vào và đọc ra các giá trị này.
Cụ thể: ta cần GHI một giá trị ban đầu hiển thị lên màn hình LCD là: thứ 7. ngày 21-tháng 6-2008; và 03:25:00 AM chẳng hạn. Sau đó ta cần ĐỌC giá trị nhận được từ ds1307 cũng để hiển thị lên LCD để biết thời gian hiện tại là bao nhiêu tai bất cứ thời điểm nào ta cần (vì bản thân ds1307 sau mỗi giây nó sẽ tăng lên 1 giá trị từ 7 thanh ghi này và truyền giá trị đó về).
Và một thanh ghi thứ 8 để điều khiển bộ nhớ dữ liệu chứa các giá trị ngày, giờ...
Các bạn có thể tham khảo Datasheet của DS1307 tại đây, viết rất dễ hiểu...

cuong86vt
21-06-2008, 05:23 AM
ds1307 này có 3 chế độ tạo xung ở ngõ ra ở chân số 7 FT/OUT với 3 mức xung:
1Hz
4.096kHz
8.192kHz
32.768kHz
cho nên ta cần một con thạch anh 32.768kHz (bé gần bằng 1 con điện trở), trong sơ đồ mạch của mình nối 1 con led ở chân FT/OUT này để nó tạo xung nhấp nháy đúng 1s.

Việc đọc ghi giá trị từ ds1307 chỉ có một cái khó đó là việc chuyển đổi dữ liệu ở 2 mã BIN và BCD qua lại với nhau giữa con PIC6F877A (MASTER) và DS1307 (SLAVE) trên 2 đường BUS I2C là SDA và SCL.

Cụ thể: Khi ta GHI giá trị ngày 15 vào ds1307 thì số 15 này sẽ bị đổi thành 0x15 ngay khi vào thanh khi ds1307 !. Còn khi ta muốn ĐỌC giá trị từ DS1307 gửi về thì ds gửi về giá trị ngày 15 là: 0x15 !, tức là PIC nhận được giá trị 0x15 = 21 !.

Vậy ta phải làm sao để có được công thức chuyển đổi dữ liệu giữa 2 mã BIN và BCD:
0xAB -> AB và AB -> 0xAB. Sau đây mình xin viết ra công thức chuyền đổi của mình: (các bạn có thể viết a bằng cách khác mình cũng được):

Đổi dữ liệu mã BCD -> BIN:

int write(int data) // MASTER -> DS1307.
{ // x -> y.
int x,y; //vd: 7 -> 7 = 0x07.
x = data; //vd: 12 -> 18 = 0x12.
if(x<10)
{
y = x;
}
else if(x>=10)
{
y = (x/10 * 6) + x; //vd: 29 -> 41 = 0x29.
}
return(y); //vd: 35 -> 53 = 0x35.
}

Đổi dữ liệu mã BCD -> BIN:

int read(int data)
{ // MASTER <- DS1307.
int x,y,z; // x <- y.
y = data; //vd: 5 <- 5 = 0x05.
i=0; //vd: 10 <- 16 = 0x10.
if(y<10) //vd: 20 <- 32 = 0x20.
{ //vd: 30 <- 48 = 0x30.
x = y; //vd: 40 <- 64 = 0x40.
z = x; //vd: 50 <- 80 = 0x50.
} //.....
else if(y>=10)
{
do {
x = y - (6 * i);
z = (x/10 * 6) + x;
i++;
}
while(z!=y);
}
return(x);
}

Code đổi dữ liệu ở trên mình viết kiểu nội suy tam suất (hơi cùi bắp nhỉ !), nhưng mình đã thử lại kiểm chứng thấy đúng và dữ liệu hiển thị lên màn hình LCD là chính xác.

cuong86vt
21-06-2008, 05:42 AM
Bây giờ mình xin được post toàn bộ code lập trình của mình lên đây, xin được các bạn tham khảo và góp ý...

Nội dung cần khởi tạo hiển thị lên LCD ban đầu:
Hàng 1 LCD: SATURDAY, 21-06-2008
Hàng 1 LCD: 02:25:00 AM
(Tức có nghĩa là thời điểm hiện tại ban đầu sẽ được cài đặt là như vậy (bằng nút nhấn ngắt ngoài RB0 trên mạch), sau khi set xong thời gian bắt đầu đếm, sau đó nếu bạn muốn xem giờ trên đồng hồ lúc này là bao nhiêu thì bật nguồn cho vdk chạy (gọi là bật đồng hồ), không muốn xem nữa thì tắt nguồn vdk (gọi là tắt đồng hồ), bạn sẽ thấy là thời gian tại bất cứ lúc nào chúng ta bất đồng hồ lên đều chính xác ý như đồng hồ thật vậy !

#include <16f877a.h>
#include <def_877a.h>
#use delay(clock = 20000000)
#fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, force_hw)
#include <lcd.c>

int8 second, minute, hour, date, day, month, year;
int16 year1;
int i;

/*------------ Chuyển dữ liệu mã BIN của MASTER -> dữ liệu mã BCD cho DS1307---------*/
int write(int data) // MASTER -> DS1307.
{ // x -> y.
int x,y; //vd: 7 -> 7 = 0x07.
x = data; //vd: 12 -> 18 = 0x12.
if(x<10)
{
y = x;
}
else if(x>=10)
{
y = (x/10 * 6) + x; //vd: 29 -> 41 = 0x29.
}
return(y); //vd: 35 -> 53 = 0x35.
}


/*------------- Chuyển dữ liệu mã BCD của DS1307 -> dữ liệu mã BIN cho MASTER--------*/
int read(int data)
{ // MASTER <- DS1307.
int x,y,z; // x <- y.
y = data; //vd: 5 <- 5 = 0x05.
i=0; //vd: 10 <- 16 = 0x10.
if(y<10) //vd: 20 <- 32 = 0x20.
{ //vd: 30 <- 48 = 0x30.
x = y; //vd: 40 <- 64 = 0x40.
z = x; //vd: 50 <- 80 = 0x50.
} //.....
else if(y>=10)
{
do {
x = y - (6 * i);
z = (x/10 * 6) + x;
i++;
}
while(z!=y);
}
return(x);
}

#INT_EXT
void khoitao()
{
/*--------- khoi tao hien thi ban dau : SAT, 21-06-2008, 02:25:00 AM --------*/
second = 0; //giay: 00.
minute = 25; //phut: 25.
hour = 2; //gio: 02 (che do 24h).
day = 6; //thu 7: SAT (SATUDAY).
date = 21; //ngay: 21.
month = 6; //thang: 06.
year = 8; //nam: 08.

i2c_start();
i2c_write(0xD0); //den dia chi ds1307.
i2c_write(0x00); //den dia chi thanh ghi 00H.
i2c_write(write(second));
i2c_write(write(minute));
i2c_write(write(hour));
i2c_write(write(day));
i2c_write(write(date));
i2c_write(write(month));
i2c_write(write(year));
i2c_start();
i2c_write(0xD0);
i2c_write(0x07); //den thanh ghi dieu khien.
i2c_write(0x10); //tao xung vuong 1Hz.
i2c_stop();
}

void update_time()
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00);
i2c_start();
i2c_write(0xD1);
second = read(i2c_read());
minute = read(i2c_read());
hour = read(i2c_read());
day = read(i2c_read());
date = read(i2c_read());
month = read(i2c_read());
year = read(i2c_read(0));
i2c_stop();
}

void hienthi_LCD()
{

/*--------------- Hàng 1 cua LCD : hien thi thu, ngay - thang - nam ------------*/

lcd_gotoxy(1,1);
//printf(lcd_putc,"%s",day); //thu trong tuan.
if(day==1) lcd_putc("Mon");
else if(day==2) lcd_putc("Tue");
else if(day==3) lcd_putc("Wed");
else if(day==4) lcd_putc("Thu");
else if(day==5) lcd_putc("Fri");
else if(day==6) lcd_putc("Sat");
else if(day==7) lcd_putc("Sun");

lcd_gotoxy(4,1);
lcd_putc(".");

lcd_gotoxy(6,1);
if(date<10)
{
lcd_putc("0");
lcd_gotoxy(7,1);
printf(lcd_putc,"%d",date); //ngay trong thang.
}
else if(date>=10)
{
printf(lcd_putc,"%d",date);
}

lcd_gotoxy(8,1);
lcd_putc("-");

lcd_gotoxy(9,1);
//printf(lcd_putc,"%s",month); //thang trong nam.
if(month==1) lcd_putc("Jan");
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);
lcd_putc("-");

lcd_gotoxy(13,1); //nam.
year1 = 2000 + year;
printf(lcd_putc,"%ld",year1);


/*--------------- Hàng 2 cua LCD : hien thi gio : phut : giay ,AM/PM ------------*/

lcd_gotoxy(6,2); //gio.
if(hour<10)
{
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); //phut.
if(minute<10)
{
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); //giay.
if(second<10)
{
lcd_putc("0");
lcd_gotoxy(13,2);
printf(lcd_putc,"%d",second);
}
else if(second>=10)
{
printf(lcd_putc,"%d",second);
}

lcd_gotoxy(15,2);
lcd_putc("AM");
}

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RB);
ext_int_edge(H_to_L);
lcd_init();
delay_ms(10);

while(TRUE)
{
update_time();
hienthi_LCD();
}
}

cuong86vt
21-06-2008, 06:17 AM
Các bạn hãy nêu ra thắc mắc nếu có của mình và nhửng phát hiện trong code này để chúng ta cùng sửa đổi và cải thiện tốt hơn.
Với code viết cho cái đồng hồ như trên thì vẫn còn chưa tối ưu, vì mỗi lần chúng ta muốn nạp lại thời gian ban đầu thì lại phải set lại trong code ct ngặt ngoài RB0, cho nên các bạn hãy cùng mình tìm cách viết thêm code để làm cho cái đồng hồ này tốt hơn bằng cách dùng 4 nút nhấn ngắt ngoài RB4 -> RB7 kia để dịch chuyển con trỏ tới các vị trí: thứ, giờ, ngày... và set giá trị ban đầu của nó tùy bạn thích ngay trên cái đồng hồ đó mà không phải mang đi nạp đi nạp lại chi cho khổ nửa ! (pro như cái đồng hồ đeo tay casio vậy !). Nào các bạn, chúng ta hãy cùng nhau viết code tiếp cho cái bài làm đồng hồ còn dang dở này nhé ! :confused:

:D:D Mình sẽ đề nghị anh F treo một giải thưởng nho nhỏ :D:D (k bít anh F nghĩ sao nhỉ !), có thể là tặng 1 phần quà là 1 vài con PIC mới chẳng hạn ! (vì ở cty R&B của anh F có nhiều PIC lắm,có cả tỷ đủ loại luôn !:D) cho bạn nào viết được thành công và post code lên đây trước mà mình thử nạp code đó đúng thì sẽ được nhận giải đó :beer:, hấp dẫn quá nhỉ ! :eek: ...
Các bạn cứ viết code theo sơ đồ nguyên lý trên cũng được. Đến đây, mình xin được đố các bạn một câu hỏi nhỏ nhé: Trong sơ đồ nguyên lý orcad trên mình đã cố tình để một chỗ sai trong phần cứng :D:D, nếu các bạn làm y boong như cái mạch trên và code trên thì sai chắc ! (gợi ý: màn hỉnh LCD trắng póc !), các bạn hãy thử phát hiện và sửa xem nhé (gợi ý 2 cách: 1 là sửa code, 2 là sửa sơ đồ nguyên lý...), chắc cũng không quá khó nhỉ ! :confused::confused:
Chúc các bạn thành công... :beer:

toanck86
21-06-2008, 11:19 AM
Chú Cường trâu bò phết nhỉ, thức luôn đêm hả :). Lúc nào mang mạch cho anh xem nhé :D

hoanghaihic
24-10-2009, 11:19 PM
chào anh em đang làm đồ án thiết kế đề tài giống như trên : hiển thì thời gian thưc , ngày tháng năm nhưng phải thiết kế bằng 89c51 hoặc 98c52 anh có sơ đồ thì post lên cho em với
em đang gặp khó khăn mong anh giúp đỡ!

thanhtric5
16-11-2009, 04:38 PM
Bác Cường cho hỏi thư viện orcad mà có LCD bác có không cho e với ,sao cái orcad 9.2 của em không có cái LCD đó hả bác ?bác sửa luôn dùm cái sơ đồ nguyên lí cho a em tham khảo đi ,cũng lâu rùi mình thấy có bạn nào sửa dùm đâu!thanks.

thuong008
04-01-2010, 12:08 AM
lỗi ở phần code, em làm trên phần cứng của em nên không test phần cứng của pác. Nhưng em làm dựa theo code của pác phát hiện ra lỗi chỗ này:
i2c_write(write(second)); --->i2c_write(second);
Thanks pác cường nha nhờ chương trình của pác 1 ngày em đã làm ok cái RTC DS1307, với DS 12c877 em phải mất 1 tuần mò mẫm hix hix

Tuấn Anh CVN
05-01-2010, 07:02 AM
Mạch nguyên lý đồng hồ số trên mình thấy phần LCD kết nối còn thiếu. Các cổng RD của LCD chưa thấy kết nối tới PIC. Trong code cũng chưa thấy đề cập đến việc khởi tạo LCD hoạt động ở chế độ nào. (chế độ Byte hay nibble). Thường thì sẽ chọn cách đơn giản phần cứng bằng việc sử dụng chế độ nibble. Như vậy chỉ sử dụng 4 bus cao của LCD. Bài đồng hồ này sơ đồ nguyên lý sửa bằng việc kết nối 4 bus cao của LCD với các bus liên tiếp của một port trên PIC. Tiếp đó trong code thì khởi tạo LCD hoạt động ở chế độ nibble. Ta có thể lấy phần sample code trong HTPIC ra sửa lại chút là chạy OK.

thuan87
06-01-2010, 01:25 PM
thank. very good

nhockhochoai
26-02-2010, 08:01 AM
bác cho em hỏi nếu muốn hiển thị thêm lịch âm thì mình dùng phần cứng của bác luôn được không..thank bác nhiều

dtvtb
29-04-2010, 11:02 PM
Đây là 1 cái đồng hồ lcd hoàn chỉnh,gồm mô phỏng proteus và CCS
Tiếc là có 1 lỗi excessive cpu load làm sản phẩm mô phỏng chỉ chạy đc trong khoảng 5s,sau đó thì...hỏi Chúa để biết thêm chi tiết

babybaby002
24-11-2010, 10:43 AM
anh Cuong cho em xin cái code <flex_lcd_1.c> ko có code này sao đủ đc hàm main, anh cuong có thể gửi đoạn code này vào mail cho em nha bnktunganh@gmail.com. thanks

babybaby002
27-11-2010, 09:43 PM
"Đây là 1 cái đồng hồ lcd hoàn chỉnh,gồm mô phỏng proteus và CCS
Tiếc là có 1 lỗi excessive cpu load làm sản phẩm mô phỏng chỉ chạy đc trong khoảng 5s,sau đó thì...hỏi Chúa để biết thêm chi tiết"
dtvtb.

chào bác dtvtb, mình đang làm thử cái project này và mình đã down cái flie của bác về mà sao nó hiện thị lên LCD thì tốt mà time và ngày tháng năm nhảy lung tung, năm lên đến 2167... bác xem lại code ds1307 và update time hay sao ấy.

thienson_000
01-12-2010, 11:14 AM
anh em xin chỉ giáo lúc mình mô phỏng protues thì giá trị giây chỉ chạy được khoảng 10 là không đếm nữa trong khi giá trị giây bên con ds1307 vẫn chạy bình thường là bị sao xin chỉ giúp

thienson_000
01-12-2010, 11:16 AM
"Đây là 1 cái đồng hồ lcd hoàn chỉnh,gồm mô phỏng proteus và CCS
Tiếc là có 1 lỗi excessive cpu load làm sản phẩm mô phỏng chỉ chạy đc trong khoảng 5s,sau đó thì...hỏi Chúa để biết thêm chi tiết"
dtvtb.

chào bác dtvtb, mình đang làm thử cái project này và mình đã down cái flie của bác về mà sao nó hiện thị lên LCD thì tốt mà time và ngày tháng năm nhảy lung tung, năm lên đến 2167... bác xem lại code ds1307 và update time hay sao ấy.

mã chuyển đổi BCD có vấn đề bạn copy mã chuyển đổi khác sẽ chạy đc

babybaby002
03-12-2010, 02:21 PM
mã chuyển đổi BCD có vấn đề bạn copy mã chuyển đổi khác sẽ chạy đc

hix, vậy lấy mã chuyển đổi BCD khác ở đâu giờ? ai có mã chuyển đổi BCD đúng ko cho mình với? mình đang làm về cái mạch này mà bị kẹt mấy tuần nay, ai có mạch hoàn chỉnh chạy đúng thì post protues và cod lên cho mình tham khảo với nhé, thanks

thienson_000
05-12-2010, 11:28 AM
hix, vậy lấy mã chuyển đổi BCD khác ở đâu giờ? ai có mã chuyển đổi BCD đúng ko cho mình với? mình đang làm về cái mạch này mà bị kẹt mấy tuần nay, ai có mạch hoàn chỉnh chạy đúng thì post protues và cod lên cho mình tham khảo với nhé, thanks

bạn thử file ds nay xem sao minh ko up len dc
/*------- Chuyên du liêu mã BIN cua MASTER -> du liêu mã BCD cho DS1307-----*/
int8 decToBcd(int8 val) // MASTER -> DS1307.
{ // x -> y.
int8 x,y; //vd: 7 -> 7 = 0x07.
x = val; //vd: 12 -> 18 = 0x12.
if(x<10)
{
y = x;
}
else if(x>=10)
{
y = (x/10 * 6) + x; //vd: 29 -> 41 = 0x29.
}
return(y); //vd: 35 -> 53 = 0x35.
}


/*------- Chuyên du liêu mã BCD cua DS1307 -> du liêu mã BIN cho MASTER-----*/
int8 bcdToDec (int8 val)
{ // MASTER <- DS1307.
int8 x,y,z; // x <- y.
y = val; //vd: 5 <- 5 = 0x05.
i=0; //vd: 10 <- 16 = 0x10.
if(y<10) //vd: 20 <- 32 = 0x20.
{ //vd: 30 <- 48 = 0x30.
x = y; //vd: 40 <- 64 = 0x40.
z = x; //vd: 50 <- 80 = 0x50.
} //.....
else if(y>=10)
{
do {
x = y - (6 * i);
z = (x/10 * 6) + x;
i++;
}
while(z!=y);
}
return(x);
}

babybaby002
05-12-2010, 02:16 PM
mình đang làm về đồng hồ số đo thời gian dùng ds1307 hiển thị lên LCD ,mình viet code hoài mà vẫn chạy sai,mình viết 5 đoạn code và built ra 5 file hex, mà không file hex nào chạy hoàn chỉnh cả, mình có post protues và 5 file code lên, các bạn xem dùm mình và chỉnh sửa dùm mình với nhá, thanks các bạn nhiều lắm.

babybaby002
05-12-2010, 02:20 PM
bạn thử file ds nay xem sao minh ko up len dc
/*------- Chuyên du liêu mã BIN cua MASTER -> du liêu mã BCD cho DS1307-----*/
int8 decToBcd(int8 val) // MASTER -> DS1307.
{ // x -> y.
int8 x,y; //vd: 7 -> 7 = 0x07.
x = val; //vd: 12 -> 18 = 0x12.
if(x<10)
{
y = x;
}
else if(x>=10)
{
y = (x/10 * 6) + x; //vd: 29 -> 41 = 0x29.
}
return(y); //vd: 35 -> 53 = 0x35.
}


/*------- Chuyên du liêu mã BCD cua DS1307 -> du liêu mã BIN cho MASTER-----*/
int8 bcdToDec (int8 val)
{ // MASTER <- DS1307.
int8 x,y,z; // x <- y.
y = val; //vd: 5 <- 5 = 0x05.
i=0; //vd: 10 <- 16 = 0x10.
if(y<10) //vd: 20 <- 32 = 0x20.
{ //vd: 30 <- 48 = 0x30.
x = y; //vd: 40 <- 64 = 0x40.
z = x; //vd: 50 <- 80 = 0x50.
} //.....
else if(y>=10)
{
do {
x = y - (6 * i);
z = (x/10 * 6) + x;
i++;
}
while(z!=y);
}
return(x);
}

hix, cái này mình cũng thử rồi vẫn không chạy được, mình có post protues và 5 file code mình viết theo 5 cách, bạn xem dùm mình với, sao ko có cách nào chạy hoàn chỉnh hết, trong void main mình cần phải khai báo những gì nữa không? xem dùm mình với nhá, bạn có thể gửi vào mail của mình bnktunganh@gmail.com, thanks bạn nhiều lắm lắm.

babybaby002
06-12-2010, 03:45 PM
sau 2 đêm cặm cụi sửa chữa, mình đã sửa 6 code thành còn 2 code gần như hoàn chỉnh nhưng vẫn chưa gọi là hoàn chỉnh đúng nhất, vì thời gian chạy được khoảng mấy phút là đứng không hiển thị tiếp ra LCD nữa, ở đây mình có 2 code dùng 2 thư viện LCD khác nhau và trong mỗi code có 2 cách chuyển dữ liệu sang BCD, các bạn xem và chỉnh sửa code sao cho chạy đúng nhất nhé, các bạn có thể post lên đây hoặc gửi vào mail bnktunganh@gmail.com cho mình, cảm ơn các bạn đã giúp đỡ.

babybaby002
10-12-2010, 12:19 AM
mấy bài trước mình post, mình dùng proteus 7.7 và bị lỗi nên time và day nó nhảy loạn xạ, sau khi mình vẽ lại bằng proteus 7.1 thì time và day ổn nhưng biến giây đếm trên ds1307 chậm mất 3 nhịp, khi giây ở đồng hồ thật bên ngoài nhảy được 3s thì con ds mới nhảy được 1s, mình post code và proteus lên đây, bạn nào xem dùm mình phải chỉnh sửa code như thế nào cho giây của con ds nó chạy đúng nha. thanks.

anhtai90_dtvt
04-04-2011, 05:14 PM
chào bạn,mình thấy trong phần code của bạn có một số vấn đề như sau:
1. trong code cho phần update_time,tại sao phần lúc đọc phần cuối lại là read(i2c_read(0)),mình thầy nó khác với các dòng trước
2. trong phần hiển thị thứ trong tuần cần chỉnh lại một chút,day=1 là Sun,day=2 là Mon....
3. trong phần void main,bạn chưa khởi tạo cho port dùng LCD,và port dùng DS1307 thì sẽ không hiển thị được.trong vòng lặp while bạn nên để delay_ms(1000) để thấy second chạy.tuy nhiên,mình nhận thấy là khi để là year=read(i2c_read()) thì second lại không chạy,còn nếu để là year=read(i2c_read(0)) thì second lại chạy.mong bạn có thể giải thích cho mình.

chimcon
17-05-2011, 10:39 AM
chào mọi người,

mình đang làm đông hồ thời giang thực hiển thì ngày, tháng, năm, giờ,phút, giây,
dùng pic6f877a ,ds12c887,ic 74595 để mở rộng các i/O và hiển thì lên led 7 đoạn?
bạn nào đã làm rồi gửi cde cho mình xin nhé.code dùng ngôn ngữ C viết trên ccs.
cãm ơn.

mrhuy3009
24-10-2011, 10:40 PM
bạn nào viết xong code realtime g dùng 4 nút nhấn ngắt ngoài RB4 -> RB7 kia để dịch chuyển con trỏ tới các vị trí: thứ, giờ, ngày... và set giá trị ban đầu của nó như bác cường nói gửi cho mình với

boydtbk
30-10-2011, 03:02 PM
các bác dùng con pic để hiển thị đồng hồ mà tiết kiệm port làm gì nên điều khiển LCD bằng 8port cho dễ
thứ 2 là kiếm thêm con đo nhiệt độ nữa làm hiển thị nhiệt đọ nữa
thứ 3 có thêm phần hẹn giờ và báo đến giờ như cái casio là đc
thứ 4 tốn đống tiền mà chả có nhẽ lại không làm đc bằng cái đồng hồ 120k à vì thế nên làm phần đồng hồ bấm giò nữa
thứ 5 cải tiến thành con casio 260k là
a: hẹn đc 5 lần giờ
b: bấm giờ chạy ngược (ví dụ cài đặt 25p thì nó đếm ngược hết 25 phút sẽ kêu)
c: có thể lưa trữ tên số điện thoại và ngày sinh đc.
mình học chưa giỏi về pic nhưng mình nghĩ với 1 con vi điều khiển không rẻ (62k) thì đủ để làm những việc này. chả có nhẽ mình lại thua bọn tàu

ngdnhanbk
01-01-2012, 08:30 PM
ai giải thích giúp mình chân số 7 dùng làm gì với?