çalar saat (denendi çalışıyor)

Başlatan emre salman, 19 Mayıs 2014, 18:22:03

emre salman

herkese selamlar uzun zamandır picproje ailesini takip ediyorum burdan yardım alıyorum sorularımı soruyorum dedimki benimde çorbada bir tuzum olsun
son yaptığım yazılımı ve devreyi burada paylaşıyım dedim inşallah birilerinin işine yarar..

uygulamamız çalar saat

özellikleri:
saat ayarı
tarih ayarı
alarm ayarı
4 buton ile kontrol

bu uygulamada 16F877 ve ds1302 kullandım
ds1302nin bağlantıları şöyle

sclk pin rc1 e
ıo pini   rc2 ye
rst pini  rc0 a bağlı

buton bağlantılarıda şöyle
set butonu     ra0 a
aşağı butonu  ra1 e
yukarı butonu ra2 ye
çıkış butonu    ra3 e bağladım
ve bütün butonlar pulldown

4 mhz kristal kullandım

2x16 karekter lcd kullandım

lcd bağlantılarıda şöyle

d4 rb0
d5 rb1
d6 rb2
d7 rb3

rs rb4
e rb5
r/w rb6 pinlerine bağladım

1 adette buzzer kullandım
oda rd7 ye bağlı


source kodu
#include "16f877.h"
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use  delay (clock=4000000)
#include <benim_lcd.c>
#include <DS1302.C>
#use fast_io(a)
#use  fast_io(b)
#use fast_io(d)
#define yuk pin_a2
#define asa pin_a1
#define  set   pin_a0
#define  sustur   pin_a3

int   isaat=0,idakika=0,b=0,alarms=0,alarmd=0,eee=0,sss=0,sus=0,ana_don=0,igun=0,iay=0,iyil=0,ihaftanin_gunu=0;
byte  saniye,dakika,saat,gun,ay,yil,haftanin_gunu;


void  ana_menu()
{
output_high(pin_d7);
delay_ms(150);
delay_ms(100);
ANA:

output_d(0x00);
imlec(1,1);
printf(lcd_veri," >>saat  ayar<<");
imlec(2,1);
printf(lcd_veri,"   tarih ayar");
if(input(yuk)==1)
{
lcd_komut(0x01);
goto  alarm_durum;
}
if(input(sustur)==1)
{
ana_don=0;
goto  cik;
}
if(input(asa)==1)
{
lcd_komut(0x01);
goto tarih;
}
if(input(set)==1)
{
ana_don=1;
goto  cik;
}
goto ana;
tarih:
imlec(1,2);
printf(lcd_veri,"  saat  ayar  ");
imlec(2,1);
printf(lcd_veri," >>tarih ayar<<");
if(input(sustur)==1)
{
ana_don=0;
goto  cik;
}

if(input(yuk)==1)
{
lcd_komut(0x01);
goto  ana;
}
if(input(set)==1)
{
ana_don=2;
goto cik;
}
if(input(asa)==1)
{
lcd_komut(0x01);
goto  alarm_kur;
}
goto tarih;


alarm_kur:
imlec(1,1);
printf(lcd_veri,"   tarih ayar");
imlec(2,1);
printf(lcd_veri," >>alarm kur<<");
if(input(sustur)==1)
{
ana_don=3;
goto  cik;
}

if(input(yuk)==1)
{
lcd_komut(0x01);
goto tarih;
}
if(input(asa)==1)
{
lcd_komut(0x01);
goto alarm_durum;
}
if(input(set)==1)
{
lcd_komut(0x01);
ana_don=3;
goto  cik;
}
goto  alarm_kur;


alarm_durum:
imlec(1,1);
printf(lcd_veri,"   alarm kur");
imlec(2,1);
printf(lcd_veri," >>alarm  ac<<");
if(input(set)==1)
{
ana_don=4;
goto  cik;
}
if(input(asa)==1)
{
lcd_komut(0x01);
goto  ana;
}
if(input(yuk)==1)
{
lcd_komut(0x01);
goto  alarm_kur;
}
if(input(sustur)==1)
{
ana_don=0;
goto  cik;
}
goto  alarm_durum;



cik:
lcd_komut(0x01);
output_high(pin_d7);
delay_ms(200);
output_d(0x00);
}





void  tarih_ayar()
{
ihaftanin_gunu=1;
lcd_komut(0x01);
igun=0;
iay=0;
iyil=0;
gun:
imlec(1,1);
printf(lcd_veri,"TARiH AYARI");
imlec(2,1);
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
lcd_komut(0x01);
goto  ays;

}
if(input(yuk)==1)
{
igun++;
}
if(input(asa)==1)
{
igun--;
}
printf(lcd_veri,"T:%02d/%02d/20%02d",igun,iay,iyil);
imlec(2,13);
   switch(ihaftanin_gunu)
   {
   case  1: printf(lcd_veri,"PAZ "); break;
   case  2: printf(lcd_veri,"PZT "); break;
   case  3: printf(lcd_veri,"SALİ"); break;
   case  4: printf(lcd_veri,"CAR "); break;
   case  5: printf(lcd_veri,"PER "); break;
   case  6: printf(lcd_veri,"CUMA"); break;
   case  7: printf(lcd_veri,"CTS "); break;
   }
goto  gun;

ays:
imlec(1,1);
printf(lcd_veri,"TARiH AYARI");
imlec(2,1);
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
lcd_komut(0x01);
goto  yils;

}
if(input(yuk)==1)
{
iay++;
}
if(input(asa)==1)
{
iay--;
}
printf(lcd_veri,"T:%02d/%02d/20%02d",igun,iay,iyil);
imlec(2,13);
   switch(ihaftanin_gunu)
   {
   case  1: printf(lcd_veri,"PAZ "); break;
   case  2: printf(lcd_veri,"PZT "); break;
   case  3: printf(lcd_veri,"SALi"); break;
   case  4: printf(lcd_veri,"CAR "); break;
   case  5: printf(lcd_veri,"PER "); break;
   case  6: printf(lcd_veri,"CUMA"); break;
   case  7: printf(lcd_veri,"CTS "); break;
   }
goto  ays;

yils:
imlec(1,1);
printf(lcd_veri,"TARiH AYARI");
imlec(2,1);
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
lcd_komut(0x01);
goto  haftanin_gunus;
}
if(input(yuk)==1)
{
iyil++;
}
if(input(asa)==1)
{
iyil--;
}
printf(lcd_veri,"T:%02d/%02d/20%02d",igun,iay,iyil);
imlec(2,13);
   switch(ihaftanin_gunu)
   {
   case  1: printf(lcd_veri,"PAZ "); break;
   case  2: printf(lcd_veri,"PZT "); break;
   case  3: printf(lcd_veri,"SALİ"); break;
   case  4: printf(lcd_veri,"CAR "); break;
   case  5: printf(lcd_veri,"PER "); break;
   case  6: printf(lcd_veri,"CUMA"); break;
   case  7: printf(lcd_veri,"CTS "); break;
   }
goto  yils;
haftanin_gunus:
imlec(1,1);
printf(lcd_veri,"TARiH AYARI");
imlec(2,1);
printf(lcd_veri,"T:%02d/%02d/20%02d",igun,iay,iyil);
imlec(2,13);
   switch(ihaftanin_gunu)
   {
   case  1: printf(lcd_veri,"PAZ "); break;
   case  2: printf(lcd_veri,"PZT "); break;
   case  3: printf(lcd_veri,"SALi"); break;
   case  4: printf(lcd_veri,"CAR "); break;
   case  5: printf(lcd_veri,"PER "); break;
   case  6: printf(lcd_veri,"CUMA"); break;
   case  7: printf(lcd_veri,"CTS "); break;
   }
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
goto  bas;
}
if(input(yuk)==1)
{
ihaftanin_gunu++;
}
if(input(asa)==1)
{
ihaftanin_gunu--;
}
if(ihaftanin_gunu==8)
{
ihaftanin_gunu=1;
}
if(ihaftanin_gunu==0)
{
ihaftanin_gunu=7;
}
goto  haftanin_gunus;



bas:
lcd_komut(0x01);
rtc_get_time(saat,dakika,saniye);
rtc_get_date(gun,ay,yil,haftanin_gunu);
rtc_set_datetime(igun,iay,iyil,ihaftanin_gunu,saat,dakika);
imlec(1,1);
printf(lcd_veri,"TARiH  AYARLANDI");
delay_ms(500);
lcd_komut(0x01);
ana_don=0;


}



void menu()
{
   imlec(1,1);
   printf(lcd_veri,"saat:%02d:%02d:%02d",saat,dakika,saniye);
   
   imlec(2,1);
   switch(haftanin_gunu)
   {
   case  1: printf(lcd_veri,"PAZ"); break;
   case  2: printf(lcd_veri,"PZT"); break;
   case  3: printf(lcd_veri,"SALi"); break;
   case  4: printf(lcd_veri,"CAR"); break;
   case  5: printf(lcd_veri,"PER"); break;
   case  6: printf(lcd_veri,"CUMA"); break;
   case  7: printf(lcd_veri,"CTS"); break;
   }
   imlec(2,5);
   printf(lcd_veri,"t:%02d/%02d/20%02d",gun,ay,yil);
   delay_ms(900);
}



void dakika_ayar()
{
b=0;
lcd_komut(0x01);
while(b==0)
{
imlec(1,1);
printf(lcd_veri,"SAAT AYARI");
imlec(2,1);
printf(lcd_veri,"%02d:%02d",isaat,idakika);
if(input(yuk)==1)
{
idakika++;
}
if(input(asa)==1)
{
idakika--;
}
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x01);
rtc_get_date(gun,ay,yil,haftanin_gunu);
rtc_set_datetime(gun,ay,yil,haftanin_gunu,isaat,idakika);
lcd_komut(0x01);
imlec(1,1);
printf(lcd_veri," SAAT AYARLANDI ");
delay_ms(500);
lcd_komut(0x01);
b=2;
}
}
}



void  alarm_kurs()
{
lcd_komut(0x01);
alarm_s:
imlec(1,1);
printf(lcd_veri,"ALARM SAATi");
imlec(2,1);
printf(lcd_veri,"%02d:%02d",alarms,alarmd);
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
goto  alarm_d;
}
if(input(yuk)==1)
{
alarms++;
}
if(input(asa)==1)
{
alarms--;
}
goto  alarm_s;

alarm_d:
imlec(1,1);
printf(lcd_veri,"ALARM SAATi");
imlec(2,1);
printf(lcd_veri,"%02d:%02d",alarms,alarmd);
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
goto alarm_set;
}
if(input(yuk)==1)
{
alarmd++;
}
if(input(asa)==1)
{
alarmd--;
}
goto  alarm_d;

alarm_set:
lcd_komut(0x01);
imlec(1,1);
printf(lcd_veri," ALARM  KURULDU ");
delay_ms(500);
lcd_komut(0x01);
ana_don=0;
}



void  alarm_dur()
{
delay_ms(200);
dolas:

imlec(1,1);
if(sus==0)
{
printf(lcd_veri,"ALARM-1> A");
}
if(sus==1)
{
printf(lcd_veri,"ALARM-1> K");
}
if(input(set)==1)
{
switch(sus)
{
case  0:sus=1; break;
case  1:sus=0; break;
}
delay_ms(100);
}
if(input(sustur)==1)
{
goto  git;
}
goto dolas;

git:
output_high(pin_d7);
delay_ms(150);
output_d(0x00);
ana_don=0;
}

void ayar()
{
ana_don=0;
isaat=0;
idakika=0;
b=0;
lcd_komut(0x01);
while(b==0)
{
imlec(1,1);
printf(lcd_veri,"SAAT AYARI");
if(input(yuk)==1)
{
isaat++;
}
if(input(asa)==1)
{
isaat--;
}
imlec(2,1);
printf(lcd_veri,"%02d:%02d",isaat,idakika);
if(input(set)==1)
{
output_high(pin_d7);
delay_ms(150);
output_d(0x01);
b=2;
}
}
}






void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   set_tris_a(0b11111111);
   set_tris_b(0b00000000);
   set_tris_d(0b00000000);
   output_d(0x00);
   lcd_hazirla();
   rtc_init();
   
   imlec(1,1);
   printf(lcd_veri,"   CALAR SAAT");
   imlec(2,1);
   printf(lcd_veri,"   UYGULAMASI");
   delay_ms(300);
   lcd_komut(0x01);
   ana_menu();
   
   while(1)
   {
   if(ana_don==4)
   {
   alarm_dur();
   }
   if(ana_don==1)
   {
   ayar();
   dakika_ayar();
   }
   if(ana_don==2)
   {
   tarih_ayar();
   }
   if(ana_don==3)
   {
   alarm_kurs();
   }
   b=0;
   rtc_get_time(saat,dakika,saniye);
   rtc_get_date(gun,ay,yil,haftanin_gunu);
   menu();
   if(input(set)==1)
   {
   lcd_komut(0x01);
   ana_menu();
   }
   if(saat==alarms)
   {
   if(dakika==alarmd)
   {
   if(sus==0)
   {
   if(input(sustur)==1)
   {
   imlec(1,1);
   printf(lcd_veri,"ALARM SUSTURULDU");
   delay_ms(200);
   lcd_komut(0x01);
   imlec(1,1);
   printf(lcd_veri,"ALARM SUSTURULDU");
   delay_ms(200);
   lcd_komut(0x01);
   imlec(1,1);
   printf(lcd_veri,"ALARM SUSTURULDU");
   delay_ms(200);
   lcd_komut(0x01);
   sus=1;
   }
   output_high(pin_d7);
   lcd_komut(0x01);
   imlec(1,1);
   printf(lcd_veri,"    AALARMMM    ");
   imlec(2,1);
   printf(lcd_veri,"   UYANN LANN   ");
   delay_ms(500);
   output_low(pin_d7);
   }
   }
   }
   }
   }
   




buda benim_lcd.c kütüphanesi SERDAR ÇİÇEK hocamızın yazdığının aynısı
#define e   pin_b5 // LCD'nin E ucu RB5 pinine bağlı
#define rs  pin_b4 // LCD'nin RS ucu RB4 pinine bağlı

//****** LCD'ye Komut Gönderme Fonksiyonu **********
void lcd_komut(byte komut)
{   
   output_b(komut>>4);   // Komutun yüksek değerli 4 bitini gönder
   output_low(rs);       // LCD komut almak için ayarlandı
   delay_cycles(1);      // 1 komut saykılı bekle   
   output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);      // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);          // 2 msn gecikme veriliyor

   output_b(komut&0x0F); // Komutun düşük değerli 4 bitini gönder
   output_low(rs);      // LCD veri almak için ayarlandı  
   delay_cycles(1);      // 1 komut saykılı bekle      
   output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);      // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);          // 2 msn gecikme veriliyor
}

//******* LCD'ye Veri Gönderme Fonksiyonu **********
void lcd_veri(byte veri)
{ 
   output_b(veri>>4);    // Verinin yüksek değerli 4 bitini gönder
   output_high(rs);      // LCD veri almak için ayarlandı
   delay_cycles(1);      // 1 komut saykılı bekle    
   output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);      // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);          // 2 msn gecikme veriliyor

   output_b(veri&0x0F); // Verinin düşük değerli 4 bitini gönder
   output_high(rs);      // LCD veri almak için ayarlandı
   delay_cycles(1);      // 1 komut saykılı bekle    
   output_high(e);      // E ucu lojik-1'den lojik-0'a çekiliyor
   delay_cycles(1);     // 1 komut saykılı bekle
   output_low(e);
   delay_ms(2);         // 2 msn gecikme veriliyor
}

//******* LCD'de İmlec Konumlandırma Fonksiyonu ********
void imlec(byte satir, byte sutun)
{
   if (satir==1)      // Eğer satır değişkeni "1" ise
      lcd_komut(0x80|(sutun-1));

   if (satir==2)      // Eğer satır değişkeni "2" ise
      lcd_komut(0x80|(0x40+(sutun-1)));
}

//********* LCD Başlangıç Ayarları Fonksiyonu ******
void lcd_hazirla()
{
   int i=0;
   output_low(rs); // RS ucu lojik-0
   output_low(e);  // E ucu lojik-0
   delay_ms(30);   // LCD enerjlendiğinde LCD'nin hazır olması için beklenen süre
   
   for(i=0;i<=3;i++)    // LCD'ye 3 kez 0x03 komutu gönderiliyor
   {
      lcd_komut(0x03);
      delay_ms(5);      // 5msn gecikme veriliyor
   }
   lcd_komut(0x02); // LCD'ye 4 bit iletişim komutu gönderiliyor
   lcd_komut(0x28); // 4 bit iletişim, 2 satır, 5x8 dot matris seçildi
   lcd_komut(0x08); // Display Kapalı
   lcd_komut(0x0C); // Display açık,imleç alt çizgi ve yanıp sönme yok
   lcd_komut(0x06); // Her veri yazıldığında imleç bir sağa gitsin
   lcd_komut(0x01); // Display sil. İmleç 1.satır 1.sütunda
}


program şöyle çalışıyor çalışmaya başladığında direk ana menüye gidiyor orda saati tarihi ve alarmı ayarlıyorsunuz sonra
ekrana gidiyor ekranda saat tarih ve haftanın gününü gösteriyor alarm saati gelincede rd7 pininden çıkış veriyor
kullanmak ve geliştirmek isteyen burdan kodları alabilir herkese iyi günler :)


EMRE SALMAN

Recep METE

#1
Hocam paylaşımın için çok teşekkürler.Geçekten işimize yarıyacak bir program.Bunun isi şemasınıda yükler misin?

mesaj birleştirme:: 20 Mayıs 2014, 00:09:56

Lcd'den görüntü alamıyorum.Kodda eksik birşey mi var.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

emre salman

hocam bende isis şeması yok ama lcd yi nasıl bağladınız kristal doğrumu ben devreyi direk kurdum hiç bir sorun olmadı çalıştı lcd bağlantılarınızda hata olabilir rd7 pininden çıkış geliyor mu ilk açıldığı anda 150 ms lik bir çıkış vermesi lazım açılır açılmaz onu bir kontrol edin eğer geliyorsa lcd ile ilgili bir sorununuz var

Recep METE


Alıntı yapılan: semfero - 19 Mayıs 2014, 22:17:54
Lcd'den görüntü alamıyorum.Kodda eksik birşey mi var.
Arkadaşım hatayı düzelttim.Çok güzel çalışıyor.Herkes faydalansın diye "isis şeması" buyrun:
http://www.dosya.tc/server30/pkFI2S/calarsaat-alarm.rar.html
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

emre salman


Recep METE

LCD bacaklarını yanlış bağlantı yapmışım. Dikkat sizlik yani.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mechanicalengine


emre salman

#7
Bnm verdiğm lcd bağlantısında mı sorun var bende hiç bşr sorun yok tıkır tıkır saat gibi çalışıyor aynı sanki saat :D

mesaj birleştirme:: 22 Mayıs 2014, 15:58:36

Bnm verdiğim kutuphaneyi kullanmanız lazım onu kullsnmazsanız sorun yaşarsınız

mechanicalengine

Yukarıdaki lcd dosyasını compile ettiğimizde komut kelimesi için "undefined identifier" uyarısı çıkıyor.

Bu uyarıyı almamak için ne yapmak gerekiyor?


emre salman

#9
include "benim_lcd.c" yazdın mı kodlarını buraya koymazsan anlayamayız bende her hangi bir hata vermedi

mesaj birleştirme:: 18 Haziran 2014, 17:23:24

lcd kütüphanesini compile etmiceksiniz onu sadece ana programda kütüphane olarak kullanırken compile yapıcaksınız

erkan614

@zerolax
zahmet olmazsa
İsis dosyası çalışan hex uzantılı dosya ve css c dosyasını yükleyebilirmisiniz
aynısının picbasic versyonunu yapmaya çalışıcam