;PROGRAM-6) DECFSZ komutu kullanarak zaman gecikme döngüsü düzenlemeye 
;örnek program. A port’unun 0. bit'indeki butona bastıkça B port’undaki 
;LED'leri binary 9'dan 0'a kadar azaltarak yakar. 
;Butonda meydana gelebilecek arktan ve butona basış süresinin uzunluğundan 
;oluşacak “0” seviyesine düşmeler DECFSZ komutu ile yapılan basit 
;bir zaman gecikme döngüsü ile elenmiştir.
 
;Şekil 7 – 6 : PROG6.ASM programının akış diyagramı.
;===PROG6.ASM====04/05/2005=================================
	LIST	P=16F628A
	INCLUDE	"P16F628A.INC"
	__CONFIG _RC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;-----------------------------------------------------------
SAYAC1	EQU	H'20'		;SAYAC1 saklayıcısının adresi
SAYAC2	EQU	H'21'		;SAYAC2 saklayıcısının adresi
	BANKSEL 	TRISB		;BANK1'e geç
	CLRF		TRISB		;PortB'nin tüm uçları çıkış
	MOVLW	H'FF'		;W ? h'FF'
	MOVWF	TRISA		;PortA'nın tüm uçları giriş
	BANKSEL 	PORTB		;BANK0'a geç
	MOVLW	h'07'		;W saklayıcıya b’00000111’ yükle
	MOVWF	CMCON 		;PORTA girişleri dijital I/O
	CLRF		PORTB		;PortB'yi sıfırla
BASLA	
	MOVLW	H'0A'		;W ? d’10’
	MOVWF	SAYAC1		;SAYAC1 ? W
TEST
	BTFSC	PORTA,0		;PortA'nın 0. bit'i 0 mı?
	GOTO		TEST			;Hayır, tekrar test et
	MOVLW	H'20'		;Evet, W ? d'32'
	MOVWF	SAYAC2		;SAYAC2 ? W	
GECIKME					;Gecikme sağlama bölümü
	NOP					; Bir komut çevrimi bekle
	NOP					;		"
	NOP					;		"
	DECFSZ	SAYAC2, F		;SAYAC2=SAYAC2-1, SAYAC2=0 mı?
	GOTO		GECIKME		;Hayır, tekrar gecikme yap
AZALT					;Evet, SAYAC1’i “1” azalt
	DECFSZ	SAYAC1, F		;SAYAC1=SAYAC1-1,SAYAC1=0 mı?
	GOTO	YAK				;Hayır, sayıyı PortB’de göster
	GOTO	BASLA			;Evet, tekrar 9’dan başla
YAK
	MOVF		SAYAC1,W		;W ? SAYAC1
	MOVWF	PORTB		;SAYAC1'i PortB'ye gönder.
	GOTO		TEST			;PortA'yi tekrar test et.
	END					;Program kodlarının sonu
;-----------------------------------------------------------

