﻿/******************************************************
 Uygulama Adı      : 8255 İle Port Kontrol Uygulaması
*******************************************************/
#include <16f877.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 standard_io (a) // A portu için giriş/çıkış yönlendirmesi yapılmasına gerek yok
#use standard_io (b) // B portu için giriş/çıkış yönlendirmesi yapılmasına gerek yok

int data; // Tamsayı tipinde değişken tanımlanıyor

//************** 8255 OKUMA FONKSİYONU ***************
void _8255_yazma (char x, char bilgi)
{
   switch (x)
   {
      case   'k':                   // Kaydediciye yazma seçilirse
             output_a(0b00001101);  // Kaydediciye yazma
             output_b(bilgi);       // Yazılacak bilgi gönderiliyor
             break;

      case   'a':                   // A portuna yazma seçilirse
             output_a(0b00000001);  // A portuna yazma
             output_b(bilgi);       // Yazılacak bilgi gönderiliyor
             break;

      case   'b':                   // B portuna yazma seçilirse
             output_a(0b00000101);  // B portuna yazma
             output_b(bilgi);       // Yazılacak bilgi gönderiliyor
             break;

      case   'c':                   // C portuna yazma seçilirse
             output_a(0b00001001);  // C portuna yazma
             output_b(bilgi);       // Yazılacak bilgi gönderiliyor
             break;

      default:
             break;
     }
}

//************** 8255 YAZMA FONKSİYONU ***************
int _8255_okuma (char x)
{
   switch (x)
   {
      case   'k':
             output_a(0b00001110); // Kaydediciden okuma
             return(input_b());    // Kaydedici değeri okunuyor
             break;
      case   'a':
             output_a(0b00000010); // A portundan okuma
             return(input_b());    // A portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
             break;
      case   'b':
             output_a(0b00000110); // B portu okuma
             return(input_b());    // B portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
             break;
      case   'c':
             output_a(0b00001010); // C portu okuma
             return(input_b());    // C portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
             break;
      default:
             break;
   }
}
/********* 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ışı

   _8255_yazma('k',0b10001001); // A portu çıkış, C portu giriş, B portu çıkış yapılıyor

   while(1) // Sonsuz döngü
   {
      data=(_8255_okuma('c'));  // C portu okunuyor
      _8255_yazma('a',data);    // A portuna okunan C portu değeri yazılıyor
   }
}



