Ensamblador - Reloj formato 24h

 
Vista:

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

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder