Trích:
Nguyên văn bởi thuong008
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.
|
bạn đã thiết lập cho ds12c887 chưa(thanh ghi A,B)
đây là đoạn code đề đọcthanh ghi giây

code đã thử trên mạch thật)
#include <16F877A.h>
#include <def_877a.h>
#include <DEFS_16F877A.h>
#device *=16 //su dung het ram trong pic
# fuses NOWDT, XT, NOPROTECT, NOLVP, PUT
# use delay (clock = 4000000)
int DATA_W,ADDRESS_W,DATA_R ,ADDRESS_R ;
#define CS RC5
#define AS RC4
#define RW RC3
#define DS RC1
#define RE_SET RC0
#define DATAPORT PORTB
#define LEDPORT PORTD
void read_12C887(void);//khai bao chuong trinh con
void write_12C887(void);//khai bao chuong trinh con
void main()
{
TRISB=0;
TRISC=0x04;
TRISD=0;
TRISE=0;
ADCON1=0x06;
RE_SET=1;
CS =1;
delay_ms(1000);
DATA_W= 0x2F;//b'00101111'
//dua gia tri vao thanh ghi "register A"
//BIT 5=1 THOI GIAN THUC BIT 0...3=1 TAO F=2HZ TAI CHAN SQW
ADDRESS_W=10;//THANH GHI A
write_12C887();
DATA_W= 0x5E;//'01011110' ; dua gia tri vao thanh ghi "register B"
//BIT 3=1 CHO PHEP TAO SONG VUONG TAI CHAN SQW
// BIT 1=1 dang du lieu 24 gio
//BIT 2=1 dang du lieu Binary
ADDRESS_W=11;//THANH GHI B
write_12C887();
//DOC TRANG THAI CUA DS12C887 XEM DA SAN SANG DOC DU LIEU HAY CHUA
LAP:;
ADDRESS_R=10;//THANH GHI A
read_12C887();
while(DATA_R,7==1)//
{
ADDRESS_R=10;//THANH GHI A
read_12C887();
}
//DATA_R,7=0 DA CHO PHEP DOC DU LIEU
ADDRESS_R=00;//D/C THANH GHI giay
read_12C887();
LEDPORT=DATA_R;
GOTO LAP;
}//DAU KET THUC CHUONG TRINH CHINH
//**********write_12C887***************
//**********write_12C887***************
void write_12C887(void)
{
TRISB=0;
DATAPORT=ADDRESS_W;
AS=0;
DS=1;
RW=1;
#ASM;
nop;
#ENDASM;
AS=1;
CS=0;
#ASM;
nop;
#ENDASM;
AS=0;
#ASM;
nop;
#ENDASM;
DATAPORT=DATA_W;
RW=0;
#ASM;
nop;
#ENDASM;
AS=1;
RW=1;
CS=1;
}
void read_12C887(void)
{
TRISB=0;
DATAPORT=ADDRESS_R;
DS=1;
RW=1;
#ASM;
nop;
#ENDASM;
AS=1;
CS=0;
#ASM;
nop;
#ENDASM;
AS=0;
#ASM;
nop;
#ENDASM;
DS=0;
#ASM;
nop;
#ENDASM;
TRISB=0xFF;
DATA_R=DATAPORT;
AS=1;
CS=1;
}