16f877a Buton ile 0-99 ileri geri sayıcı

Başlatan FYA5, 27 Şubat 2014, 04:14:51

FYA5

Arkadaşlar merhaba elimde 2 katot 7 segment display var bunu 16f877a ile sayıcı yapacağım.Normal butonsuz yaptım onda sorun olmadı.Ancak butonlu yapmaya çalıştığımda sıkıntı oluyor.Devre şemasını yok ama kısaca anlatayım anlarsınız.Displaylere giden uçları B ve D portundan aldım.İleri butonunuda A2 pinine bağladım.

Kodlarım ise şöyle.

#include "C:\Users\FYA\Desktop\PİC PROJELER\Display\Buton ile sayıcı\buton.h"
#define buton pin_a2
int i=0,j=0;
const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07,0x7F, 0x6F};
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_tris_a(0xFC);
   set_tris_b(0x00);
   set_tris_d(0x00);
   
   output_d(digit[j]);
   output_b(digit);
   
  while(1){

if(input(buton)){
j++;
output_d(digit[j]);
  if(j==9){
j=0;
i++;
output_b(digit);
}
if(i==9){
i=0;


}
}

  }
}


Hata nerede söyleyebilir misiniz?

tacettin

Alıntı Yapconst int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07,0x7F, 0x6F};
16 elemanlı dizide 10 eleman var.


Alıntı Yapoutput_b(digit);
dizinin hangi elemanı?

Recep METE

Arkadaşım bunu denermisin, bu kod çalışıyor.Yada kendi kodunla karşılaştırabilirsin.
/******************************************************
 Uygulama Adı      : Display Uygulaması-2 (Buton İle 0-99 Yukarı Sayıcı)
 
*******************************************************/

#include <16f877a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   buton      pin_a2      // buton ifadesi pin_a2 ifadesine eşitleniyor

char birler=0, onlar=0, sayi=0;       // char tipinde değişkenler tanımlanıyor

// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


   set_tris_a(0xFC);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda

   while(1)
   {
         birler=sayi%10;  // birler hanesi hesaplanıyor
         onlar=sayi/10;   // onlar hanesi hesaplanıyor

         output_low(display_2);  // 2. display aktif durumda
         output_b(digit[birler]); // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_high(display_2);   // 2. display pasif durumda
         output_low(display_1);  // 1. display aktif durumda
         output_b(digit[onlar]);  // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_high(display_1);   // 1. display pasif durumda

         if (input(buton))  // Arttır butonuna basıldı ise
         {
            delay_ms(10);   // Buton arklarını önleme gecikmesi

            sayi++;         // sayi değişkenini 1 arttır

            if (sayi==100)  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;

            birler=sayi%10;          // birler hanesi hesaplanıyor
            onlar=sayi/10;           // onlar hanesi hesaplanıyor

            while(input(buton))  // Buton bırakılana kadar döngüyü işle
            {
               output_low(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda
            }
         }
   }
}
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

FYA5

Alıntı yapılan: tacettin - 28 Şubat 2014, 04:14:00

16 elemanlı dizide 10 eleman var.

dizinin hangi elemanı?

Harfleri çıkarttım.Ondan dolayı 16 eleman görünüyor

FYA5

Alıntı yapılan: semfero - 28 Şubat 2014, 09:12:43
Arkadaşım bunu denermisin, bu kod çalışıyor.Yada kendi kodunla karşılaştırabilirsin.
/******************************************************
 Uygulama Adı      : Display Uygulaması-2 (Buton İle 0-99 Yukarı Sayıcı)
 
*******************************************************/

#include <16f877a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   buton      pin_a2      // buton ifadesi pin_a2 ifadesine eşitleniyor

char birler=0, onlar=0, sayi=0;       // char tipinde değişkenler tanımlanıyor

// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


   set_tris_a(0xFC);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda

   while(1)
   {
         birler=sayi%10;  // birler hanesi hesaplanıyor
         onlar=sayi/10;   // onlar hanesi hesaplanıyor

         output_low(display_2);  // 2. display aktif durumda
         output_b(digit[birler]); // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_high(display_2);   // 2. display pasif durumda
         output_low(display_1);  // 1. display aktif durumda
         output_b(digit[onlar]);  // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_high(display_1);   // 1. display pasif durumda

         if (input(buton))  // Arttır butonuna basıldı ise
         {
            delay_ms(10);   // Buton arklarını önleme gecikmesi

            sayi++;         // sayi değişkenini 1 arttır

            if (sayi==100)  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;

            birler=sayi%10;          // birler hanesi hesaplanıyor
            onlar=sayi/10;           // onlar hanesi hesaplanıyor

            while(input(buton))  // Buton bırakılana kadar döngüyü işle
            {
               output_low(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda
            }
         }
   }
}

,

Serdar Çiçek Pdf :) .Aynı yerden yapıyordum.Ancak ondaki İkili Display bendeki 2 tane ayrı ayrı.Kodları biraz değiştirdim oldu.Ancak şöyle bir sıkıntı var bu seferde.Elimi basılı tuttuğum sürece artırıyor.Yani tek basıp çektğimde artmıyor illaki basılı tutmam lazım