﻿/******************************************************
      PIC16F877 ile Tuş Takımı Uygulaması-2 (74C922 İle)
*******************************************************/
#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ılacak osilatör frekansı belirtiliyor.
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli

#byte   portc=0x07   // C portu "portc" ismine eşitleniyor.

char const keys[] ={1,2,3,0,   // Gelen bilgilere göre gösterilmesi
                    4,5,6,0,    // istenen karakterler
                    7,8,9,0,
                    0xF,0,0xF,0 };

//*********** Dış Kesme Fonksiyonu Tanımlanıyor ********
#int_ext            // Dış kesme fonksiyonu
void dis_kesme ()
{
   portc=keys[portc>>4];  // C portuna C portunun okunan yüksek değerlikli 4 biti aktarılıyor
}


//********** 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ışı

   set_tris_b(0x01);   // B portu komple çıkış
   set_tris_c(0xF0);   // C portunun Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş

   ext_int_edge(L_TO_H);  // INT_EXT dış kesmesinin yükselen kenarda aktif olacağını belirtir

   enable_interrupts(INT_EXT);  // Dış kesme aktif
   enable_interrupts(GLOBAL);   // Aktif edilen kesmelere izin ver

   portc=0;  // Başlangıçta C portu çıkışı sıfırlanıyor

   while(1);  // Sonsuz döngü
}


