org 0x00
goto principal
org 0x04
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS,W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,R
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using pages 1, 2 and/or 3
MOVWF PCLATH_TEMP ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
goto interrupcion
;
delay50ms
movwf temp
movlw .60
movwf tmr0
btfss intcon,2
goto $-1
bcf intcon,2
movfw temp
return
delaym
movwf temp
movlw .220
movwf tmr0
btfss intcon,2
goto $-1
bcf intcon,2
movfw temp
return
delay500ms
movwf temp
movlw .10
movwf d1
call delay50ms
decfsz d1
goto $-2
movfw temp
return
;
notecla
movwf temp
movfw contaf ;verificar si contaf es 4
xorlw .4 ;verificar si contaf es 4
btfsc status,2;verificar si contaf es 4
goto si4
incf contaf,1 ;si son diferentes
rlf filas,1
movfw filas
movfw temp
return
si4 movlw .1
movwf contaf
movwf filas
movfw filas
return
;
interrupcion
movfw portb ;estoy leyendo 'abcdxxxx'
movwf columnas
clrf porta ;limpio porta para que no se queden colgados valores
swapf columnas,1 ; ahora tengo 'xxxxabcd'
call delaym;
bsf flag,0
nop
movfw contaf ;carga w con el valor de contaf , conta
xorlw .1 ;comprueba si contaf vale 1
btfsc status,2 ;revisa : si Z=1 caso1, si Z=0 , volver a preguntar
goto casof1 ;;; aqui va si son iguales , caso1
movfw contaf ;aqui va si no es caso 1
xorlw .2
btfsc status,2
goto casof2 ;;aqui va si es caso2
movfw contaf
xorlw .3
btfsc status,2
goto casof3 ;caso3
casof4 movlw .12 ;de lo contrario pasa a casof4
movwf f
goto chkcol;return
casof3 movlw .8
movwf f
goto chkcol;return
casof2 movlw .4
movwf f
goto chkcol;return
casof1 movlw .0
movwf f
chkcol ;movfw columnas;carga w con el valor capturado de portb en columnas
btfss columnas,0
goto $+2
goto casoc1 ;aqui va caso1
btfss columnas,1
goto $+2
goto casoc2
btfss columnas,2
goto $+2
goto casoc3
btfss columnas,3
goto $+2
casoc4 movlw .3
movwf c
goto sumar;retfie
casoc3 movlw .2
movwf c
goto sumar;retfie
casoc2 movlw .1
movwf c
goto sumar;retfie
casoc1 movlw .0
movwf c
goto sumar;retfie
sumar movf c,0 ;cargamos w con el valor de c
addwf f,0 ;sumamos w con f y lo guardamos en w
movwf valor_real ;cargamos valor_real con el valor de la suma
;ya tengo mi valor real################################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;ya tengo mi valor real################################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
verificar movfw contaf ;verifica sin contaf=4 para reiniciarlo, casos contrarios <4 se incrementa su valor en 1
xorlw .1
btfss status,2 ;1 si son iguales, 0 si son diferentes
goto $+2
goto increment
movfw contaf
xorlw .2
btfss status,2 ;1 si son iguales, 0 si son diferentes
goto $+2
goto increment
movwf contaf
xorlw .3
btfss status,2
goto $+2
goto increment ; si esq si es el caso 3
re movlw .1 ;
movwf contaf ;reinicia conta=1
movwf filas ;filas=0001
movfw valor_real ;cargamos w con valor_real para pruebas
movwf portb
call delay500ms
;call delay500ms
;call delay500ms
;call delay500ms
movfw filas ;reinicia filas=0001
goto salir
increment incf contaf,1
rlf filas,1
movfw valor_real
movwf portb
call delay500ms
;call delay500ms
;call delay500ms
;call delay500ms
movfw filas ; 0002,3,4
salir MOVF PCLATH_TEMP, W ;Restore PCLATH
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP,F ;Swap W_TEMP
SWAPF W_TEMP,W ;Swap W_TEMP into W
bcf intcon,0
retfie
;
principal ;##############################################
;IOs
bsf status,5
movlw b'10000' ;porta como salidas
movwf trisa
movlw b'11110000'
movwf trisb
movlw b'11010111' ;rbpullup no, intedge=subida, t0cs=f/4 ,t0ie:bajada, psa->tmr0 ratio 1:256
movwf option_reg
bcf status,5;de vuelta al banco0
movlw b'10001000'
movwf intcon
clrf porta
clrf portb
movlw .1 ;cargar 1
movwf contaf ;se inicia con 1
movwf filas ;se inicia con 0001
clrf valor_real
clrf columnas
; goto inicio
inicio btfss flag,0
goto aqui
bcf flag,0
clrf porta
nop
aqui ;bsf intcon,7
movfw filas ;w se carga con el valor de filas *******
movwf porta
nop
call delaym
call notecla
nop
nop;aqui va lo que se hará si no se presiono una tecla
goto inicio
end