Instituto Polit�cnico Nacional
Instituto Politécnico Nacional
"La Técnica al Servicio de la Patria"
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