;PIC16F84 ILE YAPILAN SIFRELI KILIT
;H.SERIMER 4/2002
;WWW.EPROJE.COM ICIN TAZIRLANMISTIR
;DENEYSEL AMACLIDIR
;****************************************************************************
TANIMLAMALAR:
	list      p=16F84A             	; DERLEYICIYE ISLEMCI TANITILIR
	#include <p16F84A.inc>         	; PIC16F84 TANIMLAMA DOSYASI

	KEYB_DATA	EQU	H'0010'
	KEYB_SCAN	EQU	H'0011'
	SOFT_INT_TIMER1	EQU	H'0012'
	FONKSIYON	EQU	H'0013'
	msb		EQU	H'0014'
	lsb		EQU	H'0015'
	SYSCON		EQU	H'0016'
	M_TEMP0		EQU	H'0017'
	KEYCOUNT	EQU	H'0018'	

	KEY_BUFFER1	EQU	H'0020'
	KEY_BUFFER2	EQU	H'0021'
	KEY_BUFFER3	EQU	H'0022'
	KEY_BUFFER4	EQU	H'0023'
	KEY_BUFFER5	EQU	H'0024'
	KEY_BUFFER6	EQU	H'0025'
	KEY_BUFFER7	EQU	H'0026'
	KEY_BUFFER8	EQU	H'0027'

	; SIFRELI KILIT ICIN ISTEDIGINIZ 4 HANELI SIFREYI
	; BURADA BELIRLEYIN
	; SUAN SIFRE 1881 OLARAK TANIMLIDIR
	SIFRE1		EQU	D'1'
	SIFRE2		EQU	D'8'
	SIFRE3		EQU	D'8'
	SIFRE4		EQU	D'1'


;PORTB UCLARI
	KEY_SCAN0	EQU	H'0003'
	KEY_SCAN1	EQU	H'0002'
	KEY_SCAN2	EQU	H'0001'

;PORTA UCLARI
	IRCODE		EQU	H'0000'
	KIRMIZILED	EQU	H'0003'
	YESILLED	EQU	H'0002'
	ROLE		EQU	H'0001'
	BUZZER		EQU	H'0004'

;SYSCON UCLARI
	BUTON_BASILI	EQU	H'0000'
	SIFRE_GECERLI	EQU	H'0001'
	KILIT_DURUM	EQU	H'0002'


	__CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC


	ORG	H'0000'
	GOTO	BASLA

	ORG	H'0004'
	GOTO	INT_VECTOR

;****************************************************************************
;****************************************************************************
BEKLEME_DONGUSU:
	NOP
	clrwdt
	NOP
	GOTO	BEKLEME_DONGUSU	

;****************************************************************************
;****************************************************************************
	ORG	H'0010'	
INT_VECTOR
	;TIMER0 INTERRUPTU ?
	;BORTB KEYPRESS?
	GOTO	BEKLEME_DONGUSU

;****************************************************************************
;****************************************************************************
BASLA:
	CLRF	SYSCON
	CLRF	KEYCOUNT

	MOVLW	H'FF'
	MOVWF	KEYB_DATA
	MOVLW	B'11111110'
	MOVWF	SOFT_INT_TIMER1

	MOVLW	B'11111110'
	MOVWF	KEYB_SCAN
	CALL	PORTLARI_AYARLA

ALGORITMA:
	clrwdt
	NOP
	CALL	TUS_DEGERI_HESAPLA

;KILIT DURUMU KONTROLU
	BTFSC	SYSCON,KILIT_DURUM
	GOTO	KILITDURUM1
	GOTO	KILITDURUM2
KILITDURUM1:
;KILITACIK
;KILIT ACIK KONUMDA ISE YESIL LED YAKILIR KIMIZI LED SONDURULUR
	BSF	PORTA,YESILLED
	BCF	PORTA,KIRMIZILED
	BSF	PORTA,ROLE
	GOTO	KILITDURUMSON
KILITDURUM2
;KILIT KAPALI:
;KILIT KAPALI KONUMDA ISE KIMIZI LED YAKILIR YESIL LED SONDURULUR
	BSF	PORTA,KIRMIZILED
	BCF	PORTA,YESILLED
	BCF	PORTA,ROLE
KILITDURUMSON:
;TEST ICIN

	CALL	SIFRE_KARSILASTIR

	MOVFW	KEYB_DATA
	MOVWF	M_TEMP0
	MOVF	M_TEMP0,W	;karsilatirilacak degisken onceden MTEMP'e yuklenmistir
	XORLW	D'11'		;W ile karsilastirilacak tamsayi xor'lanir
	BTFSC	STATUS,Z	;IF W=M_TEMP 
	CLRF	KEYCOUNT

	goto ALGORITMA

;****************************************************************************
;****************************************************************************
TUS_DEGERI_HESAPLA:
;	MOVLW	H'FF'
	MOVFW	KEYB_DATA
	MOVWF	M_TEMP0

;1.sutun 1,4,7,bk
	BCF	PORTB,KEY_SCAN0
	BSF	PORTB,KEY_SCAN1
	BSF	PORTB,KEY_SCAN2
	CALL	DLY_1MS		; BUTON TEKPI SURESI ICIN 1mS BEKLENIR
T_D_H_1:
	BTFSC	PORTB,4
	GOTO	T_D_H_4
	MOVLW	D'1'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_4:
	BTFSC	PORTB,5
	GOTO	T_D_H_7
	MOVLW	D'4'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_7:
	BTFSC	PORTB,6
	GOTO	T_D_H_K
	MOVLW	D'7'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_K:
	BTFSC	PORTB,7
	GOTO	T_D_H_1SON
	MOVLW	D'10'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_1SON:
;2.sutun 2,5,8,0
	BSF	PORTB,KEY_SCAN0
	BCF	PORTB,KEY_SCAN1
	BSF	PORTB,KEY_SCAN2
	CALL	DLY_1MS		; BUTON TEKPI SURESI ICIN 1mS BEKLENIR

T_D_H_2:
	BTFSC	PORTB,4
	GOTO	T_D_H_5
	MOVLW	D'2'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_5:
	BTFSC	PORTB,5
	GOTO	T_D_H_8
	MOVLW	D'5'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_8:
	BTFSC	PORTB,6
	GOTO	T_D_H_0
	MOVLW	D'8'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_0:
	BTFSC	PORTB,7
	GOTO	T_D_H_2SON
	MOVLW	D'0'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_2SON:
;3.sutun 3,6,9,ba
	BSF	PORTB,KEY_SCAN0
	BSF	PORTB,KEY_SCAN1
	BCF	PORTB,KEY_SCAN2
	CALL	DLY_1MS		; BUTON TEKPI SURESI ICIN 1mS BEKLENIR
T_D_H_3:
	BTFSC	PORTB,4
	GOTO	T_D_H_6
	MOVLW	D'3'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_6:
	BTFSC	PORTB,5
	GOTO	T_D_H_9
	MOVLW	D'6'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_9:
	BTFSC	PORTB,6
	GOTO	T_D_H_A
	MOVLW	D'9'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI

T_D_H_A:
	BTFSC	PORTB,7
	GOTO	T_D_H_3SON
	MOVLW	D'11'
	MOVWF	KEYB_DATA
	GOTO	T_D_H_TUSABASILDI
T_D_H_3SON:


;BUTON BASILI KALDI ISE SON TUS HAFIZADA BEKLETILIR
;DEGILSE FF DEGERI VERILIR
T_D_H_BT0:
	BTFSC	SYSCON,BUTON_BASILI
	GOTO	T_D_H_BT1
	GOTO	T_D_H_BT2
T_D_H_BT1:
	MOVFW	M_TEMP0
	MOVWF	KEYB_DATA
	GOTO	T_D_H_BT3
T_D_H_BT2:
	MOVLW	H'FF'
	MOVWF	KEYB_DATA
T_D_H_BT3:

T_D_H_TUSYOK:
	BCF	SYSCON,BUTON_BASILI
	BCF	PORTA,KIRMIZILED
	GOTO	T_D_H_SON

T_D_H_TUSABASILDI:
	BTFSS	SYSCON,BUTON_BASILI
	CALL	KEY_BUFFER_TAZELE
	NOP

	BSF	SYSCON,BUTON_BASILI
	BSF	PORTA,KIRMIZILED

T_D_H_SON:
;TUS TARAMA KAPALI
	BSF	PORTB,KEY_SCAN0
	BSF	PORTB,KEY_SCAN1
	BSF	PORTB,KEY_SCAN2
RETURN
;****************************************************************************
KEY_BUFFER_TAZELE:
	INCF	KEYCOUNT
	MOVFW	KEY_BUFFER2
	MOVWF	KEY_BUFFER1

	MOVFW	KEY_BUFFER3
	MOVWF	KEY_BUFFER2

	MOVFW	KEY_BUFFER4
	MOVWF	KEY_BUFFER3

	MOVFW	KEY_BUFFER5
	MOVWF	KEY_BUFFER4

	MOVFW	KEYB_DATA
	MOVWF	KEY_BUFFER5

RETURN
;****************************************************************************
;****************************************************************************
SIFRE_KARSILASTIR:
S_K1:
	MOVFW	KEY_BUFFER1
	MOVWF	M_TEMP0
	MOVF	M_TEMP0,W	;karsilatirilacak degisken onceden MTEMP'e yuklenmistir
	XORLW	SIFRE1		;W ile karsilastirilacak tamsayi xor'lanir
	BTFSS	STATUS,Z	;IF W=M_TEMP 
	GOTO	S_K_YANLIS	;M_TEMP != 3 else SATIR_1 den sonraki islemler
S_K2:
	MOVFW	KEY_BUFFER2
	MOVWF	M_TEMP0
	MOVF	M_TEMP0,W
	XORLW	SIFRE2
	BTFSS	STATUS,Z
	GOTO	S_K_YANLIS
S_K3:
	MOVFW	KEY_BUFFER3
	MOVWF	M_TEMP0
	MOVF	M_TEMP0,W
	XORLW	SIFRE3
	BTFSS	STATUS,Z
	GOTO	S_K_YANLIS
S_K4:
	MOVFW	KEY_BUFFER4
	MOVWF	M_TEMP0
	MOVF	M_TEMP0,W
	XORLW	SIFRE4
	BTFSS	STATUS,Z
	GOTO	S_K_YANLIS
S_K5:
	MOVFW	KEY_BUFFER5
	MOVWF	M_TEMP0
	MOVF	M_TEMP0,W
	XORLW	D'11'
	BTFSS	STATUS,Z
	GOTO	S_K_YANLIS

S_K_DOGRU:
	BSF	SYSCON,KILIT_DURUM
	GOTO	S_K_SON
S_K_YANLIS:
	BCF	SYSCON,KILIT_DURUM

S_K_SON:	
RETURN
;****************************************************************************
;PIC0007 SIFRELI KILIT ICIN PORT AYARLARI
;****************************************************************************
PORTLARI_AYARLA:
	CLRF	PORTB			; RESET portb
	CLRF	PORTA			; RESET portA

	BSF	STATUS, RP0		; BANK 1 GECILIR
	MOVLW	B'11110001'		; RB0-7=CIKIS
	MOVWF	TRISB
	MOVLW	B'00010000'		; RA0-5=GIRIS
	MOVWF	TRISA
        bcf     OPTION_REG,NOT_RBPU	;PORTB pull-up
	BCF	STATUS, RP0		; BANK 0 GECILIR
	RETURN
;****************************************************************************
;	4MHz CLOCK ICIN BEKLETME RUTINLERI
;	BU RUTIN CALL ILE FLIP_FLOP DONGUSUNDEN CAGIRILIR
;****************************************************************************
BEKLET_100MS:
	DLY_100MS		;YAKLASIK 100 MILI SANIYE
		CLRWDT
	        movlw   D'200'
        	movwf   msb
		GOTO	DLY1
	DLY_10MS		;YAKLASIK 10 MILI SANIYE
		CLRWDT
	        movlw   D'20'
        	movwf   msb
		GOTO	DLY1

	DLY_1MS			;YAKLASIK 1 MILI SANIYE
		CLRWDT
	        movlw   D'2'
        	movwf   msb
		GOTO	DLY1
	DLY1
		movlw   D'168'
	        movwf   lsb
	DLY2			;YAKLASIK 3 MICRO SANIYE
		decfsz  lsb,F	;1 INS
	        goto    DLY2	;2 INS
	        decfsz  msb,F	;1 INS
        	goto    DLY1	;2 INS
	RETURN


org	h'03ff'
end


