You are on page 1of 16

main program:

//================================================== =//
// CAU HINH CHO PIC16F877A
#include <16F877A.h>
#include <def_877a.h>
#include <ds1307.c>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
/////////////////////////////////////////////////////////////////////////////
byte sec,min,hour;
byte const MAP[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
byte TG1,TG2,TG3,TG4,TG5,TG6; //bien hien led trung gian
byte key,mode; //cac bien che do
int1 ampm,blink,blink_sec,blink_min,blink_hour;
int1 on_off;
int16 count;
#bit SW1 = 0x08.0 // D0 - chon che do chinh gio, phut, giay
#bit SW2 = 0x08.1 // D1 tang thoi gian
#bit SW3 = 0x08.2 // D2 - giam thoi gian
#bit SW4 = 0x08.3 // D3 - clear tinh trang
/////////////////////////////////////////////////////////////////////////
// KHAI BAO CAC CHUONG TRINH CON SU DUNG
void set_blink();
void change_time(); // CHON KIEU HIEN THI GIO AM-PM
void update_1307();// CAP NHAT DS1307
void keyscan();// QUET PHIM
void set_sec();// CHINH GIAY
void set_min();// CHINH PHUT
void set_hour();// CHINH GIO
void clear_status();// CHUONG TRINH CON XOA TRANG THAI
void read_time(); // CHUONG TRINH CON DOC THOI GIAN DS1307
void update_time();// CHUONG TRINH CON CAP NHAT THOI GIAN
void display();// CHUONG TRINH CON HIEN THI
//////////////////////////////////////////////////////////////////////////
// BAT DAU CHUONG TRINH CHINH////////////////////////////////////////////
void main()
{
byte u;
Trisd = 0x0F;
Trisb = 0x00;
Trisa = 0x00;
init_ds1307();
u=read_ds1307(0);
sec=u & 0x7F;
write_ds1307(0,sec);// ket noi dong ho(bit7=0)
key=5;mode=0;blink=0; blink_sec=0;blink_min=0;blink_hour=0;
while(1)

{
read_time();
display();
keyscan();
}
}

// DEMO CHUONG TRINH CON////////////////////////


/////////////////////////////////////////////////
void set_blink()
{ switch (mode)
{ case 1: blink_sec=1; break;
case 2: {blink_min=1;blink_sec=0;} break;
case 3: {blink_hour=1;blink_min=0;} break;
case 4:
{
blink=0;mode = 0;blink_sec=0;
blink_min=0;blink_hour=0;
}
break;
}
}
/////////////////////////////////////////////
void change_time()
{
if(mode == 1) {blink_sec=1;set_sec();}
if(mode == 2) {blink_min=1;set_min();}
if(mode == 3) {blink_hour=1;set_hour();}
if(mode == 4)
{
blink=0;mode = 0; blink_sec=0;
blink_min=0; blink_hour=0;
}
}
////////////////////////////////////////////////
void update_1307()
{
write_DS1307(0,sec);
write_DS1307(1,min);
}
///////////////////////////////////////////////
void keyscan()
{
RD0=1;RD1=1;RD2=1;RD3=1;
if(SW1 != 1) { key=0;SW1=1;delay_ms(150);}
if(SW2 != 1) { key=1;SW2=1;delay_ms(150);}
if(SW3 != 1) { key=2;SW3=1;delay_ms(150);}
if(SW4 != 1) { key=3;SW4=1;delay_ms(150);}
if(key != 5)
{

switch (key)
{ case 0: {mode++;key = 5;blink=1;set_blink();}
break;
case 1: {change_time();key = 5;update_1307();}
break;
case 2: {clear_status();key = 5;}
break;
}
}
}

///////////////////////////////////////////////////
void set_sec()
{
sec=read_ds1307(0);
if (sec>=0x30) {sec=0; min++; write_ds1307(1,min);}
else sec=0;
write_ds1307(0,sec);
}

//////////////////////////////////////////////////////
void set_min()
{ byte j;
min=read_ds1307(1);
min++;
j=min & 0x0F;
if (j>=0x0A) min=min+0x06;
if (min>=0x60) min=0;
write_ds1307(1,min);
}
////////////////////////////////////////////////////
void set_hour()
{ hour= hour & 0x1F;
hour++;
if(hour== 0x0a) hour = hour+0x06;
if(hour == 0x13)
{
hour = 0x00;
if (ampm == 0) ampm = 1;
else ampm = 0;
}
}
//////////////////////////////////////////////
void clear_status()
{
mode=4; set_blink();
}
//////////////////////////////////////////

void read_time()
{
sec = read_DS1307(0);
min = read_DS1307(1);
hour = read_DS1307(2);
update_time();
}

///////////////////////////////////////////
void update_time()
{
ampm = bit_test(hour,5); //test AM PM
if(ampm == 0) {RD2 = 0;RD3=1;} //AM
if(ampm == 1) {RD2 = 1;RD3=0;} // PM
TG1= sec & 0x0F;
TG2=(sec & 0xF0)>>4; //convert to BCD SEC
TG3= min & 0x0F;
TG4=(min & 0xF0)>>4; //convert to BCD MIN
TG5= hour & 0x0F;
TG6=(hour & 0x10)>>4; //convert to BCD HOUR
}
//////////////////////////////////////////////
void display()
{
TRISB=0x00;
TRISA=0x00;
if(blink==0) goto hienthi;
if(on_off==0) goto led_blink;
hienthi:
// sec - min - hour
PortB=MAP[TG6];
RA5=0;
delay_ms(1);
RA5=1;
PortB=MAP[TG5];
RA4=0;
delay_ms(1);
RA4=1;
PortB=MAP[TG4];
RA3=0;
delay_ms(1);
RA3=1;
PortB=MAP[TG3];
RA2=0;
delay_ms(1);
RA2=1;

PortB=MAP[TG2];
RA1=0;
delay_ms(1);
RA1=1;
PortB=MAP[TG1];
RA0=0;
delay_ms(1);
RA0=1;
if(count!=0)
goto exit;
else
{
count=15;
on_off=0;
}
goto exit;
led_blink:
PortB=MAP[TG1];
if (blink_sec==1) RA5=1;
else RA5=0;
delay_ms(3);
RA0=1;
PortB=MAP[TG2];
if (blink_sec==1) RA4=1;
else RA4=0;
delay_ms(3); RA4=1;
PortB=MAP[TG3];
output_low(PIN_B7);
if(blink_min==1) RA3=1; else RA3=0;
delay_ms(3); RA3=1;
PortB=MAP[TG4];
if(blink_min==1) RA2=1; else RA2=0;
delay_ms(3); RA2=1;
PortB=MAP[TG5];
output_low(PIN_B7);
if(blink_hour==1) RA1=1; else RA1=0;
delay_ms(3); RA1=1;
PortB=MAP[TG6];
if(blink_hour==1) RA0=1; else RA0=0;
delay_ms(3); RA0=1;
if(count==0)
{
count=15;on_off=1;
}
exit: count--;
}

DS1307.c
#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)
//==========================
// initial DS1307
//==========================
void init_DS1307()
{
output_float(DS1307_SCL);
output_float(DS1307_SDA);
}
//==========================
// write data one byte to
// DS1307
//==========================
void write_DS1307(byte address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
}
//==========================
// read data one byte from DS1307
//==========================
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}

dev_877a.h:
// register definitions
#define W 0
#define F 1
// register files
#byte INDF =0x00
#byte TMR0 =0x01
#byte PCL =0x02
#byte STATUS =0x03
#byte FSR =0x04
#byte PORTA =0x05
#byte PORTB =0x06
#byte PORTC =0x07
#byte PORTD =0x08
#byte PORTE =0x09
#byte
#byte
#byte
#byte
#byte
#byte
#byte
#byte

EEDATA =0x10C
EEADR =0x10D
EEDATH =0x10E
EEADRH =0x10F
ADCON0 =0x1F
ADCON1 =0x9F
ADRESH =0x9F
ADSESL =0x9F

#byte
#byte
#byte
#byte
#byte
#byte

PCLATH =0x0a
INTCON =0x0b
PIR1 =0x0c
PIR2 =0x0d
PIE1 =0x8c
PIE2 =0x8d

#byte
#byte
#byte
#byte
#byte
#byte

OPTION_REG =0x81
TRISA =0x85
TRISB =0x86
TRISC =0x87
TRISD =0x88
TRISE =0x89

#byte EECON1 =0x18C


#byte EECON2 =0x18D
//DINH NGHIA BIT
#bit ra5 =0x05.5
#bit ra4 =0x05.4
#bit ra3 =0x05.3
#bit ra2 =0x05.2
#bit ra1 =0x05.1
#bit ra0 =0x05.0
#bit
#bit
#bit
#bit

rb7
rb6
rb5
rb4

=0x06.7
=0x06.6
=0x06.5
=0x06.4

#bit
#bit
#bit
#bit

rb3
rb2
rb1
rb0

=0x06.3
=0x06.2
=0x06.1
=0x06.0

#bit
#bit
#bit
#bit
#bit
#bit
#bit
#bit

rC7
rC6
rC5
rC4
rC3
rC2
rC1
rC0

=0x07.7
=0x07.6
=0x07.5
=0x07.4
=0x07.3
=0x07.2
=0x07.1
=0x07.0

#bit
#bit
#bit
#bit
#bit
#bit
#bit
#bit

rD7
rD6
rD5
rD4
rD3
rD2
rD1
rD0

=0x08.7
=0x08.6
=0x08.5
=0x08.4
=0x08.3
=0x08.2
=0x08.1
=0x08.0

#bit rE2 =0x09.2


#bit rE1 =0x09.1
#bit rE0 =0x09.0

#bit
#bit
#bit
#bit
#bit
#bit

trisa5
trisa4
trisa3
trisa2
trisa1
trisa0

=0x85.5
=0x85.4
=0x85.3
=0x85.2
=0x85.1
=0x85.0

#bit
#bit
#bit
#bit
#bit
#bit
#bit
#bit

trisb7
trisb6
trisb5
trisb4
trisb3
trisb2
trisb1
trisb0

=0x86.7
=0x86.6
=0x86.5
=0x86.4
=0x86.3
=0x86.2
=0x86.1
=0x86.0

#bit
#bit
#bit
#bit
#bit
#bit
#bit
#bit

trisc7
trisc6
trisc5
trisc4
trisc3
trisc2
trisc1
trisc0

=0x87.7
=0x87.6
=0x87.5
=0x87.4
=0x87.3
=0x87.2
=0x87.1
=0x87.0

#bit
#bit
#bit
#bit
#bit

trisd7
trisd6
trisd5
trisd4
trisd3

=0x88.7
=0x88.6
=0x88.5
=0x88.4
=0x88.3

#bit trisd2 =0x88.2


#bit trisd1 =0x88.1
#bit trisd0 =0x88.0
#bit trise2 =0x89.2
#bit trise1 =0x89.1
#bit trise0 =0x89.0
// INTCON Bits for C
#bit gie = 0x0b.7
#bit peie = 0x0b.6
#bit tmr0ie = 0x0b.5
#bit int0ie = 0x0b.4
#bit rbie = 0x0b.3
#bit tmr0if = 0x0b.2
#bit int0if = 0x0b.1
#bit rbif = 0x0b.0
// PIR1 for C
#bit pspif = 0x0c.7
#bit adif = 0x0c.6
#bit rcif = 0x0c.5
#bit txif = 0x0c.4
#bit sspif = 0x0c.3
#bit ccp1if = 0x0c.2
#bit tmr2if = 0x0c.1
#bit tmr1if = 0x0c.0
//PIR2 for C
#bit cmif = 0x0d.6
#bit eeif = 0x0d.4
#bit bclif = 0x0d.3
#bit ccp2if = 0x0d.0
// PIE1 for C
#bit adie = 0x8c.6
#bit rcie = 0x8c.5
#bit txie = 0x8c.4
#bit sspie = 0x8c.3
#bit ccp1ie = 0x8c.2
#bit tmr2ie = 0x8c.1
#bit tmr1ie = 0x8c.0
//PIE2 for C
#bit osfie = 0x8d.7
#bit cmie = 0x8d.6
#bit eeie = 0x8d.4
// OPTION Bits
#bit not_rbpu = 0x81.7
#bit intedg = 0x81.6
#bit t0cs = 0x81.5
#bit t0se = 0x81.4
#bit psa = 0x81.3
#bit ps2 = 0x81.2
#bit ps1 = 0x81.1
#bit ps0 = 0x81.0

// EECON1 Bits
#bit eepgd = 0x18c.7
#bit free = 0x18C.4
#bit wrerr = 0x18C.3
#bit wren = 0x18C.2
#bit wr = 0x18C.1
#bit rd = 0x18C.0
//ADCON0
#bit CHS0 =0x1F.3
#bit CHS1 =0x1F.4
#bit CHS2 =0x1F.5

Code tam:
#include <16f877a.h>
#use delay(clock=4000000)
#FUSES NOWDT, HS
#use fast_io(b)
#use i2c(master,sda = PIN_C4,scl = PIN_C3)
#include <ds1307.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN
PIN_D1
#define LCD_RW_PIN
PIN_D2
#define LCD_DATA4
PIN_D4
#define LCD_DATA5
PIN_D5
#define LCD_DATA6
PIN_D6
#define LCD_DATA7
PIN_D7
#include <lcd.c>
static unsigned char keypad_4x4[4][4] = {'1','2','3','S',
'4','5','6','F',
'7','8','9','U',
'o','0','E','D'};
unsigned char scan_code[4] = {0x0E,0x0D,0x0B,0x07};
int key=0,p=1,q=0,t=0,key_flag = 0,exit = 0;
int8 sec,min,hrs,day,month,yr,dow;
int8 x,y,z,h,m,s;
int checkpad()
{
int i,j,keyin;
for(i=0;i<4;i++)
{
output_B(0xFF-(1<<(i+4)));
delay_us(10);
keyin = input_B()&0x0F;
if(keyin!=0x0F)
for(j=0;j<4;j++)
if(keyin==scan_code[j]) return keypad_4x4[j][i];
}
return 0;
}

void nhap_so(int x,int y)


{

while(1) {
lcd_gotoxy(x,y);
lcd_cursor_on(TRUE);
delay_ms(50);
lcd_cursor_on(FALSE);
key = checkpad();
if(key==0) key_flag = 0;
if(key=='E') { exit = 1; break; }
else if(key=='o') { p = 0; break; }
if(key&&(key_flag==0)) {
key_flag = 1;
lcd_putc(key);
break;
}
}
}

void set_time() {
for(q=5;q<13;q++) {
if((exit)|(p==0)) break;
if((q==7)|(q==10)) continue;
nhap_so(q,2);
if(q==12) q=4;
}
lcd_cursor_on(FALSE);
x = (lcd_getc(5,2) - 48)*10 + (lcd_getc(6,2) - 48);
y = (lcd_getc(8,2) - 48)*10 + (lcd_getc(9,2) - 48);
z = (lcd_getc(11,2) - 48)*10 + (lcd_getc(12,2) - 48);
}

void check_time_date() {
if(hrs>=24) hrs = 0;
if(min>=60) min = 0;
if(sec>=60) sec = 0;
if((month==0)|(month>12)) month = 1;
switch(month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12: { if((day==0)|(day>31)) day =
1; break; }
case 4: case 6: case 9: case 11: { if((day==0)|(day>30)) day = 1; break; }
case 2: { if(((yr%4)==0)&((day==0)|(day>29))) day = 1;
else if(((yr%4)!=0)&((day==0)|(day>28))) day = 1;
break; }
}
}

void display()
{
while(q==0) {
ds1307_get_date(day,month,yr,dow);
delay_ms(20);
ds1307_get_time(hrs,min,sec);
delay_ms(20);
lcd_gotoxy(1,1);
lcd_putc("Time:");
lcd_gotoxy(6,1);
lcd_putc(hrs/10+48);
lcd_putc(hrs%10+48);
lcd_putc(':');
lcd_putc(min/10+48);
lcd_putc(min%10+48);
lcd_putc(':');
lcd_putc(sec/10+48);
lcd_putc(sec%10+48);
lcd_gotoxy(1,2);
lcd_putc("Date:");
lcd_gotoxy(6,2);
lcd_putc(day/10+48);
lcd_putc(day%10+48);
lcd_putc('-');
lcd_putc(month/10+48);
lcd_putc(month%10+48);
lcd_putc('-');
lcd_putc("20");
lcd_putc(yr/10+48);
lcd_putc(yr%10+48);
if(((h==hrs)&&(m==min)&&(s==sec))) {
t=1;
output_high(PIN_E0);
}
}
}

#int_EXT
void hienthi()
{
clear_interrupt(int_EXT);

q=1;
//disable_interrupts(GLOBAL);
//enable_interrupts(GLOBAL);
}

void main()
{
output_low(LCD_RW_PIN);
set_tris_B(0x0F);
output_low(PIN_E0);
output_B(0x0F);
lcd_init();
delay_ms(10);
ds1307_init();
ds1307_set_date_time(9,3,14,7,8,30,0);
enable_interrupts(GLOBAL);
enable_interrupts(int_EXT);
ext_int_edge(H_TO_L);
while(1) {
display();
disable_interrupts(int_EXT);
if(q==1) {
lcd_putc('\f');
while(1) {
lcd_gotoxy(1,1);
lcd_putc("1: Doi ngay gio");
lcd_gotoxy(1,2);
if(t==0) lcd_putc("2: Hen gio tat");
else if(t==1) lcd_putc("2: Bat lai den");
key = checkpad();
if(key=='1') { q = 1; break; }
else if(key=='2') { q = 2; break; }
else if(key=='E') { q = 0; break; }
}
delay_ms(500);
lcd_putc('\f');
switch(q) {
case 0: break;
case 1: {
while(1) {
lcd_putc("Cai dat gio:");
lcd_gotoxy(5,2);
lcd_putc("HH:MM:SS");

set_time();
hrs=x; min=y; sec=z;
delay_ms(100);
break;
}
p = 1;
if(exit) break;
lcd_putc('\f');
while(1) {
lcd_putc("Cai dat ngay:");
lcd_gotoxy(3,2);
lcd_putc("20YY:MM:DD");
set_time();
yr=x; month=y; day=z;
delay_ms(100);
break;
}
p = 1;
if(exit) break;
check_time_date();
delay_ms(100);
ds1307_set_date_time(day,month,yr,7,hrs,min,sec);
delay_ms(100);
break;
}
case 2: {
p = 1;
if(t==0)
while(1) {
lcd_putc("Hen gio tat:");
lcd_gotoxy(5,2);
lcd_putc("HH:MM:SS");
set_time();
h=x; m=y; s=z;
break;
}
if(t==1) { t = 0;
output_low(PIN_E0);
}
p = 1;
break;
}
}
enable_interrupts(int_EXT);
lcd_putc('\f');
lcd_putc(" DA XONG ");

delay_ms(500);
q=0;
}
}
}

You might also like