﻿/******************************************************
      PIC16F877 ile Flash Program Hafızası Uygulaması
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#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(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c> // LCD.c dosyası programa ekleniyor

int16  adres=0,deger=0;

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

   set_tris_a(0x01);   // RA1 pini giriş

   lcd_init();         // LCD kurulumu yapılıyor

   printf(lcd_putc,"\fProgram Kodlari"); // LCD'ye yazı yazdırılıyor
   delay_ms(1000);
   printf(lcd_putc,"\fAdres       Kod"); // LCD'ye yazı yazdırılıyor

   while (!(adres==0x3FFF)) // Program kodu 0x3FFF değerine eşit oluncaya kadar döngüyü işle
                            // 0x3FFF Boş olan program bellek kodudur.
   {
      deger=read_program_eeprom(adres); // Program kod hafızasında belirtilen adresteki kodu oku
      lcd_gotoxy(1,2); // İmleç 1.sütun 2.satırda
      printf(lcd_putc,"\n%lx        %lx",adres,deger); // LCD'ye program kod hafızası adresini ve içindeki kodu yaz
      delay_ms(500);
      adres++; // adres değişkeni içeriğini 1 arttır

      if (input(pin_a0)) // Eğer RA0 girişindeki butona basılırsa
      {
         delay_ms(20);  // Buton arkını önlemek için
         write_program_eeprom(adres, 0x0000); // Belirtilen program kod hafızası adresine 0 bilgi yaz
      }
   }
   printf(lcd_putc,"\fProgram Bitti..."); // Programın sonuna geldiğini bildirir
}

