;PROGRAM-31) Uyku (sleep) modununun kullanılmasına örnek program. 
;PIC’e enerji verince PORTB’nin alt 4 bit’ine (RB0, RB1, RB2, RB3) 
;bağlı LED’lerde H’00’dan h’FF’e kadar artan binary sayıları gösteren 
;LED’lerin yanışı görülür. Sayı h’FF’e geldiğinde tekrar H’00’dan 
;saymaya başlar. RA0’a bağlı bir butona basınca tüm LED’ler söner ve 
;PIC uyku moduna girer. PIC’i uyku modundan çıkarmak için RB<4:7> 
;değişiklik kesmesi kullanılır. RB4~RB7 butonlarından birisine basınca 
;LED’ler uyku moduna girdiği anda kaldığı sayıdan itibaren saymaya devam eder.  

;===PROG31.ASM====14/06/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
;-----------------------------------------------------------
SAYAC1	EQU	h'20'
SAYAC2	EQU	h'21'
	ORG	h'0000'	;Reset veya ilk gerilim verildiğinde
	GOTO	BASLA	;BASLA etiketine git.
	ORG	h'0004'	;Kesme oluştuğunda
	GOTO	KESME	;KESME adlı alt programa git.
BASLA
	CLRF	PORTB	;PORTB'deki tüm LED'leri söndür.
	BANKSEL	TRISB	;BANK1'e geç 
	MOVLW	h'F0'	;Alt 4 bit çıkış, üst 4 bit giriş
	MOVWF	TRISB	
	MOVLW	H'FF'	;PORTA’nın Tüm uçları giriş
	MOVWF	PORTA
	BANKSEL	PORTB	;BANK0’a geç
	MOVLW	h'07'	;PORTA'nın tüm girişleri normal I/O
	MOVWF	CMCON
	BSF	INTCON,7	;Tüm kesmelere izin ver.
	BSF	INTCON,3	;RB<4:7> kesmesine izin ver.
SAY
	BTFSS	PORTA,0	;RA0 butonuna basıldı mı?
	CALL	UYU		;Evet, UYU etiketine dallan.
	INCF	PORTB,F	;Hayır, PORTB'deki LED'leri 1 arttır.
	CALL	GECIKME	;Bekle
	GOTO	SAY		;Sonraki sayı için SAY etiketine git.
UYU
	MOVF	PORTB,W	;W ? PORTB'nin değerini W'de sakla
	CLRF	PORTB	;En az tüketim için LED'leri söndür.
	SLEEP			;Uyuma moduna geç.
	NOP			;Bir komut çevrimi süresince bekle
	MOVWF	PORTB	;PORTB ? W’nin değerini geri yükle
	RETURN			;Uykudan çıkınca kaldığı sayıdan devam et
KESME
	BCF	INTCON,7	;Kesme çalışırken yeni kesmeleri engelle
		;Buraya kesme alt programı içerisinde
		;işlem yapacak olan komutlar yazılabilir.
	BCF	INTCON,0	;RB<4:7> kesmesini tekrar kullanabilmek
				; için sıfırla
	BSF	INTCON,7	;Tüm kesmelere izin ver.
	RETFIE			;KESME alt programından dön
GECIKME			;Gecikme alt programı
	MOVLW	h'FF'
	MOVWF	SAYAC1
DONGU1
	MOVLW	h'FF'
	MOVWF	SAYAC2
DONGU2
	DECFSZ	SAYAC2, F
	GOTO	DONGU2
	DECFSZ	SAYAC1, F
	GOTO	DONGU1
	RETURN
	END
;-----------------------------------------------------------
