Arkadaşlar merhaba;
PIC16f877A ve DS1302 kullanarak her gün aynı saatte bir LED'i yakan bir yazılım yaptım. Yazılımda bulunan dijital saati PIC'e üç buton ekleyerek ayarlamak istiyorum
(1.buton-saat,dakika,gün,ay,yıl seçmek için seçim tuşu/
2.buton-rakamları artan şekilde ayarlamak için yukarı butonu/
3.buton- rakamları azalan yönde ayarlamak için aşağı butonu)
Başlangıç olarak tavsiye edebileceğiniz örnek bir yazılım veya uygulama olabilir mi?
Yardımlarınız için şimdiden teşekkürler.
include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) //4mhz delay süresi
#include "flex_lcd.c" //lcd c dosyası
#include "ds18b20.c" //termometre entegresi c dosyası
#include "ds1302.C" //saat entegresi c dosyasi
int8 saniye,dakika,saat,gun,ay,hafta,yil,ayar=0;
float sicak;
void lcd()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"%02d/%02d/%02d",gun,ay,yil);
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:%02d:%02d",saat,dakika,saniye);
lcd_gotoxy(11,1);
switch(hafta)
{
case 1: printf(lcd_putc,"Pzts"); break;
case 2: printf(lcd_putc,"SALI"); break;
case 3: printf(lcd_putc,"CARS"); break;
case 4: printf(lcd_putc,"PERS"); break;
case 5: printf(lcd_putc,"CUMA"); break;
case 6: printf(lcd_putc,"Cmts"); break;
case 7: printf(lcd_putc,"Pzar"); break;
}
}
void sicaklik()
{
sicak=ds1820_read(); //termometre entegresindeki değeri sicak değişkenine aktar
if(sicak>=85){
sicak=0;}
lcd_gotoxy(10,2);printf(lcd_putc,"%2.1f",sicak);
lcd_gotoxy(15,2);lcd_send_byte(0x4a,0xdf);lcd_gotoxy(16,2);printf(lcd_putc,"C");
}
void ayaryap(){
//(0x0d) lcd belirtilen konumun yanıp sönmesi
if(input(pin_d0)==0){ayar++;delay_ms(20);printf(lcd_putc,"\f AYAR MODU");delay_ms(450);printf(lcd_putc,"\f");}
while(ayar==1){
lcd();lcd_gotoxy(1,1);lcd_send_byte(0x01,0x0d);lcd_gotoxy(2,1);lcd_send_byte(0x02,0x0d);
if(input(pin_d0)==0){gun++;delay_ms(20);if(gun==32){gun=1;}while(input(pin_d0)==0);}
if(input(pin_d1)==0){gun--;delay_ms(20);if(gun==0){gun=31;}while(input(pin_d1)==0);}
if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
while(ayar==2){
lcd();lcd_gotoxy(4,1);lcd_send_byte(0x04,0x0d);lcd_gotoxy(5,1);lcd_send_byte(0x05,0x0d);
if(input(pin_d0)==0){ay++;delay_ms(20);if(ay==13){ay=1;}while(input(pin_d0)==0);}
if(input(pin_d1)==0){ay--;delay_ms(20);if(ay==0){ay=12;}while(input(pin_d1)==0);}
if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
while(ayar==3){
lcd();lcd_gotoxy(7,1);lcd_send_byte(0x07,0x0d);lcd_gotoxy(8,1);lcd_send_byte(0x08,0x0d);
if(input(pin_d0)==0){yil++;delay_ms(20);while(input(pin_d0)==0);}
if(input(pin_d1)==0){yil--;delay_ms(20);if(yil==-1)yil=99;while(input(pin_d1)==0);}
if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
while(ayar==4){
lcd_gotoxy(11,1);lcd_send_byte(0x11,0x0d);lcd();delay_us(5);
if(input(pin_d0)==0){hafta++;delay_ms(20);if(hafta==8){hafta=1;}while(input(pin_d0)==0);}
if(input(pin_d1)==0){hafta--;delay_ms(20);if(hafta==0){hafta=7;}while(input(pin_d1)==0);}
if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
while(ayar==5){
lcd_gotoxy(1,2);lcd_send_byte(0x40,0x0d);lcd_gotoxy(2,2);lcd_send_byte(0x41,0x0d);lcd();
if(input(pin_d0)==0){saat++;delay_ms(20);if(saat==24){saat=0;}while(input(pin_d0)==0);}
if(input(pin_d1)==0){saat--;delay_ms(20);if(saat==-1){saat=23;}while(input(pin_d1)==0);}
if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
while(ayar==6){
lcd_gotoxy(4,2);lcd_send_byte(0x43,0x0d);lcd_gotoxy(5,2);lcd_send_byte(0x44,0x0d);lcd();
if(input(pin_d0)==0){dakika++;delay_ms(20);if(dakika==60){dakika=0;}while(input(pin_d0)==0);}
if(input(pin_d1)==0){dakika--;delay_ms(20);if(dakika==-1){dakika=59;}while(input(pin_d1)==0);}
if(input(pin_d2)==0){ayar++;delay_ms(200);while(input(pin_d2)==0);}}
while(ayar==7){rtc_set_datetime(gun,ay,yil,hafta,saat,dakika); //değişkenleri saat entegresine aktar.
delay_ms(20);
printf(lcd_putc,"\f AYARLAR\n YUKLENIYOR");
delay_ms(1000);printf(lcd_putc,"\f");
ayar=0;}
}
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
lcd_init(); //lcd yi hazırla
rtc_init(); //saat entegresini hazırla
delay_ms(5);
printf(lcd_putc,"\fRECEP METE\nALACAM-SAMSUN");
delay_ms(200);
printf(lcd_putc,"\f");
delay_ms(5);
while(1)
{
if(ayar==0){rtc_get_time(saat,dakika,saniye);rtc_get_date(gun,ay,yil,hafta);}
sicaklik();
lcd();
ayaryap();
}
}
Takıldığın yerlerde yardımcı olurum.İyi çalışmalar.
(http://i.hizliresim.com/6R8VnW.png)
@semfero hocam desteğiniz için çok teşekkürler. Program eksiksiz çalışıyor. Acemiliğime sığınarak küçük bir sorum daha olacak.
Ana programa şu şekilde bir ekleme yaptım.
if(saat==8&&dakika==00&&saniye==00)
{
set_tris_b(0b00000001);
output_b(0x00);
output_high(pin_b2);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
}
ve kesmeyi aşağıdaki gibi tanımladım.
int i=1;
#int_ext
void kesme(void)
//for(i=1;i<=8;i++)
{
if (i==1){output_high(pin_b1);output_low(pin_b2);delay_ms(1000);output_low(pin_b1);output_high(pin_b2);}
if (i==2){output_high(pin_b1);output_low(pin_b2);delay_ms(1000);output_low(pin_b1);output_high(pin_b2);}
if (i==3){output_high(pin_b1);output_low(pin_b2);delay_ms(1000);output_low(pin_b1);output_high(pin_b2);}
if (i==4){output_low(pin_b1);output_low(pin_b2);output_high(pin_b3);}
if (i==5){output_low(pin_b1);output_low(pin_b2);output_high(pin_b3);}
if (i==6){output_low(pin_b1);output_low(pin_b2);output_high(pin_b3);}
if (i==7){output_low(pin_b1);output_low(pin_b2);output_low(pin_b3);}
i++;
}
sorunum kesme döngüsü ilk başta eksiksiz çalışıyor fakat ertesi gün saat tekrar 8 olduğunda kesme sayısı 7'yi aştığı için i==1'den başlamıyor, dolayısıyla aynı döngüye girip kesmeler çalışmıyor.
for(i=1;i<=8;i++)
şeklinde döngüye girmesini istiyorum fakat başarılı olamıyorum. Rica etsem bu konu hakkında da yardımcı olma şansınız olabilir mi?
Şimdiden teşekkürler.