Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Reloj de 12 Horas
Reloj de 12 Horas
***************************************
**********************
; RELOJ DE 12 HORAS
;
***************************************
**********************
LIST P=PIC16F84A
; Pic
a usar
#INCLUDE <P16F84A.INC>
;
***************************************
***********************
; Lista de constantes y variables para
el uso del programa
;
***************************************
***********************
;
; Valores de constantes
***************************************
FRAC_INI
equ
D'12'
equ
D'196'
equ
D'196'
equ
D'244'
HORS_12H
equ
D'243'
equ
D'9'
equ
D'34'
equ
D'3'
equ
B'00001110'
; RB1,
CHG
equ
H'03'
equ
H'04'
equ
H'05'
equ
H'06'
equ
H'07'
; Un
B'11111111'
; Displays
apagados (PORTA)
gfedcbap
CERO
01111110
equ
H'7E'
UNO
equ
H'0C'
equ
H'B6'
equ
H'9E'
equ
H'CC'
equ
H'DA'
equ
H'FA'
equ
H'0E'
equ
H'FE'
equ
H'DE'
equ
H'00'
; Todos
00001100
DOS
10110110
TRES
10011110
CUATRO
11001100
CINCO
11011010
SEIS
11111010
SIETE
00001110
OCHO
11111110
NUEVE
11011110
SEGM_OFF
; y
minutos apagado (RB0).; Posicin de
memoria de variables
************************************fra
c_sec
equ
H'0C'
equ
H'0D'
equ
H'0E'
horas
equ
H'0F'
; Horas
conta1
equ
H'10'
Segundos
minutos
Minutos
equ
H'11'
equ
H'12'
digito2
equ
H'13'
equ
H'14'
equ
H'15'
equ
H'16'
;Vector de Reset
org
INICIO
0x05
;Salva el vector
de interrupcin
;
***************************************
***********************
; SUBRUTINAS
;
***************************************
***********************
CODIGO_7S
; Devuelve el
cdigo 7 segmentos
addwf
PCL,F
retlw
CERO
retlw
UNO
retlw
DOS
retlw
TRES
retlw
CUATRO
retlw
CINCO
retlw
SEIS
retlw
SIETE
retlw
OCHO
retlw
NUEVE
;
***************************************
***********************
; Comienzo del programa
;
***************************************
***********************
;
INICIO
;
blanquear display
bsf
STATUS,RP0
; Activa
el banco de memoria 1.
movlw
B'10000011'
OPTION_REG
; TMR0
B'00000000'
movwf
TRISA
; Pone
movwf
TRISB
; Pone
STATUS,RP0
; Activa
el banco de memoria 0.
;
; Establecer estados iniciales de las
salidas
movlw
DSPOFF
movwf
PORTA
; Apaga
B'00000001'
; Todos
los displays
movlw
PORTB
; entre
H'01'
movwf
TMR0
01h en TMR0
movlw
B'11111110'
; Pone
movwf
display
CERO
movwf
digito1
digito2
DOS
movwf
digito3
UNO
movwf
digito4
B'00000000'
movwf
banderas
FRAC_INI
movwf
frac_sec
movlw
SEGS_INI
movwf
segundos
movlw
MINS_INI
movwf
minutos
movlw
D'255'
movwf
horas
; 12
; 196
; 196
; Las
TMR0_LLENO
1.000.000 Hz / 16 = 62.500 Hz
4,096 ms
movf
btfss
TMR0,W
STATUS,Z
; TMR0
TMR0_LLENO
frac_sec,F
; Se
aade 1 a frac_sec
goto
COMPROBAR_CHG
; Se
;
algn pulsador o es necesario
actualizar los valores
; de
la hora que tienen que mostrarse en los
displays
; Se ha desbordado frac_sec y se han
contado 244 "frac_sec", 1 segundo.
; Tarda en desbordarse 4.096 ciclos de
reloj, 4,096 ms * 244 = 999,424 ms
; Al no consegirse exactamente 1
segundo sino 0,999424 s, luego se
necesitan ajustes
bsf
PORTB,0
FRAC_INI
movwf
frac_sec
COMPROBAR_PUL
banderas,P_ON
INC_HORA
banderas,PSEG
INC_HORA
SEGS_INI
; 196d
movwf
segundos
; Inicia
PONER_MINUTOS
btfss
banderas,PMIN
PONER_HORAS
H'AF'
frac_sec
175d
movwf
minutos,F
PONER_HORAS
movlw
MINS_INI
movwf
minutos
btfss
banderas,PHOR
OBTENER_H_M
H'7F'
frac_sec
127d
movwf
horas,F
Incrementar la hora
goto
OBTENER_H_M
movlw
HORS_INI
movwf
horas
OBTENER_H_M
; Incrementar
; Ajustes cada
minuto, hora y 12 horas
bsf
banderas,CHG
; Se
segundos,F
; Como
COMPROBAR_CHG
movlw
SEGS_INI
; Se ha
segundos
; de
ADJMIN
; Se
frac_sec,F
; El
incfsz
minutos,F
; Se
aade 1 minuto
goto
COMPROBAR_CHG
movlw
MINS_INI
; Se ha
minutos
; de
ADJHOR
; Se
frac_sec,F
; La
horas,F
; Se
aade 1 hora
goto
COMPROBAR_CHG
movlw
HORS_INI
; Se ha
movwf
horas
; de
ADJDIA
; Se
frac_sec,F
; Cada
banderas,CHG
; Si
goto
DISPLAY_PUL
; se
Se
banderas,PSEG
goto
OBTENER_H_M
; No
H'00'
; Se
digito2
Variables "digito2" a 0
movwf
digito3
Variables "digito3" a 0
movwf
digito4
Variables "digito4" a 0
movlw
SEGS_INI
subwf
segundos,W
movwf
digito1
; Se
DIV_DIGITOS
OBTENER_H_M
movlw
HORS_12H
subwf
horas,W
movwf
digito3
; La
MINS_INI
subwf
minutos,W
movwf
digito1
; La
DIV_DIGITOS
; Divide los
H'00'
movwf
digito4
; Se
digito2
; para
H'02'
movwf
conta1
; Bucle
digito1
FSR
; La
goto
LOOP
LOOP2
digito3
movwf
FSR
LOOP
D'10'
INDF,F
; En
STATUS,C
; Se
goto
INC_DECENAS
; C
INDF,F
; C = 0,
PROX_NUM
INC_DECENAS
incf
FSR,F
; El
INDF,F
; Se
FSR,F
; Se
LOOP
; para la
; sumar uno a la
decena cada vez que esta se ha
incrementado
PROX_NUM
; Prximo
conta1,F
LOOP2
CONVER_COD_7S
digito1
movwf
FSR
; Coloca la
H'04'
movwf
conta1
PROX_DIGITO
movf
INDF,W
; Obtener
CODIGO_7S
; LLamar a
INDF
; Colocar
FSR,F
conta1,F
; Permitir
PROX_DIGITO
; Si hay un
movlw
CERO
subwf
digito4,W
btfss
STATUS,Z
goto
BORRAR_CERO_SEG
movlw
SEGM_OFF
movwf
digito4
;
BORRAR_CERO_SEG
btfss
banderas,PSEG
; Si
DISPLAY_PUL
SEGM_OFF
digito3
digito4
; Se borran los
; Escanea
pulsadores, si alguno est pulsado se
pone a 1
; el pulsador que
le correspoda as como "P_ON" y "CHG"
; Muestra los
dgitos correspondientes a los segundos
o a
; los minutos y
horas en el display que corresponda.
movlw
B'00000000'
movwf
banderas
; Se
DSPOFF
movwf
PORTA
movlw
SEGM_OFF
; Respeta
valor RB0
xorwf
PORTB, w
andlw
B'11111110'
PORTB, f
STATUS,RP0
; Activa
el banco 1.
movlw
PULSADOR
movwf
TRISB
; Se
STATUS,RP0
; Activa
el banco 0.
nop
; Las
nop
; En principio
; estados
; las
; algn
; Se comprueba
Pulsador PSEG
btfss
PORTB,1
goto
COMPROBAR_PMIN
bsf
banderas,CHG
bsf
banderas,PSEG
bsf
banderas,P_ON
COMPROBAR_PMIN
; Se comprueba
Pulsador PMIN
btfss
PORTB,2
goto
COMPROBAR_PHOR
bsf
banderas,CHG
bsf
banderas,PMIN
bsf
banderas,P_ON
COMPROBAR_PHOR
; Se comprueba
Pulsador PHOR
btfss
PORTB,3
goto
ACTIVAR_SEGM
bsf
banderas,CHG
bsf
banderas,PHOR
bsf
banderas,P_ON
ACTIVAR_SEGM
; Se coloca en PORTB el
STATUS,RP0
el banco 1.
movlw
H'00'
; Activa
movwf
TRISB
; Puerto
B como salida
bcf
STATUS,RP0
; Activa
el banco 0.
; Se determina que display debe
actualizarse, es decir, que dato debe
; presentarse en el puerto B y se
establece el siguiente display
btfss
display,0
; Si es
digito4,W
btfss
display,1
; Si es
digito3,W
btfss
display,2
; Si es
digito2,W
btfss
display,3
; Si es
digito1,W
PORTB, w
andlw
B'11111110'
PORTB, f
btfsc
frac_sec,7
PORTB,0
; del
movf
display,W
; Tomar
PORTA
; Cada
display,F
; Rota
display,0
; Asegura
display,4
display,0
; Si lo
; La
variable display va cambiando:
;
1111
1111
1111
1110
1101
1011
0111
1110
1101
1011
0111
1110
1101
1011
0111
1110
; Slo
valen los 4 bits menos significativos
goto
PRINCIPAL
; Volver a