/******************************************************
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);
}
}