; PortA 0 1 2 3 ezek bemenetek, itt van  mátrix
; PortB 4 5 6 a mátrix kimenetei
; PortC ezen egy 7 szegmenses kijelző csücsül.
; PortB,7 egy led, állapotjelző
; A feladat, hogy a 4x3-as billentyűzetről beolvasott értéket ki kell íratni a hétszegmenses kijelzőre.


#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

     cblock 0x20
Delay1              ; Változódekralálás
Delay2
mennyi
     endc
     
     org 0
Start:
boot:
; beállítjuk a be és kimeneteket
    bsf       STATUS,RP0          ;  Register Page 1
	movlw b'11111111'
    clrf      TRISC			; C port kimenet
	movwf  	TRISA			; A port bemenet
	clrf TRISB				; B port kimenet
    bcf       STATUS,RP0          ;  Register Page 0
tesztelés: 
	bsf PORTB,7 ;power led on
	clrf PORTC ;A hétszegmenses kapcsolódását ellenőrizzük
	call Delay
	call Delay
	movlw b'11111111'  ;kikapcsoljuk
	movwf PORTC
	clrw
	clrf mennyi
beolvasas:
	call smalldelay ;nem tudom kell-e, "zavarszűrés"
	bsf PORTB,4
		btfsc PORTA,0
		movlw .1
		btfsc PORTA,1
		movlw .2
		btfsc PORTA,2
		movlw .3
		btfsc PORTA,3
		movlw .4
	bcf PORTB,4
	call smalldelay
	bsf PORTB,5
		btfsc PORTA,0
		movlw .5
		btfsc PORTA,1
		movlw .6
		btfsc PORTA,2
		movlw .7
		btfsc PORTA,3
		movlw .8
		btfsc PORTA,0
	bcf PORTB,5
	call smalldelay
	bsf PORTB,6
		btfsc PORTA,0
		movlw .9
		btfsc PORTA,1
		movlw .10
		btfsc PORTA,2
		movlw .11
		btfsc PORTA,3
		movlw .12
		btfsc PORTA,0
	bcf PORTB,6
	call smalldelay

kiirat:
addwf PCL,F
bsf PORTC,1 ;ide elvileg nem juthat a pic.
goto egy	;A kimeneten mindenféleképpen ez jelenik meg, bármit csinálok.
goto ketto
goto harom
goto negy
goto ot
goto hat
goto het
goto nyolc
goto kilenc
goto nulla
goto aa
goto bb
nop
nop
nop
nop


egy:
	movlw b'10111110
	movwf PORTC
	goto beolvasas
ketto:
	movlw b'11000100
	movwf PORTC
	goto beolvasas
harom:
	movlw b'10100100
	movwf PORTC
	goto beolvasas
negy:
	movlw b'10110010
	movwf PORTC
	goto beolvasas
ot:
	movlw b'10100001
	movwf PORTC
	goto beolvasas
hat:
	movlw b'10000001
	movwf PORTC
	goto beolvasas
het:
	movlw b'10111100
	movwf PORTC
	goto beolvasas
nyolc:
	movlw b'10000000
	movwf PORTC
	goto beolvasas
kilenc:
	movlw b'10100000
	movwf PORTC
	goto beolvasas
nulla:
	movlw b'10001000
	movwf PORTC
	goto beolvasas
aa:
	movlw b'10010000
	movwf PORTC
	goto beolvasas
bb:
	movlw b'10000011
	movwf PORTC
	goto beolvasas
cc:
	movlw b'11001001
	movwf PORTC
	goto beolvasas
dd:
	movlw b'10000110
	movwf PORTC
	goto beolvasas
ee:
	movlw b'11000001
	movwf PORTC
	goto beolvasas
ff:
	movlw b'11010001
	movwf PORTC
	goto beolvasas

vege: ;végtelen ciklus, power led villogtatva. ide nem juthat el a pic.
call Delay
comf PORTB,7
goto vege

;----------------------------------------------------------------------
smalldelay:
	movlw d'256
	movwf Delay1
dell
	decfsz    Delay1,f
    goto      dell    
return


Delay:     

     movlw d'256
	movwf Delay1
	movwf Delay2
DelayLoop:
	nop
	nop
	nop
     decfsz    Delay1,f       ; Waste time.  
     goto      DelayLoop      ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
     decfsz    Delay2,f       ; The outer loop takes and additional 3 instructions per lap * 256 loops
     goto      DelayLoop      ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
                              ; call it a two-tenths of a second.
     return
end
