Reloj formato 24h
Publicado por Alberto (1 intervención) el 13/07/2016 02:02:11
Buenas, saludos. Tengo un código en assembler basado en un pic 16f887 para un contador con 4 pantallas leds 7 segmentos. La cuestión es que quiero modificar el código para que en lugar de ser un contador hasta 9999, simule un reloj en formato 24h. Pero no logro hacer que el reloj se reinicie en 24:00. Se me reinicia en 20:00 u otras maneras, pero no lo que quiero. Alguien me ayuda?
Dejo el código por acá. Pongo en negritas lo que considero que es lo importante. Que se note que apenas estoy empezando con assembler y no sé demasiado
Dejo el código por acá. Pongo en negritas lo que considero que es lo importante. Que se note que apenas estoy empezando con assembler y no sé demasiado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
LIST P=16F887
#INCLUDE <P16F887.INC>
__CONFIG _CONFIG1, 20D4H
__CONFIG _CONFIG2, 3FFFH
DIG1 EQU 0X20
DIG2 EQU 0X21
DIG3 EQU 0X22
DIG4 EQU 0X23
AUX_W EQU 0X24
AUX_STATUS EQU 0X25
AUX1 EQU 0X26
CONTADOR EQU 0X27
ESTADO_LED EQU 0X28
CONTADOR_ISR EQU 0X29
RA EQU 0X2A
RB EQU 0X2B
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO SERVICIO
ORG 0X05
INICIO
BSF STATUS,RP0 ;NOS CAMBIAMOS AL BANCO 1
MOVLW B'00000000' ;CONFIGURAMOS EL PUERTO A COMO SALIDA
MOVWF TRISC
MOVLW B'00000000' ;CONFIGURAMOS EL PUERTO D COMO SALIDA
MOVWF TRISD
MOVLW B'00000000' ;CONFIGURAMOS EL TIMER COMO TEMPORIZADOR Y PREESCALER DE 256
MOVWF OPTION_REG
BSF STATUS,RP1 ;NOS CAMBIAMOS AL BANCO 3
CLRF ANSEL ;DESACTIVAMOS LOS CANALES ANALOGICOS
CLRF ANSELH
BCF STATUS,RP1
BCF STATUS, RP0
MOVLW B'00100000' ;HABILITAMOS LA INTERRUPCION POR TIMER0
MOVWF INTCON
MOVLW .61 ;PRECARGAMOS EL TIMER0 PARA QUE CUENTE LO MAS CERCANO A 50000 (ES DECIR 50MS)
MOVWF TMR0
CLRF PORTA
CLRF PORTD
COMF PORTD
CLRF CONTADOR ;INICIALIZAMOS LAS VARIABLES
CLRF ESTADO_LED
CLRF DIG1
CLRF DIG2
CLRF DIG3
CLRF DIG4
BSF INTCON,GIE ;HABILITAMOS EL GLOBAL DE INTERRUPCIONES
GOTO PRINCIPAL
TABLA
ADDWF PCL,F
RETLW B'01000000';0
RETLW B'01111001';1
RETLW B'00100100';2
RETLW B'00110000';3
RETLW B'00011001';4
RETLW B'00010010';5
RETLW B'00000010';6
RETLW B'01111000';7
RETLW B'00000000';8
RETLW B'00011000';9
SERVICIO
INICIO_ISR
BCF INTCON,GIE ;DESHABILITAMOS EL HABILITADOR GLOBAL
MOVWF AUX_W ;RESPALDAMOS W
SWAPF STATUS,0 ;RESPALDAMOS STATUS
MOVWF AUX_STATUS
ISR
INCF CONTADOR_ISR,F
MOVLW .20
XORWF CONTADOR_ISR,W
BTFSS STATUS,Z
GOTO SALIR_ISR
CLRF CONTADOR_ISR
INCF DIG1,F
MOVLW .10
XORWF DIG1,W
BTFSS STATUS,Z
GOTO SALIR_ISR
CLRF DIG1
INCF DIG2,F
MOVLW .6
XORWF DIG2,W
BTFSS STATUS,Z
GOTO SALIR_ISR
CLRF DIG2
INCF DIG3,F
CALL MAXIMO
MOVLW .10
XORWF DIG3,W
BTFSS STATUS,Z
GOTO SALIR_ISR
CLRF DIG3
INCF DIG4,F
MOVLW .2
XORWF DIG4,W
BTFSS STATUS,Z
GOTO SALIR_ISR
CLRF DIG4
COMPARAR
MOVLW .4
XORWF DIG3,W
BTFSS STATUS,Z
CLRF DIG4
RETURN
MAXIMO
MOVLW .2
SUBWF DIG4,W
BTFSS STATUS,C
CALL COMPARAR
RETURN
SALIR_ISR
BCF INTCON,T0IF ;LIMPIAMOS LA BANDERA DE INTERRUPCION DE TMR0
MOVLW .61 ;PRECARGAMOS DE NUEVO EL TIMER
MOVWF TMR0
BSF INTCON,GIE ;HABILITAMOS DE NUEVO EL GLOBAL
SWAPF AUX_STATUS,0 ;DEVOLVEMOS EL RESPALDO DE STATUS
MOVWF STATUS
SWAPF AUX_W,F ;DEVOLVEMOS EL RESPALDO DE W
SWAPF AUX_W,W
RETFIE
PRINCIPAL
CALL MULTIPLEXACION ;ESTA RUTINA TARDA 20MS
INCF CONTADOR,F ;EL CONTADOR ES PARA HACER UN RETARDO PARA EL LED
MOVLW .50
XORWF CONTADOR,W
BTFSS STATUS,Z
GOTO PRINCIPAL
BTFSC ESTADO_LED,0
GOTO APAGAR
GOTO ENCENDER
APAGAR
BCF PORTB,7
BCF ESTADO_LED,0
GOTO PRINCIPAL
ENCENDER
BSF PORTB,7
BSF ESTADO_LED,0
GOTO PRINCIPAL
MULTIPLEXACION
CLRF PORTA ;desactivamos todos los display
MOVLW b'01111111' ;apagamos todos los segmentos
IORWF PORTD,1
BSF PORTC,3 ;activamos el PRIMER DISPLAY
MOVF DIG1,0
CALL TABLA ;convertimos el dato a mostrar en 7seg
ANDWF PORTD,1
CALL RETARDO ;hacemos una pausa de unos 5ms
BCF PORTC,3 ;desactivamos el PRIMER display
MOVLW b'01111111' ;SE REPITE LO MISMO PARA EL RESTO DE LOS DISPLAY
IORWF PORTD,1
BSF PORTC,2 ;activamos el SEGUNDO DISPLAY
MOVF DIG2,0
CALL TABLA
ANDWF PORTD,1
CALL RETARDO
BCF PORTC,2 ;DESACTIVAMOS el SEGUNDO DISPLAY
MOVLW b'01111111'
IORWF PORTD,1
BSF PORTC,1 ;activamos el TERCERO DISPLAY
MOVF DIG3,0
CALL TABLA
ANDWF PORTD,1
CALL RETARDO
BCF PORTC,1 ;DESactivamos el TERCERO DISPLAY
MOVLW b'01111111'
IORWF PORTD,1
BSF PORTC,0 ;activamos el CUARTO DISPLAY
MOVF DIG4,0
CALL TABLA
ANDWF PORTD,1
CALL RETARDO
BCF PORTC,0 ;DESactivamos el CUARTO DISPLAY
RETURN
RETARDO
MOVLW .8
MOVWF RA
LOOP
MOVLW .249
MOVWF RB
DECFSZ RB,1
GOTO $-1
DECFSZ RA,1
GOTO LOOP
RETURN
END
Valora esta pregunta
0