loveboom3012 |
12-09-2013 08:14 AM |
[giao tiếp I2C] RTC DS1307 và PIC 16f887 không chạy
mình đang làm lab i2c với PIC 16f887 , gặp rắc rối ở phần lấy data từ ds1307 đưa vào PIC xử lí, mọi người giúp mình với, trên 6 led 7 đoạn toàn hiển thị số 0
code của mình đây
Code:
#include <htc.h>
#include "i2c.h"
#include "lcd.h"
__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF); //1st config. Word
__CONFIG(BOR4V_BOR21V);
#define _XTAL_FREQ 4000000
#define SLAVER_ADD 0X68
#define READ 1
#define WRITE 0
#define led_gio_c RD5
#define led_gio_dv RD4
#define led_phut_c RD3
#define led_phut_dv RD2
#define led_giay_c RD1
#define led_giay_dv RD0
int gio_c,gio_dv,phut_c,phut_dv,giay_c,giay_dv;
int giay,phut,gio,i;
unsigned char mgio_c,mgio_dv,mphut_c,mphut_dv,mgiay_c,mgiay_dv;
const unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void ds1307_init();
void read_ds1307();
void ds1307_init()
{
i2c_start();
i2c_write((SLAVER_ADD<<1)|WRITE); // ~ i2c_write(0xd0)
i2c_write(0x00);
i2c_stop();
}
void read_ds1307()
{
i2c_start();
i2c_write((SLAVER_ADD<<1)|WRITE); // ~ i2c_write(0xd0)
i2c_write(0x00);
i2c_stop();
i2c_stop(); //restart
i2c_write((SLAVER_ADD<<1)|READ); // ~i2c_write(0xd1);
giay=i2c_read(0);
phut=i2c_read(0);
gio=i2c_read(1);
i2c_stop();
}
void update_time()
{
giay_dv=giay&0x0f;
giay_c=(giay&0xf0)>>4;
phut_dv=phut&0x0f;
phut_c=(phut&0xf0)>>4;
gio_dv=giay&0x0f;
gio_c=(giay&0xf0)>>4;
mgiay_dv=ma[giay_dv];
mgiay_c=ma[giay_c];
mphut_dv=ma[phut_dv];
mphut_c=ma[phut_c];
mgio_dv=ma[gio_dv];
mgio_c=ma[gio_c];
}
void hienthi()
{
for(i=0;i<5;i++)
{
PORTB=mgiay_dv; led_giay_dv=0; __delay_us(100);led_giay_dv=1;
PORTB=mgiay_c; led_giay_c=0; __delay_us(100);led_giay_c=1;
PORTB=mphut_dv; led_phut_dv=0; __delay_us(100);led_phut_dv=1;
PORTB=mphut_c; led_phut_c=0; __delay_us(100);led_phut_c=1;
PORTB=mgio_dv; led_gio_dv=0; __delay_us(100);led_gio_dv=1;
PORTB=mgio_c; led_gio_c=0; __delay_us(100);led_gio_c=1;
}
}
void main()
{
ANSEL=0;
ANSELH=0;
TRISB=0X00;
TRISD=0X00;
i2c_init();
ds1307_init();
while(1)
{
read_ds1307();
update_time();
hienthi();
}
}
|