; º º
; º _\\|//_ º
; º (` o-o ') º
; º------ooO-(_)-Ooo----------------------------------------------------º
; º º
; º www.todopic.com.ar º
; º .oooO Oooo. º
; º ( ) ( ) º
; º_____\ (_______) /___________________________________________________º
; º \_) (_/ º
;
;
TITLE "Contador doble 00-99"
SUBTITLE "Revision Nø 2"
LIST F = INHX8M, MM = ON, T = ON, ST = OFF
RADIX HEX
ERRORLEVEL 0, -302, -306
PROCESSOR 16F84A ;16F84A-20/P
#INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__IDLOCS H'0000'
;
; B'00111111' B'11111001'
; 3F F
; 3FF9
;
; Configuration Bits 16F84A
;
; SCRAMBLER CP PWRTE WDT OSC
;
; 00 = SI 0 = SI 0 = SI 0 = NO 00 = LP
; 3F = NO 1 = NO 1 = NO 1 = SI 01 = XT
; 10 = HS
; 11 = RC
;
;****************
;Cristal utilizado
;****************
;
; 04Mhz en modo XT con 1 useg por instrucción
;
;****************
;Descripcion del uso de cada pin.
;****************
;
; DIGITO_2A ( digito 2A ) RA2 pin 1
; DIGITO_1A ( digito 1A ) RA3 pin 2
; PULSADOR_R ( Pulsador R ) RA4/TOCK1 pin 3
; MCLR/VPP ( reset y voltage Vpp ) MCLR/VPP pin 4
; VSS ( negativo 0V ) VSS pin 5
; LED_F ( led del segmento F ) RB0/INT pin 6
; LED_E ( led del segmento E ) RB1 pin 7
; LED_D ( led del segmento D ) RB2 pin 8
; LED_C ( led del segmento C ) RB3 pin 9
; LED_B ( led del segmento B ) RB4 pin 10
; LED_A ( led del segmento A ) RB5 pin 11
; LED_G ( led del segmento G ) RB6 pin 12
; PULSADOR_I ( pulsador I ) RB7 pin 13
; VDD ( positivo 5V ) VDD pin 14
; OSC ( salida ) OSC2/CLKOUT pin 15
; OSC ( entrada ) OSC1/CLKIN pin 16
; DIGITO_1B ( digito 1B ) RA0 pin 17
; DIGITO_2B ( digito 2A ) RA1 pin 18
;
;****************
;Definicion de RAM del usuario.
;****************
;
CBLOCK H'0C'
Dig1A ;acumulador decenas para el contador A
Dig2A ;acumulador unidades para el contador A
Dig1B ;acumulador decenas para el contador B
Dig2B ;acumulador unidades para el contador B
Rota ;variable para desplazamiento de display
Loops1 ;variables usadas en retardos
Loops2
ENDC
;
#define PULSADOR_R PORTA,4
#define PULSADOR_I PORTB,7
;
Reset
ORG H'000' ; Vector de inicio, o sea, desde aqui
; comienza la ejecución del progrma
; cuando se alimenta al pic...POR.."Power On Reset"
GOTO Inicio ; Salta hacia el inicio del progrma
ORG H'004' ; Vector de interrupción, o sea aqui salta
; el PCl cuando se produce una interupción
RETURN ; Retorna sin habilitar las interrupciones
;
;-------------------------------------------------------------------
;- Subrrutinas -
;-------------------------------------------------------------------
;
Retardo ;subrutina de retardo
movwf Loops1 ;la variable de trabajo contiene la cant.
Top2 movlw D'110' ;de ms a demorar
movwf Loops2
Top1 nop
nop
nop
nop
nop
nop
decfsz Loops2,F ;controla si termina 1mS
goto Top1
decfsz Loops1,F ;controla si termina el retardo completo
goto Top2
return
;
;-------------------------------------------------------------------
;
IncDecenas ;rutina de incremento x 10
clrf INDF ;pone a cero las unidades
incf FSR,F ;selecciona el registro de las decenas
incf INDF,F ;incrementa el contador de decenas
movf INDF,W ;carga en work el conteo de las decenas
xorlw H'0A' ;si work era 10, entonces quedara en cero
skpnz ;si es cero, el flag z queda alto
clrf INDF ;pasa de 99 a 00
return ;retorna
;
;-------------------------------------------------------------------
;
IncUnidades ;rutina de incremento
movwf FSR ;seleciona el registro de las unidades
incf INDF,F ;incrementa el contador de unidades
movf INDF,W ;carga en work el conteo de las unidades
xorlw H'0A' ;si work era 10, entonces quedara en cero
skpnz ;si es cero, el flag z queda alto
call IncDecenas ;incrementa las decenas
movlw D'250' ;retardo de 100ms
call Retardo
return
;
;-------------------------------------------------------------------
;
; entrada : W Valor bcd a convertir (H'00' a H'09').
; salida : W Valor 7 segmentos
;
;La codificacion de los siete segmentos es la siguiente.
;
; GABCDEF
;B'xxxxxxxx'
;
; A
; ----
; F | | B
; | G |
; ----
; E | | C
; | |
; ---- o
; D
Tabla ;genera los numeros sobre el display
andlw B'00001111' ;solo H'0F'
addwf PCL,F ;agrega al cont. programa el valor de work
retlw B'00111111' ;genera el 0
retlw B'00011000' ;genera el 1
retlw B'01110110' ;genera el 2
retlw B'01111100' ;genera el 3
retlw B'01011001' ;genera el 4
retlw B'01101101' ;genera el 5
retlw B'01101111' ;genera el 6
retlw B'00111000' ;genera el 7
retlw B'01111111' ;genera el 8
retlw B'01111101' ;genera el 9
;
;Los siguientes debuelven E de "error", esto es por si se pasa
;un valor a la tabla desde H'0A' hasta H'0F'.
;
retlw B'01100111' ;genera la E
retlw B'01100111' ;genera la E
retlw B'01100111' ;genera la E
retlw B'01100111' ;genera la E
retlw B'01100111' ;genera la E
retlw B'01100111' ;genera la E
;
;-------------------------------------------------------------------
;- Programa Principal -
;-------------------------------------------------------------------
;
Inicio ;programa principal
bsf STATUS,RP0 ;selecciona el banco de memoria alto
movlw B'00010000' ;configura RA0~RA3 como salidas
movwf TRISA ;y RA4 como entrada
movlw B'10000000' ;configura RB0~RB6 como salidas
movwf TRISB ;y RB7 como entrada
bcf STATUS,RP0 ;selecciona el banco de memoria bajo
clrf Dig1A ;inicializa acumuladores
clrf Dig2A
clrf Dig1B
clrf Dig2B
movlw H'00' ;envia ceros a los transistores para apagar
movwf PORTA ;todos los displays
;
Empe btfss PULSADOR_R ;¿ Esta presionado el pulsador R ?
goto Mostrar ;No
movlw Dig1A ;Carga el puntero para el primer contador
call IncUnidades ;llama la rutina de incremento para el contador A
;
btfss PULSADOR_I ;¿ Esta presionado el pulsador I ?
goto Mostrar ;No
movlw Dig1B ;para cargar el puntero
call IncUnidades ;llama la rutina de incremento para el contador B
Mostrar
movlw H'08' ;iniciar un 1 en el registro de rotacion
movwf Rota
movlw Dig1A ;con el registro selector (fsr) se apunta
movwf FSR ;al primer dato que se va a mostrar
Disp movlw H'00' ;colocar en cero el dato del display
movwf PORTB ;para apagarlos
movf Rota,W ;pasa rotacion del 1 a la variable work
movwf PORTA ;enciende el transistor (display)
movf INDF,W ;lee el dato del registro apuntado por fsr
call Tabla ;genera el digito de 7 segmentos
movwf PORTB ;envia el digito al puerto b
movlw H'03' ;retardo de 3ms para visualizacion
call Retardo
btfsc Rota,0 ;controla si terminaron las cuatro rotaciones
goto Empe ;si termino, vuelve desde el comienzo
bcf STATUS,C ;carry en cero para no afectar las rotaciones
rrf Rota,F ;desplaza el 1 que enciende los displays
incf FSR,F ;incrementa el puntero. Apunta el proximo
goto Disp ;digito a mostrar
END