em làm cái đồng hồ dung 16f877a + ds12c887+ LCD
viết bằng CCS nhưng tới phần ghi và đọc 1 giá trị vào thanh ghi thì gặp 1 lỗi không hiểu được. Đó là chỉ đọc đúng giá trị của thanh ghi vào lần lặp đầu tiên, những lần tiếp theo thì sai. Các bác coi gium em lỗi ở đâu với.
Đây là code em tự mò viết:
Code:
#include <16F877a.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#define DS RE2
#define R_W RE1
#define AS RE0
#define RTC PORTD
int DCD,DCV,DLV,DCS,x,high,medum,low,digit;
//ham doc rtc
void docrtc(void)
{
set_tris_E(0);
DS =1;
R_W=1;
AS =1;
RTC=DCD;
delay_ms(1);
AS =0;
DS =0;
set_tris_D(0xff);
delay_ms(1);
}
//Ham ghi vao rtc
void vietrtc(void)
{
set_tris_E(0);
AS = 1;
DS = 1;
R_W= 1;
RTC= DCV;
delay_ms(1);
AS = 0;
delay_ms(1);
RTC= DLV;
R_W= 0;
delay_ms(1);
AS = 1;
delay_ms(1);
}
void main(void)
{
delay_ms(100); // tao tre 100ms cho LCD khoi dong
set_tris_D(0);
set_tris_E(0);
DCV = 0; //xoa dia chi ghi
DLV = 0; //xoa du lieu ghi
delay_ms(1);
DCV = 0x15; // dia chi thanh ghi 0x15
DLV = 0x54; // gia tri cap nhat
while(1)
{
DCS = 0; //xoa dia chi luu
DCD = 0; // xoa dia chi doc
vietrtc();
delay_ms(1);
DCD = 0x15; // doc gia tri thanh ghi 0x15
docrtc();
DCS = RTC;
x = DCS;
delay_ms(1);
AS = 1;
lcd_init();
lcd_gotoxy(7,1); // vi tri (x,y)=(7,1)= hang 1, cot 7
lcd_putc(x);
delay_ms(1000);
}
}
Một chương trình đơn giản ghi và đọc thanh ghi vậy mà giá trị đọc được chỉ đúng ở lần đầu những lần lặp sau giá trị đọc được thay đổi.