; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Display1 equ 0x0C ; Valor que luego de convertido se enviara al Display 1
Display2 equ 0x0D ; Valor que luego de convertido se enviara al Display 2
Display3 equ 0x0E ; Valor que luego de convertido se enviara al Display 3
DataEnviar equ 0x0F ; Dato convertido a codigo 7 Segmentos a enviar
ContBits equ 0x10 ; Para controlar el envio de bits
Desc equ 0 ; Definimos Pulsador descendente.-
Asc equ 1 ; Definimos Pulsador ascendente.-
BClock equ 0 ; Pin reloj del 74LS164
BData equ 1 ; Pin data del 74LS164
BReset equ 2 ; Pin Reset del 74LS164
Pto equ 0 ; Bit punto, Con este indicamos si se muestra punto.-
Resett org 0x00 ; Aquí comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Tabla de conversion BCD a 7 Segmentos ****
; Se coloca al inicio para asegurar ubicacion en Pagina.-
org 0x05 ; Origen del código de tabla.-
BCD7SEG: ; retlw b'abcdefg0' para display catodo comun
addwf PCL,1 ; Se incrementa el contador del programa.-
DT 0xFC , 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6
;**** Programa principal ****
;**** Configuracion de puertos ****
Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111000' ; RB7 como entrada y los demas como salida.-
movwf TRISB
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
clrf Display1
clrf Display2
clrf Display3
bsf PORTB,BReset ; Habilitamos 74LS164.-
bcf PORTB,BData
bsf PORTB,BClock ; Seteamos Clock.-
goto ActualizoDisplays
;**** Testeo de Pulsador ****
Testeo
btfss PORTA,Desc ; Testeamos si esta a 1 logico.-
goto Descender ; No
btfss PORTA,Asc ; Testeamos si esta a 1 logico.-
goto Ascender
goto Testeo ; Si, Testeamos nuevamente.-
;**** Rutinas ****
Descender
btfss PORTA,Desc ;
goto $-1 ; Esperamos hasta que se suelte.-
decf Display1,1 ; Decremento Display1.
movlw d'255' ; Si paso de 0 a 255...
subwf Display1,0 ; decremento Display2
btfss STATUS,Z ;
goto ActualizoDisplays ; no es 255
movlw d'9'
movwf Display1 ; Si, cargo 9.-
decf Display2,1 ; Decremento Display2.-
movlw d'255' ; Si paso de 0 a 255...
subwf Display2,0 ; decremento display3
btfss STATUS,Z ;
goto ActualizoDisplays ; No es 10.-
movlw d'9'
movwf Display2 ; Si, cargo 9.-
decf Display3,1 ; Decremento Display3.-
movlw d'255' ; Si paso de 0 a 255...
subwf Display3,0
btfss STATUS,Z
goto ActualizoDisplays ; No es 10.-
movlw d'9'
movwf Display3 ; Si, cargo 9.-
goto ActualizoDisplays
;.........................................................
Ascender
btfss PORTA,Asc ;
goto $-1 ; Esperamos hasta que se suelte.-
incf Display1,1 ; Incremeto Display1.
movlw d'10' ; Si es 10 reseteo e incremento Display2
subwf Display1,0 ;
btfss STATUS,Z ;
goto ActualizoDisplays ; no es 10
clrf Display1 ; Si, reseteo.-
incf Display2,1 ; Incremento Display2.-
movlw d'10' ; Si Decena = 10, reseteo e incremento Display3
subwf Display2,0 ;
btfss STATUS,Z ;
goto ActualizoDisplays ; No es 10.-
clrf Display2 ; Si, reseteo.-
incf Display3,1 ; Incremento Display3.-
movlw d'10' ; Si es 10 Reseteo.-
subwf Display3,0
btfss STATUS,Z
goto ActualizoDisplays ; No es 10.-
clrf Display3 ; Si, reseto
goto ActualizoDisplays
;...................................................
ActualizoDisplays
movfw Display1
call BCD7SEG ; Convertimos BCD a codigo 7 Segmentos.-
movwf DataEnviar ; Cargamos dato a enviar devuelto x BCD7SEG.-
call EnviaDato
movfw Display2
call BCD7SEG ; Convertimos BCD a codigo 7 Segmentos.-
movwf DataEnviar ; Cargamos dato a enviar devuelto x BCD7SEG.-
bsf DataEnviar,Pto ; A ejemplo cargamos punto a enviar.-
call EnviaDato
movfw Display3
call BCD7SEG ; Convertimos BCD a codigo 7 Segmentos.-
movwf DataEnviar ; Cargamos dato a enviar devuelto x BCD7SEG.-
call EnviaDato
goto Testeo
;**** Se envia Dato a los registros de desplazamiento ****
;-----------------------------------------------------------------------------------------
; 1º se envia el LSB, luego se va rotando a la derecha y se envian los bits de mayor peso.-
;-----------------------------------------------------------------------------------------
EnviaDato
movlw d'8' ; Número de bits a transmitir.
movwf ContBits
EnviaBit ; Comienza a enviar datos.
btfss DataEnviar,0 ; ¿Es un "1" el bit a transmitir?
bcf PORTB,BData ; No, pues envía un "0".
btfsc DataEnviar,0 ; ¿Es un "1" el bit a transmitir?
bsf PORTB,BData ; Si, Transmite un "1".
bcf PORTB,BClock ; Clock=0.-
nop
bsf PORTB,BClock ; Clock=1.-
rrf DataEnviar,1 ; Rota para envia siguiente bit.-
decfsz ContBits,1 ; Comprueba si es el último bit.
goto EnviaBit ; No es el último bit repite la operación.
return ; Retornamos.-
;.................................................................................
end