 LIST  P=16F887 ;PROCESSZOR DEFINICIO 
 #INCLUDE <C:\Program Files (x86)\Microchip\MPASM Suite\P16F887.INC> ;A SZUKSEGES INCLUDE FAJL 
      ERRORLEVEL 0,-302        ; elnyomja a bank-váltás üzeneteit
    __CONFIG _CONFIG1, (_LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _MCLRE_OFF & _WDT_OFF & _HS_OSC) ; 0x20D2 HEX formában
	__CONFIG _CONFIG2, (_WRT_OFF)

;	INCLUDE	HEADER.INC

	CBLOCK	0X20
		GOMB
		KEY
		T1
		T2
		T3
		T4
		BI_KOD
		BI_KOD_A
		BI_KOD_F
		BI_TEMP
		BI_MINUSZ
		BO_TEMP
		BO_C
		BO_D
		
	ENDC
	
#DEFINE	SOR1		PORTB,0	
#DEFINE SOR2		PORTB,1
#DEFINE	SOR3		PORTB,2
#DEFINE	SOR4		PORTB,3
#DEFINE	OSZLOP1		PORTB,4
#DEFINE	OSZLOP2		PORTB,5
#DEFINE	OSZLOP3		PORTB,6
#DEFINE	OSZLOP4		PORTB,7

	ORG	0X00
	
	
INI_MAIN
	MOVLW	B'11111111'	
	MOVWF	PORTB
	BSF		STATUS,RP0			; Az ANSEL és ANSELH a 3. bankban van
	MOVLW	B'00001111'
	MOVWF	WPUB				; A felhúzó ellenállások bekapcsolva a sorok bitjeihez.
	BSF		STATUS,RP1
	CLRF	ANSEL				; Minden port digitális
	CLRF	ANSELH	
	BCF		STATUS,RP1			; Vissza az 1. bankhoz
	CLRF	TRISA				; Kimenet A, C, és D portok
	CLRF	TRISC
	CLRF	TRISD
	MOVLW	B'11111111'	
	MOVWF	TRISB				; PORTB alsó bájt (sorok), felső bájt (oszlopok) mind bemenet
	BCF		STATUS,RP0			; Bank 0.
	
START
	CLRF	PORTC
	CLRF	PORTD
	CLRF	GOMB
	CLRF	KEY
	CLRF	PORTB
	CALL	SCAN
	MOVF	KEY,W
	SUBLW	0XFF
	BTFSC	STATUS,Z
	GOTO	START				; Ha nincs gomb lenyomva, újra kezdi
	CALL	KIJELEZ				; A táblázatból kiolvasott kód alapján bekapcsolom a LED-et
	CALL	BEMENETRE			; Visszaállítom a PORTB-t bemenetre
	GOTO	START				

; SZUBRUTINOK --------------------------------------------------------
KIJELEZ
	CALL	TABLAZAT			
	MOVWF	BI_KOD
	CALL	S_LEDCOD			
	CALL	KESLELTET_1			; Kis idő után a bekapcsolt LED elalszik.
	RETURN
	
SCAN		
	CLRF	GOMB
	BSF		STATUS,RP0			
	MOVLW	B'11101111'			; Az első oszlop kimenetre állítása
	MOVWF	TRISB
	BCF		STATUS,RP0
	BCF		OSZLOP1				; Az első oszlop alacsony szintre áll
	CALL	SORTESZT			; Végignézem, van-e lenyomott billentyű
	MOVF	KEY,W				; A PORTB állapota csak akkor kerül a KEY változóba, ha van lenyomott billentyű
	SUBLW	0XFF				
	BTFSS	STATUS,Z			
	RETURN						; Ha van lenyomva, akkor visszatér a kijelzéshez.
								; 2. oszlop
	BSF		STATUS,RP0			; Ha nincs lenyomott gomb, akkor folytatódik a következő oszloppal.
	MOVLW	B'11011111'
	MOVWF	TRISB
	BSF		WPUB,4
	BCF		STATUS,RP0
	CLRF	PORTB
	BCF		OSZLOP2
	CALL	SORTESZT
	MOVF	KEY,W
	SUBLW	0XFF
	BTFSS	STATUS,Z
	RETURN
								; 3. oszlop
	BSF		STATUS,RP0
	MOVLW	B'10111111'
	MOVWF	TRISB
	BSF		WPUB,5
	BCF		STATUS,RP0
	BCF		OSZLOP3
	CALL	SORTESZT
	MOVF	KEY,W
	SUBLW	0XFF
	BTFSS	STATUS,Z
	RETURN
								; 4. oszlop
	BSF		STATUS,RP0
	MOVLW	B'01111111'
	MOVWF	TRISB
	BSF		WPUB,6
	BCF		STATUS,RP0
	BCF		OSZLOP4
	CALL	SORTESZT
	RETURN

SORTESZT		
	BTFSS	SOR1
	GOTO	LENYOMVA
	INCF	GOMB,F
	BTFSS	SOR2
	GOTO	LENYOMVA
	INCF	GOMB,F
	BTFSS	SOR3
	GOTO	LENYOMVA
	INCF	GOMB,F
	BTFSS	SOR4
	GOTO	LENYOMVA
	INCF	GOMB,F
	MOVLW	0XFF				; Ha nincs lenyomva egyik sem, vissza a SCAN rutinba
	MOVWF	KEY
	RETURN
LENYOMVA		
	MOVF	PORTB,W
	MOVWF	KEY
	RETURN

BEMENETRE		
	BSF		STATUS,RP0
	MOVLW	0XFF
	MOVWF	TRISB
	BCF		STATUS,RP0
	RETURN
	
TABLAZAT ;GOMB változó adja meg a kiolvasandó érték sorszámát
	MOVF	GOMB,W
	ADDWF   PCL, F		; ADATTÁBLA A BITMINTÁNAK
	RETLW   D'64'		;1
	RETLW   D'48'		;4
	RETLW   D'32'		;7
	RETLW   D'16'		;*
    RETLW   D'65'		;2
    RETLW   D'49'		;5
    RETLW   D'33'		;8
    RETLW   D'17'		;0
    RETLW   D'66'		;3
    RETLW   D'50'		;6
    RETLW   D'34'		;9
    RETLW   D'18'		;#
    RETLW   D'67'		;A
    RETLW   D'51'		;B
    RETLW   D'35'		;C
    RETLW   D'19'		;D
	
	INCLUDE	LEDKOD.INC
	INCLUDE VÁRAKOZIK.INC		
	END
		