;PROGRAM-39) PIC16F628A’nın dahili EEPROM veri belleğine veri
;yazdırma ve okuma işlemine örnek program. RA0 pin’ine bağlı 
;butona basınca EEPROM’un h’05’ adresine h’8F’ verisini, RA4 
;pin’indeki butona basınca da EEPROM’un h’05’ adresine h’3D’ 
;verisini yazan, RA7 pin’indeki butona basınca yine h’05’ 
;adresindeki veriyi PortB’deki LED’lerde gösteren program.
 
;===PROG39.ASM====15/09/2005===============================
	LIST	P=16F628A
	INCLUDE	"P16F628A.INC"     
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;=============DEĞİŞKEN TANIMLAMA===========================
SAYAC	EQU	H'20'
ADR		EQU	h'70'
DAT		EQU	h'71'
;============PORTLARI YÖNLENDİRME==========================
	BANKSEL	TRISB	; Bank1
	CLRF	TRISB	; PortB tüm pin’ler çıkış
	MOVLW	h'FF'		
	MOVWF	TRISA	; PortA tüm pin’ler giriş
	BANKSEL PORTB	; Bank0
	MOVLW 	h'07'	; PortA’nın pin’leri normal I/O 
	MOVWF 	CMCON	;
	CLRF	PORTB	; Tüm LED'leri söndür
;====BUTONLARI OKUMA ve ADRES, VERİ BİLGİLERİNİ GİRME======
RA0_TEST
	BTFSC	PORTA,0	; RA0'a basıldı mı?
	GOTO	RA4_TEST	; Hayır, RA0'ı tekrar kontrol et
	CALL	GECIKME	; Evet, buton arkını söndür
	MOVLW	h'05'	; W ? h’05’ adresini yükle
	MOVWF	ADR	; ADR ? W (h’05’)
	MOVLW	h'8F'	; W ? EEPROM'a yazılacak veri
	MOVWF	DAT	; DAT ? W (h’F8’)
	CALL	YAZDIR	; EEPROM’a yazmaya git.	
RA4_TEST
	BTFSC	PORTA,4	; RA4'e basıldı mı?
	GOTO	RA7_TEST	; Hayır, RA7'yi kontrol et
	CALL	GECIKME	; Evet, buton arkını söndür
	MOVLW	h'05'	; W ? h’05’ adresini yükle
	MOVWF	ADR	; ADR ? W (h’05’)
	MOVLW	h'3D'	; W ? EEPROM'a yazılacak veri
	MOVWF	DAT	; DAT ? W (h’3D’)
	CALL	YAZDIR	; EEPROM’a yazmaya git.
RA7_TEST
	BTFSC	PORTA,7	; RA7'ye basıldı mı?
	GOTO	RA0_TEST	; Hayır, butonları tekrar oku
	CALL	OKU_GOSTER	;Evet, EEPROM oku ve LED'lerde göster
	GOTO	RA0_TEST	; Butonları tekrar oku
;=============OKUMA VE PORTB'DE GÖSTERME===================
OKU_GOSTER
	MOVLW	h'05'	; W ? h’05’ adresini yükle
	MOVWF	ADR	; ADR ? W (h’05’)
	BANKSEL EEADR		; Bank1
	MOVWF	EEADR		; EEADR ? W
	BSF	EECON1,RD		; Okumayı aktif yap (RD=1)
	MOVF	EEDATA,W		; W ? EEDATA
	BANKSEL PORTB		; Bank0
	MOVWF	PORTB		; PORTB ? W (LED'lerde göster)
	RETURN
;==============ADRESLENEN HÜCREYE YAZDIRMA=================
YAZDIR
	BANKSEL EEADR		; Bank1
	MOVF	ADR,W		; W ? ADR (h’05’)
	MOVWF	EEADR		; EEADR ? W
	MOVF	DAT,W		; W ? DAT (yazılacak veri)
	MOVWF	EEDATA		; EEDATA ? W 
;----------Yazma için gerekli bayrakları kur---------------
	BANKSEL	PIR1		; Bank0
	BCF	PIR1,EEIF		; Yazma bitiş kesme bayrağını kur
	BANKSEL	EECON1		; Bank1
	BSF	EECON1,WREN		; EEPROM'a yazmaya izin ver
	BCF	INTCON,GIE		; Kesmeleri iptal et
;------------Yazma işlemi için gerekli kodlar-------------- 
	MOVLW	h'55'		; 
	MOVWF	EECON2		; EECON2 saklayıcısına önce h'55'
	MOVLW	h'AA'		;daha sonra da h'AA' verisini yaz
	MOVWF	EECON2		; 
	BSF	EECON1,WR		; Yazmayı başlat (WR=1)
	BANKSEL	PIR1		; Bank0
BEKLE1	;----Yazmanın bitmesini kontrol etme bölümü-----
	BTFSS	PIR1,EEIF	; EEIF bayrağı=1 mi?(Yazma bitti mi?)
	GOTO	BEKLE1	; Hayır, yazmanın bitmesini bekle
;----------Bayrakları ilk konumuna getir-------------------
	BCF	PIR1,EEIF	; Kesme bayrağını sıfırla 
	BANKSEL	EECON1	; Bank1
	BCF	EECON1,WREN	; Yazmayı yasakla
	BSF	INTCON,GIE	; Kesmeler geçerli
	BANKSEL PORTB	; Bank0
	RETURN
GECIKME  ;=======BUTON ARKINI SONDURME GECIKMESI==========
	MOVLW	h'55'
	MOVWF	SAYAC
BEKLE2
	DECFSZ	SAYAC
	GOTO	BEKLE2
	RETURN
	END
;-----------------------------------------------------------
