Em đang thử test cái IC thời gian thực qua giao tiếp I2C với 16f877a mà viết CCS sao nó không chạy ấy, viết theo đúng cách các bác bảo rồi mà vẫn không đc.EM chỉ thử hiển thị 2 chữ ssố của giây ra thôi mà vẫn không đc, led hàng chục ở PORTD, led hàng đơn vị ở PORT B, có cả điện trở kéo lên rôi, các bác giúp em với nha, chắc là chỉ sai phần mêm thôi,sợ phần thiết lập giờ sai,hàm thiietlap() ấy,thanks các bác nha
Code:
#include <16f877a.h> #include <def_877a.h> #use delay(clock=20000000) #use i2c(Master,Slow,sda=pin_c3,scl=pin_c4) #FUSES NOWDT, HS, NOPROTECT,NOLVP // khai bao bien int8 sec,min,hour,day,date,month,year; int8 const a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//dung de ma hoa led 7 doan int8 sec1, sec2, min1, min2,hour1, hour2 ,day1,date1,date2,month1,month2,year1,year2,year3,year4; void hien_thi(); void update_time(); void thiet_lap(); //Chuong trinh con void hien_thi() { portb=a[sec1]; portd=a[sec2]; } void update_time() { i2c_start(); i2c_write(0xD0);//thiet lap che do truyen du lieu vao ds1307 i2c_write(0x00);//thiet lap vi tri con tro i2c_stop(); i2c_start(); i2c_write(0xd1);//gui lenh doc du lieu sec =i2c_read(1); min=i2c_read(1); hour=i2c_read(1); day=i2c_read(1); date=i2c_read(1); month=i2c_read(1); year=i2c_read(0);//so khong o day de vi dieu khien biet day la du lieu cuoi cung doc trong dot nay i2c_stop(); //tach du lieu duoi dang ma bcd tu du lieu nhan duoc tu i2c sec1=sec & 0x0F;//hang don vi cua giay nam o 4 ibt thap sec2=(sec & 0x70)>>4;//hang chuc nam o 3 bit cao0>5 min1=min & 0x0F;//hang don vi cua min nam o 4 bit thap min2=(min & 0x70)>>4; hour1=hour & 0x0F; hour2=(hour &0x30)>>4;//hang chuc cua hour=0>>2 nen o 2 bit 4 5 day1=day & 0x07; date1= date & 0x0F; date2 = (date & 0x30)>>4; month1=month &0x0F; month2=(month&0x10)>>4; year1=year& 0x0F; year2=(year&0xF0)>>4; } void thiet_lap() { int8 data=0; i2c_start(); i2c_write(0xd0); i2c_write(0x00); data=sec1+(sec2<<4); data=data&0b01111111;//bit dau =0 la bit CH i2c_write(data); data=min1+(min2<<4); i2c_write(data); data=hour1+(hour2<<4); i2c_write(data); data=day1; i2c_write(data); data=date1+(date2<<4); i2c_write(data); data=month1+(month2<<4); i2c_write(data); data=year1+(year2<<4); i2c_write(data); data=0x00; i2c_write(data); i2c_stop();//ket thuc truyen du lieu cho ds1307 } //Chuong trnih chinh void main() { trisb=0x00; trisd=0x00; sec1=3;sec2=4;min1=1;min2=3;hour1=6;hour2=1;day1=3;date1=3;date2=1;month1=5;month2=0;year1=8;year2=0; thiet_lap(); while(1) { update_time(); hien_thi(); } }
Comment