Teknomerkez
TR EN ES
Konular

CCS-C ve 16F628A ile yapılmış basit bir geri sayıcı

Yazar: Samet Yüzügüllü
Tarih: 12.06.2012
Türkçe

16F628A ile yapılmış basit bir geri sayıcı. başla ve durdur, reset, ayar butonlarından oluşan geri sayıcı lcd ile gösterilmiştir. LCD yerine istenirse 7-seg displayde kullanılabilir. Program ayar menüsündeyken başla butonu işlemiyor, sayarkende ayar menüsüne girmiyor.

Şemayı pdf dosya olarak indirmek için tıklayınız.

Devreye ait dosyaları indirmek için tıklayınız.

#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)
#include "new_lcd.c"
int8 sadise=0,saniye=0,dakika=0,saat=0,ayr=0,durum=0;

#int_TIMER1 //GERÇEK ZAMANLI SAYIM İÇİN TIMER1 KESMESİ
void  TIMER1_isr(void) 
{
set_timer1(15510);
sadise--;

}
//GERI SAYMASI ICIN ALT PROGRAM
void geri(){
   if(sadise==255){
   saniye--;
   sadise=9;
   }
      else if(saniye==255){
      dakika--;
      saniye=59;
      }
      
      else if(dakika==255){
      saat--;
      dakika=59;
      }
      else if(saat==255)saat=23;
}
//SAAT, DAKİKA, SANİYE AYARLAMA İÇİN ALT PROGRAM
void ayar(){
   if(input(pin_a2)&&durum==0){
      ayr++;
      while(input(pin_a2));}
      
   if(ayr==1){
   lcd_gotoxy(1,1);
   printf(lcd_putc," Saniye Ayarla");}
   if(input(pin_a3)&&ayr==1){
   saniye++;
   while(input(pin_a3));}
   
   if(input(pin_a4)&&ayr==1){
   saniye--;
   while(input(pin_a4));}

   if(ayr==2){
   lcd_gotoxy(1,1);
   printf(lcd_putc," Dakika Ayarla     ");}
   if(input(pin_a3)&&ayr==2){
   dakika++;
   while(input(pin_a3));}
   
   if(input(pin_a4)&&ayr==2){
   dakika--;
   while(input(pin_a4));}
   
   if(input(pin_a3)&&ayr==3){
   saat++;
   while(input(pin_a3));}
   
   if(input(pin_a4)&&ayr==3){
   saat--;
   while(input(pin_a4));}
   
   if(ayr==3){
   lcd_gotoxy(1,1);
   printf(lcd_putc,"  Saat Ayarla    ");}
   
   if(ayr==4){
   ayr=0;
   printf(lcd_putc,"f");}
}
//LCDDE GÖSTERMEK İÇİN ALT PROGRAM
void lcd(){
lcd_gotoxy(3,2);
      printf(lcd_putc,"%02u:%02u:%02u:%02u     "saat,dakika,saniye,sadise);
if(durum==1){
lcd_gotoxy(4,1);
      printf(lcd_putc,"SAYIYOR...     ");}
 if(durum==0&&ayr==0){
lcd_gotoxy(4,1);
      printf(lcd_putc," DURDU...     ");}
      
      }

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   set_tris_b(0);
   output_b(0);
   set_tris_a(255);
   output_a(0);
   lcd_init();
   delay_ms(10);
   lcd_gotoxy(3,1);
   printf(lcd_putc,"GERI SAYICI");
   delay_ms(1000);
   lcd_gotoxy(9,1);
   printf(lcd_putc,"f");//EKRAN TEMİZLEME
   set_timer1(15510);
   
   while(1){
   geri();
   lcd();
   ayar();
   
   //SAYMA İŞLEMİNİ BAŞLATMAK İÇİN
   if(input(pin_a0)&&ayr==0&&durum==0){
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
      durum=1;
      while(input(pin_a0));}
      //SAYDIRMA İŞLEMİNİ DURDURMAK İÇİN
      if(input(pin_a0)&&durum==1){
     setup_timer_1(T1_DISABLED);
      durum=0;
      while(input(pin_a0));}
      //RESETLEMEK İÇİN
      if(input(pin_a1)){
      setup_timer_1(T1_DISABLED);
      durum=0;
      sadise=0;
      saniye=0;
      dakika=0;
      saat=0;
      while(input(pin_a1));}
      //DURUMLARIN HEPSİ AYNI OLDUGUNDA PROGRAMIN DURMASI
      if(saat==0&&dakika==0&&saniye==0&&sadise==0){
       setup_timer_1(T1_DISABLED);
      durum=0;
      }
      //SINIRLANDIRMALAR
      if(saniye==60)saniye=0;
      if(dakika==60)dakika=0;
      if(saat==24)saat=0;
   
   }
}



Yorumlarınız

ferhat - 23.12.2012
bu devrenin c kodu hata veriyo bi yardımcı olursanız sevinirim acill
ferhat - 23.12.2012
bu devrenin c kodunda bi sıkıntı var arkdaşlar bi yardımcı olabilirmisiniz lütven acilll
samet yüzügüllü - 10.01.2013
Devrenin kodlarında hiç bir hata yok. devre similasyonda çalıştırıldı. ayrıca delikli plaket üzerine kurularakda çalıştırıldı. devreyi bizzat denedim. çalışmayan program göndermem. yalnız programı c de değil ccs c de yazdım.
mehmet - 22.04.2013
lcd dosyasında hata veriyor yükleyen arkadaş new_lcd.c dosyasını atsa idi bu hata olmazdı. yada bu dosyanın linkini verse
mehmet - 28.04.2013
Arkadaşlar bu devre üzerinde calışıyorum yeni öğreniyorum burdaki dataları yani mesela ayarldım 1 saat 10 dk bunu pic e kaydetmek için ne yapmam lazım devmlı onunla açılacak yani ayarı kaydedecek yardımcı olan olursa memnun olurum teşekkürler
hakan - 15.04.2021
ayar yapmadan direk başlata basıldığında neden 255 den geri saymaya başlıyor

Bir yorum ekleyin

İsim:
E-posta:
Yorumunuz:
Güvenlik Kodu:
 
Tüm alanları doldurmak zorunludur. Yorumunuz kontrol edilince yayınlanacaktır. E-posta adresi yayınlanmaz.
İzin verilen html etiketler (tag): <p><div><b><strong><i><u><del><hr><sup><sub><br>