PDA

View Full Version : Đồng hồ PIC


mr_so_lo
10-05-2011, 12:25 AM
các anh xem hô em phần code này có lỗi chỗ nào ko mà báo thức ko được vậy???phần chỉnh thời gian thì bình thường roy






#include <16F877A.h>
#include <khaibaotghi_16F877A.h>
#fuses nowdt,put,hs,noprotect,nolvp
#use delay(clock=20000000)
#use i2c(Master,slow,sda=PIN_C4,scl=PIN_C3)
// Cac dinh nghia
#define mode ra0
#define tang ra2
#define giam ra3
#define led1 rd0
#define led2 rd1
#define led3 rd2
#define led4 rd3
#define led5 rd4
#define led6 rd5
#define chuong rc0
#define set_bt ra1
#define reset ra4
//DINH NGHIA CAC BIEN
int sec,min,hour;
const unsigned char MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };//MA LED 7 DOAN
int8 sec1,sec2,min1,min2,hour1,hour2,mint,hourt;
void display1();
void update_ds1307();
void update_time();
void convert();
void set_time();
void set_min();
void set_hour();
void baothuc();
void set_minbt();
void set_hourbt();
void chuong();
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void update_time()
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // BAT DAU TAI VI TRI REG 0 - Seconds
i2c_start(); //restart
i2c_write(0xD1);
sec = (i2c_read() & 0x7f);
min = (i2c_read() & 0x7f);
hour = (i2c_read(0) & 0x3f);
i2c_stop();
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void convert()
{
sec1=sec & 0x0F;
sec2=(sec & 0x70)>>4; //convert to BCD SEC
min1=min & 0x0F;
min2=(min & 0x70)>>4; //convert to BCD MIN
hour1=hour & 0x0F;
hour2=(hour & 0x70)>>4; //convert to BCD HOUR
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void display1() {
//hien thi sec - min - hour bang phuong phap quet led
Portb=MAP[sec1];//BCD SANG 7 DOAN
PORTd=0X20;
delay_ms(1);
PORTd=0X00;

Portb=MAP[sec2];//BCD SANG 7 DOAN
PORTd=0X10;
delay_ms(1);
PORTd=0X00;

Portb=MAP[min1];//BCD SANG 7 DOAN
PORTd=0X08;
delay_ms(1);
PORTd=0X00;


Portb=MAP[min2];//BCD SANG 7 DOAN
PORTd=0X04;
delay_ms(1);
PORTd=0X00;


Portb=MAP[hour1];//BCD SANG 7 DOAN
PORTd=0X02;
delay_ms(1);
PORTd=0X00;

Portb=MAP[hour2];//BCD SANG 7 DOAN
PORTd=0X01;
delay_ms(1);
PORTd=0X00;
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void update_ds1307(void) {
int8 data=0; // luu tru du lieu tam thoi de gui vao ds1307
i2c_start();
i2c_write(0xd0);
i2c_write(0x00); // ghi du lieu bat dau tu vi tri 00
data=sec1+(sec2<<4);
data=data & 0b01111111;
i2c_write(data);
data=min1+(min2<<4);
i2c_write(data);
data=hour1+(hour2<<4);
i2c_write(data);
data=0x00;
i2c_write(data);
i2c_stop(); // ket thuc truyen du lieu
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void set_time(void)
{
set_hour();
set_min();
delay_ms(50);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void set_hour()
//------------------------------------------------------------------------------
{ // Cai dat gio
while (mode==0) {} // cho phim nha
do {
if (tang==0) { // neu phim 2 duoc nhan
while (tang==0) {} // khong lam gi cho phim nha
hour1++;
if ((hour2==2) & (hour1==4)) { hour2=0;hour1=0;}
if (hour1==10) { hour2++;hour1=0;}
}
//------------------------------------------------------------------------------
if (giam==0) { // neu phim 2 duoc nhan
while (giam==0) {} // khong lam gi cho phim nha
hour1--;
if ((hour2==0) & (hour1==-1)) { hour2=2;hour1=3;}
if (hour1==-1) { hour2--;hour1=9;}
}
portb=map[hour2];
led1=1;
delay_ms(1);
led1=0;
portb=map[hour1];
led2=1;
delay_ms(1);
led2=0;
}
while (mode==1) ;


}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void set_min() { // Cai dat phut
//------------------------------------------------------------------------------
while (mode==0) {} // cho phim nha
do
{
if (tang==0) { // neu phim 2 duoc nhan
while (tang==0) {} // khong lam gi cho phim nha
min1++;
if ((min2==5) & (min1==10))
{ min2=0;min1=0;}
if (min1==10)
{ min2++;min1=0;}
}
//------------------------------------------------------------------------------
if (giam==0)
{ // neu phim 2 duoc nhan
while (giam==0) {} // khong lam gi cho phim nha
min1--;
if ((min2==0) & (min1==-1)) { min2=5;min1=9;}
if (min1==-1) { min2--;min1=9;}
}
portb=map[min2];
led3=1;
delay_ms(1);
led3=0;
portb=map[min1];
led4=1;
delay_ms(1);
led4=0;
}
while (mode==1);

}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Void baothuc() {
set_hourbt();
set_minbt();
delay_ms(50);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX

void set_hourbt()
//------------------------------------------------------------------------------
{ // Cai dat gio
while (set_bt==0) {} // cho phim nha
do {
if (tang==0) { // neu phim 2 duoc nhan
while (tang==0) {} // khong lam gi cho phim nha
hour1++;
if ((hour2==2) & (hour1==4)) { hour2=0;hour1=0;}
if (hour1==10) { hour2++;hour1=0;}
}
//------------------------------------------------------------------------------
if (giam==0) { // neu phim 2 duoc nhan
while (giam==0) {} // khong lam gi cho phim nha
hour1--;
if ((hour2==0) & (hour1==-1)) { hour2=2;hour1=3;}
if (hour1==-1) { hour2--;hour1=9;}
}
portb=map[hour2];
led1=1;
delay_ms(1);
led1=0;
portb=map[hour1];
led2=1;
delay_ms(1);
led2=0;
}
while (set_bt==1) ;
hourt=hour;


}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
void set_minbt() { // Cai dat phut
//------------------------------------------------------------------------------
while (set_bt==0) {} // cho phim nha
do
{
if (tang==0) { // neu phim 2 duoc nhan
while (tang==0) {} // khong lam gi cho phim nha
min1++;
if ((min2==5) & (min1==10))
{ min2=0;min1=0;}
if (min1==10)
{ min2++;min1=0;}
}
//------------------------------------------------------------------------------
if (giam==0)
{ // neu phim 2 duoc nhan
while (giam==0) {} // khong lam gi cho phim nha
min1--;
if ((min2==0) & (min1==-1)) { min2=5;min1=9;}
if (min1==-1) { min2--;min1=9;}
}
portb=map[min2];
led3=1;
delay_ms(1);
led3=0;
portb=map[min1];
led4=1;
delay_ms(1);
led4=0;
}
while (set_bt==1);
mint=min;


}
Void chuong()
{
Output_high(pin_c0);
Delay_ms(250);
Output_low(pin_c0);
Delay_ms(250);
}

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX


void main() {
set_tris_B(0x00); // Cong B lam dau ra ( tru RB7)
set_tris_e(0xff); // Cong e lam dau vao(ban phim)
set_tris_d(0x00); // Cong D lam dau ra ( )
set_tris_c(0x00);
set_tris_a(0xff);

while (true) {
update_time();
convert();
display1();
if (mode==0)
{set_time();
update_ds1307();}//chu y
mode=1;

if(set_bt==0)
{baothuc();

}
set_bt=1;
if (mint==min && hourt==hour)
{
chuong();
}
if( reset==0)
{
Output_low(pin_c0);

}

}
}