1 |
'**************************************************************** |
2 |
'* Name : Alarma1.BAS * |
3 |
'* Author : Celso Márquez Sánchez * |
4 |
'* Date : 12/10/2013 * |
5 |
'* Version : 1.0 * |
6 |
'**************************************************************** |
7 |
TRISB = %10010111 'PORTB.0,1,2 y 4,(7)sensor push buttons// 5 y 6 como salidas |
8 |
TRISA=%01100000 'PORTA.5 y 6 como entradas |
9 |
|
10 |
CMCON = 7 |
11 |
melodia var byte |
12 |
num var byte |
13 |
parpadeo var bit |
14 |
d con 2 'Se definen constantes y no variables, ya que LOOKUP solo acepta |
15 |
r CON 15 'valores constantes. Opcionalmente, puedes escribir el equivalente |
16 |
m CON 27 'numerico directamente o declarar SYMBOLS. |
17 |
f CON 36 'Entiendase: d=do, r=re, m=mi, f=fa, s=sol, l=la, y=si, b=blanco(no suena) |
18 |
s CON 48 |
19 |
l CON 59 |
20 |
y CON 70 |
21 |
b CON 0 |
22 |
|
23 |
i var byte |
24 |
j var byte |
25 |
aux var byte |
26 |
cuenta var byte |
27 |
POS1 var Byte |
28 |
POS2 var Byte |
29 |
POS3 var Byte |
30 |
POS4 var Byte |
31 |
segundo var byte |
32 |
minutos var byte |
33 |
segundo2 var byte |
34 |
min2 var byte |
35 |
contador var byte |
36 |
listo var byte |
37 |
tipoAlarma var byte |
38 |
presente var byte |
39 |
alto var bit |
40 |
detener var byte |
41 |
|
42 |
|
43 |
' Inicializamos las Variables correspondientes a la posición de la figura |
44 |
' en la pantalla LCD |
45 |
POS1 = $C0 ' |
46 |
POS2 = $C1 ' |
47 |
POS3 = $C2 ' |
48 |
POS4 = $C3 ' |
49 |
|
50 |
|
51 |
Pause 500 ' Inicialización de LCD, 0.5 segundos. |
52 |
|
53 |
' Cargamos las 8 figuras en la CGRAM: |
54 |
LCDOUT $FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10 ' Palabra 0 de la CGRAM |
55 |
LCDOUT $FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05 ' Palabra 1 de la CGRAM |
56 |
LCDOUT $FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06 ' Palabra 2 de la CGRAM |
57 |
LCDOUT $FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18 ' Palabra 3 de la CGRAM |
58 |
LCDOUT $FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03 ' Palabra 4 de la CGRAM |
59 |
LCDOUT $FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C ' Palabra 5 de la CGRAM |
60 |
LCDOUT $FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14 ' Palabra 6 de la CGRAM |
61 |
LCDOUT $FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01 ' Palabra 7 de la CGRAM |
62 |
|
63 |
'****************************************************** |
64 |
lcdouT $fe, 1 ' Limpia pantalla LCD |
65 |
FOR i=0 to 15 |
66 |
lookup i,["Inicializando..."],aux |
67 |
LCDOUT aux |
68 |
pause 200 |
69 |
next i |
70 |
|
71 |
'******************************************************* |
72 |
LcdouT $fe, 1 ' Limpia pantalla LCD |
73 |
pause 250 |
74 |
Lcdout " CIDETEC - IPN " ' Despliega mensaje |
75 |
pause 400 |
76 |
|
77 |
inicio: |
78 |
LCDOUT $fe, 1 ' Limpia la pantalla LCD |
79 |
Lcdout " CIDETEC - IPN " ' Despliega mensaje |
80 |
LCDOUT $FE,POS1, 0 ' Muestra Palabra 0 en la LCD |
81 |
LCDOUT $FE,POS2, 1 ' Muestra Palabra 1 en la LCD |
82 |
Pause 300 |
83 |
LCDOUT $fe, 1 ' Limpia la pantalla LCD |
84 |
Lcdout " CIDETEC - IPN " ' Despliega mensaje |
85 |
LCDOUT $FE,POS3, 2 ' Muestra Palabra 2 en la LCD |
86 |
LCDOUT $FE,POS4, 3 ' Muestra Palabra 3 en la LCD |
87 |
Pause 300 |
88 |
' Aumentamos la posición de cada símbolo en la pantalla para dar el efecto |
89 |
' de movimiento: |
90 |
POS1 = POS1 + 3 |
91 |
POS2 = POS2 + 3 |
92 |
POS3 = POS3 + 3 |
93 |
POS4 = POS4 + 3 |
94 |
If POS4 > $CF Then RETRO ' Pregunta si llega al tope derecho de la LCD |
95 |
' si POS4 = $CF salta a la etiqueta "RETRO" |
96 |
GoTo inicio ' Salta a la etiqueta "inicio" |
97 |
' Antes de retroceder nos aseguramos de que las figuras E,F,G y H tengan una |
98 |
' posición inicial en la pantalla LCD: |
99 |
RETRO: |
100 |
POS1 = $CF |
101 |
POS2 = $CE |
102 |
POS3 = $CD |
103 |
POS4 = $CC |
104 |
|
105 |
ON INTERRUPT GOTO reiniciar |
106 |
INTCON = %10010000 |
107 |
|
108 |
repite: |
109 |
alto=0 |
110 |
LcdouT $fe, 1 |
111 |
Lcdout "Estado del Alarma" |
112 |
Lcdout $fe, $C0 |
113 |
LCDOUT "---En Espera---" |
114 |
segundo=0 |
115 |
contador=0 |
116 |
minutos=0 |
117 |
tipoalarma=0 |
118 |
'**************************************************** |
119 |
' ALARMAS * |
120 |
'**************************************************** |
121 |
alarma: |
122 |
|
123 |
PORTB.5=0'apaga leds |
124 |
if PORTA.6 = 1 then |
125 |
LcdouT $fe, 1 |
126 |
Lcdout "Alarma Incendio" |
127 |
Lcdout $fe, $C0 |
128 |
LCDOUT "Time:00:--" |
129 |
tipoalarma=1 |
130 |
GOTO song_one |
131 |
endif |
132 |
if PORTB.1 = 1 then |
133 |
LcdouT $fe, 1 |
134 |
Lcdout "Alarma Sísmica" |
135 |
Lcdout $fe, $C0 |
136 |
LCDOUT "Time:00:00" |
137 |
tipoalarma=2 |
138 |
GOTO song_two |
139 |
endif |
140 |
if PORTB.2 = 1 then |
141 |
LcdouT $fe, 1 |
142 |
Lcdout "Alarma Bomba" |
143 |
Lcdout $fe, $C0 |
144 |
LCDOUT "Time:00:00" |
145 |
tipoalarma=3 |
146 |
GOTO song_tres |
147 |
endif |
148 |
|
149 |
|
150 |
goto alarma |
151 |
'**************************************************** |
152 |
' ALARMA 1 * |
153 |
'**************************************************** |
154 |
song_one: |
155 |
PORTB.5=1 |
156 |
if (min2*60+segundo2)=90 then |
157 |
goto valorfinal |
158 |
final1: |
159 |
endif |
160 |
|
161 |
sound PORTB.6, [2, 12] |
162 |
sound PORTB.6, [6, 12] |
163 |
sound PORTB.6, [3, 12] |
164 |
sound PORTB.6, [9, 6] |
165 |
if PORTB.4 = 1 THEN |
166 |
pause 5000 |
167 |
goto repite |
168 |
endif |
169 |
|
170 |
if alto=0 then |
171 |
goto segundero |
172 |
endif |
173 |
segundero1: |
174 |
parpadeo=parpadeo+1 |
175 |
GOTO song_one |
176 |
|
177 |
'**************************************************** |
178 |
' ALARMA 2 * |
179 |
'**************************************************** |
180 |
song_two: |
181 |
if parpadeo=1 then |
182 |
PORTB.5=1 |
183 |
else |
184 |
PORTB.5=0 |
185 |
endif |
186 |
|
187 |
if (min2*60+segundo2)=90 then |
188 |
goto valorfinal |
189 |
final2: |
190 |
endif |
191 |
|
192 |
sound PORTB.6, [150, 2] |
193 |
sound PORTB.6, [2, 2] |
194 |
sound PORTB.6, [70, 12] |
195 |
sound PORTB.6, [100, 27] |
196 |
if PORTB.4 = 1 THEN |
197 |
pause 5000 |
198 |
goto repite |
199 |
endif |
200 |
|
201 |
if alto=0 then |
202 |
goto segundero |
203 |
endif |
204 |
segundero2: |
205 |
parpadeo=parpadeo+1 |
206 |
GOTO song_two |
207 |
|
208 |
'**************************************************** |
209 |
' ALARMA 3 * |
210 |
'**************************************************** |
211 |
song_tres: |
212 |
if parpadeo=1 then |
213 |
PORTB.5=1 |
214 |
else |
215 |
PORTB.5=0 |
216 |
endif |
217 |
|
218 |
if (min2*60+segundo2)=90 then |
219 |
goto valorfinal |
220 |
final3: |
221 |
endif |
222 |
|
223 |
sound PORTB.6, [10, 4] |
224 |
sound PORTB.6, [5, 4] |
225 |
sound PORTB.6, [30, 8] |
226 |
sound PORTB.6, [100, 8] |
227 |
sound PORTB.6, [50, 2] |
228 |
sound PORTB.6, [150, 17] |
229 |
if PORTB.4 = 1 THEN |
230 |
pause 5000 |
231 |
goto repite |
232 |
endif |
233 |
|
234 |
if alto=0 then |
235 |
goto segundero |
236 |
endif |
237 |
segundero3: |
238 |
parpadeo=parpadeo+1 |
239 |
GOTO song_tres |
240 |
|
241 |
'**************************************************** |
242 |
segundero: |
243 |
contador=contador+2 |
244 |
contador=contador-1 |
245 |
if contador=2 then |
246 |
segundo=segundo+1 |
247 |
segundo2=segundo2+1 |
248 |
contador=0 |
249 |
if segundo=60 then |
250 |
segundo=0 |
251 |
minutos=minutos+1 |
252 |
if minutos=60 then |
253 |
minutos=0 |
254 |
endif |
255 |
endif |
256 |
|
257 |
if segundo2=60 then |
258 |
segundo2=0 |
259 |
min2=min2+1 |
260 |
if min2=60 then |
261 |
min2=0 |
262 |
endif |
263 |
endif |
264 |
|
265 |
endif |
266 |
'**************************************************** |
267 |
' IMPRIMIR CRONOMETRO * |
268 |
'**************************************************** |
269 |
|
270 |
if minutos<10 then |
271 |
Lcdout $fe, $C6 ' Manda los minutos a la pantalla |
272 |
Lcdout #minutos ' Envía ASCII |
273 |
else |
274 |
Lcdout $fe, $C5 ' Manda los minutos a la pantalla |
275 |
Lcdout #minutos ' Envía ASCII |
276 |
endif |
277 |
if segundo<10 then |
278 |
Lcdout $fe, $C8 |
279 |
Lcdout "0" |
280 |
Lcdout $fe, $C9 |
281 |
Lcdout #segundo |
282 |
else |
283 |
Lcdout $fe, $C8 |
284 |
Lcdout #segundo |
285 |
endif |
286 |
|
287 |
'**************************************************** |
288 |
|
289 |
if tipoAlarma=1 then segundero1 |
290 |
if tipoAlarma=2 then segundero2 |
291 |
if tipoAlarma=3 then segundero3 |
292 |
goto repite |
293 |
|
294 |
'**************************************************** |
295 |
|
296 |
valorfinal: |
297 |
detener=minutos*60+segundo |
298 |
detener=detener-90 |
299 |
minutos=detener/60 |
300 |
segundo=detener//60 |
301 |
|
302 |
segundo2=0 |
303 |
min2=0 |
304 |
alto=1 |
305 |
if minutos<10 then |
306 |
Lcdout $fe, $C6 |
307 |
Lcdout #minutos |
308 |
else |
309 |
Lcdout $fe, $C5 |
310 |
Lcdout #minutos |
311 |
endif |
312 |
if segundo<10 then |
313 |
Lcdout $fe, $C8 |
314 |
Lcdout "0" |
315 |
Lcdout $fe, $C9 |
316 |
Lcdout #segundo |
317 |
else |
318 |
Lcdout $fe, $C8 |
319 |
Lcdout #segundo |
320 |
endif |
321 |
if tipoAlarma=1 then final1 |
322 |
if tipoAlarma=2 then final2 |
323 |
if tipoAlarma=3 then final3 |
324 |
|
325 |
'**************************************************** |
326 |
' INTERRUPCIÓN HARDAWARE * |
327 |
'**************************************************** |
328 |
disable |
329 |
reiniciar: |
330 |
min2=0 |
331 |
segundo2=0 |
332 |
INTCON = %10010000 |
333 |
RESUME ;retorna a programa principal donde ocurrió la inte. |
334 |
ENABLE ;Habilita las interrupciones después del handle |
335 |
|
336 |
end |