Led Display Veri Gelince Sönüyor

elektroxi

Üye
Katılım
7 Tem 2018
Mesajlar
3
Puanları
1
Yaş
34
RS232 den alınan ASCII sayıyı led displayde göstermek için yaptığım devrede veri geldiğinde sayılar displayde gözüküyor taramada çalışıyor titreme sorunu da yok buraya kadar her şey normal. Fakat veri geldiği anda displayler anlık olarak sönüyor ve tekrar rakamları gösteriyor (sanırım rda kesmesinde tarama duruyor). Veri hızlı geldiği için (saniyede bir kez yenileniyor) display sürekli yanıp sönüyor. Kodlarda ne gibi bir düzeltme yapmam gerekiyor?

Kod:
/******************************************************
      PIC16F877 ile RS232 Seri İletişim Uygulaması

*******************************************************/

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

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

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

#use fast_io(b)
#define display_1 pin_b1
#define display_2 pin_b2
#define display_3 pin_b3
#define display_4 pin_b4
#define display_5 pin_b5

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
                                                                  // TX,RX uçlarının hangi pinler olacağını tanımlıyor
// parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

int  veri[8];  // rs232 den gelen veri
int  a,b,c,d,e; // haberleşme sayıları
const int digit[10]={0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10,};


#int_rda
void serihaberlesme_kesmesi ()

{
  disable_interrupts(int_rda); // int_rda kesmesini pasif yap

  gets(veri); // String ifadeyi al ve "veri" adlı dizi değişkenine aktar.

  a=((veri[6])-48); // ascii türündeki sayılar decimale çevriliyor
  b=((veri[5])-48);
  c=((veri[4])-48);
  d=((veri[3])-48);
  e=((veri[2])-48);

  if(e==-16) // olmayan sayı yerine gönderilen 0x20 hex kodu "0" rakamına çevriliyor
  e=0;

  if(d==-16)
  d=0;

  if(c==-16)
  c=0;

  if(b==-16)
  b=0;

  if(a==-16)
  a=0;


}

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

void main ( )
{
  setup_psp(PSP_DISABLED);        // PSP 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ışı

  set_tris_b(0x00);
  set_tris_d(0x00);

  output_low(display_1);
  output_low(display_2);
  output_low(display_3);
  output_low(display_4);
  output_low(display_5);

  a=0; //önceden kalan veriler sıfırlanıyor.
  b=0;
  c=0;
  d=0;
  e=0;



  while(TRUE) // Sonsuz döngü
  {
  clear_interrupt(int_rda);
  enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
  enable_interrupts(int_rda); // int_rda kesmesi aktif


  output_high(display_5); //Display taranıp sayılar gönderiliyor. Sayının solunda sıfır olan dijitler söndürülüyor.
  output_d(digit[a]);
  delay_ms(1);
  output_low(display_5);

  if((e==0)&&(d==0)&&(c==0)&&(b==0))
  output_low(display_4);
  else
  output_high(display_4);

  output_d(digit[b]);
  delay_ms(1);
  output_low(display_4);

  if((e==0)&&(d==0)&&(c==0))
  output_low(display_3);
  else
  output_high(display_3);

  output_d(digit[c]);
  delay_ms(1);
  output_low(display_3);

  if((e==0)&&(d==0))
  output_low(display_2);
  else
  output_high(display_2);

  output_d(digit[d]);
  delay_ms(1);
  output_low(display_2);

  if(!(e==0))
  output_high(display_1);
  else
  output_low(display_1);

  output_d(digit[e]);
  delay_ms(1);
  output_low(display_1);

  }

}

 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…