SlideShare a Scribd company logo
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
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

Page 1

;-----------------------------------------------------------------------------; Source code template for A51 assembler modules.
; Copyright (c) 2008 Marlon Hiraldo
;-----------------------------------------------------------------------------$NOMOD51
; disable predefined 8051 registers
$INCLUDE (REG52.INC)
; include register definition file
; (this is CPU dependant 8051, 8052, etc.)
NAME
skell
$EJECT

; eject page (change)

;-----------------------------------------------------------------------------; This is a good place to include any reference to external symbols.
; This is also a good place to add any expose states (publics).
;------------------------------------------------------------------------------

;-----------------------------------------------------------------------------; STACK segment
;-----------------------------------------------------------------------------?STACK
SEGMENT IDATA
; ?STACK in IDATA RAM (index only RAM).
RSEG
?STACK
; ?STACK segment.
DS 16
; 16 bytes for stack (16 is a lot!!)
$EJECT
; eject page
;-----------------------------------------------------------------------------; DATA SEGMENT
; Add your variable declaration in this segment.
; Use DS # to reserve memory space. Remove samples to save memory
;-----------------------------------------------------------------------------data_seg
SEGMENT DATA
; segment for DATA RAM.
RSEG
data_seg
; data segment
; *****your vars go
valor:
DS
duracion:
DS
nota:
DS

here*****
1
1
1

;-----------------------------------------------------------------------------; BIT SEGMENT
; Add your bit variables declaration in this segment.
; User DBIT # to reserve memory bit space. Remove the samples to save memory
;-----------------------------------------------------------------------------bit_seg
SEGMENT BIT
; segment for BIT RAM.
RSEG
bit_seg
; bit segment
;*****Your bits go here*******
;bit_var2:

DBIT

4

; 4 bits var (sample)

;-----------------------------------------------------------------------------; Add your constants (typeless) here.
;-----------------------------------------------------------------------------;********Your constants go here***********
number1 EQU 0DH
; number substitudes for 0dh (sample)
num1
EQU number1-8
; evaluated value for num1 (sample)
LCD_RS
BIT
P2.0
LCD_EN
BIT
P2.1
LCD_DATA
DATA
P2
Bocina

BIT

$EJECT

P1.0
; change page

;-----------------------------------------------------------------------------; Modify to reflect your code memory entry point
; This can also be used to relocate the ISR entry points
;-----------------------------------------------------------------------------CSEG
LJMP

AT 0000H
_$start

; set code segment to start at 0
; reset entry point (jump to start)
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
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

Page 2

CSEG
LJMP

AT 0003H
_ISR_EX0

;ISR INT externa 0

CSEG
LJMP

AT 0013H
_ISR_EX1

;ISR INT externa 1

CSEG
LJMP

AT 001BH
_ISR_T1

;ISR INT Timer 1

CSEG
AT 002BH
;ISR INT Timer 2
LJMP
_ISR_T2
;-----------------------------------------------------------------------------; CODE SEGMENT
; This is where your code goes
;-----------------------------------------------------------------------------code_seg
SEGMENT CODE
RSEG

code_seg

USING

0

_$start:

; code segment

; let the assembler know we are using register
; bank 0. This is needed for some statements.
MOV SP,#?STACK-1
; set stack to the right location

SETB IT0
SETB IT1

;habilitar interrupcion externa al micro

ORL TMOD,#00010000b

;Configurar timer 1 en modo 1

MOV TL1,#low(32202)
MOV TH1,#high(32202)

;Cuenta inicial del timer 1 para 0.05s

CLR TR1
CLR TR2

;Timer 1 OFF
;Timer 2 OFF

MOV T2CON,#00000000b
MOV TL2,#low(64778)
MOV TH2,#high(64778)

;Timer 2 en autorecarga
;Cuenta inicial del timer 2 para 0.05s

MOV IE,#10101101b

;Habilitar EX0,EX1,TF1 y global intr

ACALL _LCD_init
ACALL _LCD_cursoroff

;Inicializar LCD
;Apaga el cursor

MOV DPTR,#msj
ACALL _LCD_puts

;Carga e imprime msj (primera linea LCD)

MOV A,#49h
acall _LCD_gotoxy

;Posicionar el cursor para imprimir número de canción seleccionada

MOV R0,valor
acall _imprimir_dig

;Imprime en la LCD el número actual de la canción seleccionada

_$otro:

sjmp _$otro
;**************************************ISRs*******************************************************
;--ISR TIMER 1
_ISR_T2:
CPL Bocina
CLR TF2
RETI
;--ISR TIMER 1
_ISR_T1:

;Generar onda cuadrada 50%
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
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
219

Page 3

PUSH PSW
PUSH ACC
DJNZ duracion,_$exit_isr_t1 ;Verificar que han pasado 1.0 segs
mov duracion,#40d

MOV A,nota
MOVC A,@A+dptr
MOV RCAP2H,A

;Indice de la nota a tocar
;Obtener parte alta

INC nota
MOV A,nota
MOVC A,@A+dptr
MOV RCAP2L,A

;Indice de la nota a tocar
;Obtener parte baja

SETB TR2
INC nota
;mover a la siguiente nota
mov A,nota
;Reiniciar: comparar con 13*2 = 26
CJNE A,#26,_$exit_isr_t1
mov nota,#00h
_$exit_isr_t1:
MOV TL1,#low(32202) ;Cuenta inicial del timer 1 para 0.05s
MOV TH1,#high(32202)
CLR TF1
;INT Ack
POP ACC
POP PSW
RETI

;Restaurar contexto

;--ISR EXTERNAL 0
_ISR_EX0:
PUSH ACC
PUSH PSW

;Salvar el contexto

MOV A,valor
ADD A,#1
DA A

;Incrementar el numero

MOV valor,A
POP PSW
POP ACC
RETI

;Salvar el contexto

;--ISR EXTERNAL 1
_ISR_EX1:
PUSH ACC
PUSH PSW

;Salvar el contexto

MOV A,valor
ADD A,#99h
DA A

;Sumar R0 + (-1)bcd
;Ajustar a decimal

MOV valor,A

;Guardar resultado de la suma

POP PSW
POP ACC
RETI

;Salvar el contexto

;******************Funciones*********************
;---------------------------------------------------------------;Imprime una cadena en la LCD
_imprimir_dig:
PUSH ACC
MOV A,R0

;Imprimir parte alta
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292

Page 4

SWAP A
ANL A,#0Fh
ADD A,#30H

;Obtener parte alta
;Convertira a ascii

SETB F0
;Imprimir dato
ACALL _LCD_wrcmd_data
MOV A,R0
ANL A,#0Fh
ADD A,#30H

;Imprimir parte alta
;Convertira a ascii

SETB F0
ACALL _LCD_wrcmd_data

;Imprimir dato

POP ACC
RET
;-------------------------------------------------------------_LCD_Puts:
PUSH AR0
PUSH ACC
PUSH AR1
MOV R0,#0

;Salvar contexto

;Para indexar tabla

_$nextchar:
MOV A,R0
MOVC A,@A+DPTR
MOV R1,A

;Para indexar tabla
;Leer caracter y guardar

XRL A,#10h
JZ _$salir__LCD_Puts

;Comparar con fin de cadena

MOV A,R1
ACALL _LCD_Putchar
INC R0

;Si no es fin de cadena imprimir caracter
;Apuntar al siguiente caracter de la cadena

SJMP _$nextchar
_$salir__LCD_Puts:
POP AR1
POP ACC
POP AR0
RET

;Restaurar contexto

;---------------------------------------------------------------;Imprime un caracter en la LCD
_LCD_Putchar:
PUSH PSW
SETB F0
;Para indicar qeu se escribira un dato
ACALL _LCD_wrcmd_data
POP PSW
RET
;---------------------------------------------------------------;Limpia la LCD y pone el cusor en la posicion 0,0
_LCD_home:
PUSH ACC
;Salvar contexto de la llamada
CLR F0
MOV A,#02H
ACALL _LCD_wrcmd_data
POP ACC
RET
_LCD_clr:

;cursor at home
;Restaurar contexto de la llamada
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365

Page 5

PUSH ACC

;Salvar contexto de la llamada

CLR F0
MOV A,#01H
ACALL _LCD_wrcmd_data

;lcd CLEAR

POP ACC
RET

;Restaurar contexto de la llamada

;---------------------------------------------------------------------------;Inicializar la LCD a 4 bits
_LCD_init:
PUSH ACC
MOV
CLR

LCD_DATA,#00h
LCD_RS

;Iniciar puerto de LCD como salida
;Asegurar comandos

MOV
A,#30H
ACALL _LCD_Adato
SETB LCD_EN
CLR
LCD_EN
MOV A,#5
ACALL _Delay_ms

;inicializacion y delay

MOV
A,#30H
ACALL _LCD_Adato
SETB LCD_EN
CLR
LCD_EN
MOV A,#5
ACALL _Delay_ms

;inicializacion y delay

MOV
A,#30H
ACALL _LCD_Adato
SETB LCD_EN
CLR
LCD_EN
MOV A,#5
ACALL _Delay_ms

;inicializacion y delay

MOV
A,#20H
ACALL _LCD_Adato
SETB LCD_EN
CLR
LCD_EN
MOV A,#5
ACALL _Delay_ms

;inicializacion y delay

CLR F0
MOV A,#28H
ACALL _LCD_wrcmd_data

;LCD STROBE

;LCD STROBE

;LCD STROBE

;LCD STROBE

;Comandos de inicializacion

MOV A,#08H
ACALL _LCD_wrcmd_data
MOV A,#01H
ACALL _LCD_wrcmd_data
MOV A,#06H
ACALL _LCD_wrcmd_data
MOV A,#00001101b
ACALL _LCD_wrcmd_data

;lcd on blinking

MOV A,#03H
ACALL _LCD_wrcmd_data

;cursor at home y clear lcd

POP ACC
RET
;---------------------------------------------------------------;Escribir un comando o un dato a la LCD F0=1 dato, F0=0 cmd
_LCD_wrcmd_data:
CLR

LCD_EN

;Asegurar enable en 0
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405

CLR

LCD_RS

JNB
SETB

F0,_$cmd
LCD_RS

;Verificar si dato o comando

_$cmd:
PUSH ACC
ANL A,#0F0h
ACALL _LCD_Adato
SETB LCD_EN
CLR LCD_EN

;Sacar parte alta del comando
;Enviar parte alta
;Enable en 0 y luego en 1

MOV A,#2
ACALL _Delay_ms
POP
ACC
SWAP A
ANL A,#0F0h
ACALL _LCD_Adato
SETB LCD_EN
CLR LCD_EN
MOV A,#2
ACALL _Delay_ms

;Sacar parte baja del comando
;Enviar parte baja
;Enable en 0 y luego en 1

;Delay

RET
;---------------------------------------------------------------;Ajustar DATO para escbibir a la lcd DB4->P2.2....DB7->P2.5
_LCD_Adato:
PUSH B
;Salvar contexto
PUSH ACC
RR A
RR A
MOV B,A
MOV A,LCD_DATA

;Ajustar el bit mas significativo con el bit 5 del puerto

;Asegurarse de que no se modifiquen los bits del puerto que

en uso
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437

Page 6

ANL A,#11000011b
ORL A,B

;Acomodar el dato

MOV LCD_DATA,A

;Poner el dato

POP ACC
POP B
RET

;Restaurar contexto

;---------------------------------------------------------------;Temporizar ACC*ms
_Delay_ms:
PUSH AR0
PUSH ACC
_$waitxms:
MOV R0,#10
_$wait1ms:
ACALL _Delay_100us
DJNZ R0,_$wait1ms

;Salvar el contexto de la llamada

;Para temporizar 1ms = 100us*10

;Temporizar 100us
;Multiplicar 10

DJNZ ACC,_$waitxms

;Multiplicar el ACC * 1ms

POP ACC
POP AR0

;Restaurar el contexto

RET
;---------------------------------------------------------------;Temporia 100us

no estan
C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500

Page 7

_Delay_100us:
MOV TMOD,#00000001b
MOV TH0,#high(65469)
MOV TL0,#low(65469)

;Configurar TIMER 0 en modo 1
;Cuenta inicial para 1ms

SETB TR0
CLR TF0

;Encender TIMER 0

_$wTF0: JNB TF0,_$wTF0

;Esperar por el overflow del timer 0

RET
;---------------------------------------------------------------_LCD_Gotoxy:
push ACC
ANL A,#10h
JZ _$goto
pop ACC

;Salvar contexto
;verifico la posicion de la linea y si son iguales salto a la etiqueta

RET
_$goto:
POP ACC
ADD A,#80h

;restauro el valor que tenia el acumulador
;le sumo al acumulador '80h' para ponerlo en la primera linea
;y la posicion que tenga el acumulador

RET
;---------------------------------------------------------------_LCD_Cursoroff:
PUSH ACC
CLR F0
MOV A, #00001100b
ACALL _LCD_wrcmd_data
POP ACC
RET

;Apagar Cursor De la LCD

_LCD_Cursoron:
PUSH ACC
CLR F0
MOV A, #00001110b
ACALL _LCD_wrcmd_data
POP ACC
RET
$EJECT

;Encender Cursor de la LCD

; change page

;-----------------------------------------------------------------------------; CODE MEMORY CONSTANTS
; This is where your CODE MEMORY constants go.
; Remove the sample to save memory
;-----------------------------------------------------------------------------;table:
db 31h, 32h, 33h, 5eh, 34h, 35h, 36h, 76h, 37h, 38h, 39h, 0e0h, 20h, 30h, 3fh, 3ah (sample)
;tablel_en equ 1+$-table
msj:
db
"Elegir Cancion:",10h
notas:
dw
0FE06h, 0000H,0FE06h,0000H,0FE06h,0000H,0FD82h,0000H,0FE06h,0000H,0FE56h,0000H,
0FD82h,0000h
tiempo:
db
04d,01d,04d,01d,04d,01d,04d,01d,04d,01d,04d,04d,08d,06d
END
; End Of File

More Related Content

Viewers also liked

Digitala kampanjer #ggmo
Digitala kampanjer #ggmoDigitala kampanjer #ggmo
Digitala kampanjer #ggmo
Anna Oscarsson
 
ELS CONSELLS DE LA TORTUGA
ELS CONSELLS DE LA TORTUGA ELS CONSELLS DE LA TORTUGA
ELS CONSELLS DE LA TORTUGA ESCOLA PRIMER
 
Presentación giramon
Presentación giramonPresentación giramon
Presentación giramon
ESCOLA PRIMER
 
государственный музей политической истории россии
государственный музей политической истории россиигосударственный музей политической истории россии
государственный музей политической истории россииigvspam
 
6 Social media trends 2013
6 Social media trends 20136 Social media trends 2013
6 Social media trends 2013
Anna Oscarsson
 
rencana
rencanarencana
rencana
dylla Desa
 
Media for Social Responsibility: Portrayals of Disability and Chronic Illness...
Media for Social Responsibility: Portrayals of Disability and Chronic Illness...Media for Social Responsibility: Portrayals of Disability and Chronic Illness...
Media for Social Responsibility: Portrayals of Disability and Chronic Illness...
Anthony Adornato
 
Mobile Journalism: Tips, Gear, and Assignments
Mobile Journalism: Tips, Gear, and AssignmentsMobile Journalism: Tips, Gear, and Assignments
Mobile Journalism: Tips, Gear, and Assignments
Anthony Adornato
 

Viewers also liked (10)

L'espai
L'espaiL'espai
L'espai
 
Digitala kampanjer #ggmo
Digitala kampanjer #ggmoDigitala kampanjer #ggmo
Digitala kampanjer #ggmo
 
ELS CONSELLS DE LA TORTUGA
ELS CONSELLS DE LA TORTUGA ELS CONSELLS DE LA TORTUGA
ELS CONSELLS DE LA TORTUGA
 
Presentación giramon
Presentación giramonPresentación giramon
Presentación giramon
 
201209 entreprenör
201209 entreprenör201209 entreprenör
201209 entreprenör
 
государственный музей политической истории россии
государственный музей политической истории россиигосударственный музей политической истории россии
государственный музей политической истории россии
 
6 Social media trends 2013
6 Social media trends 20136 Social media trends 2013
6 Social media trends 2013
 
rencana
rencanarencana
rencana
 
Media for Social Responsibility: Portrayals of Disability and Chronic Illness...
Media for Social Responsibility: Portrayals of Disability and Chronic Illness...Media for Social Responsibility: Portrayals of Disability and Chronic Illness...
Media for Social Responsibility: Portrayals of Disability and Chronic Illness...
 
Mobile Journalism: Tips, Gear, and Assignments
Mobile Journalism: Tips, Gear, and AssignmentsMobile Journalism: Tips, Gear, and Assignments
Mobile Journalism: Tips, Gear, and Assignments
 

Codigo 8051

  • 1. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 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 Page 1 ;-----------------------------------------------------------------------------; Source code template for A51 assembler modules. ; Copyright (c) 2008 Marlon Hiraldo ;-----------------------------------------------------------------------------$NOMOD51 ; disable predefined 8051 registers $INCLUDE (REG52.INC) ; include register definition file ; (this is CPU dependant 8051, 8052, etc.) NAME skell $EJECT ; eject page (change) ;-----------------------------------------------------------------------------; This is a good place to include any reference to external symbols. ; This is also a good place to add any expose states (publics). ;------------------------------------------------------------------------------ ;-----------------------------------------------------------------------------; STACK segment ;-----------------------------------------------------------------------------?STACK SEGMENT IDATA ; ?STACK in IDATA RAM (index only RAM). RSEG ?STACK ; ?STACK segment. DS 16 ; 16 bytes for stack (16 is a lot!!) $EJECT ; eject page ;-----------------------------------------------------------------------------; DATA SEGMENT ; Add your variable declaration in this segment. ; Use DS # to reserve memory space. Remove samples to save memory ;-----------------------------------------------------------------------------data_seg SEGMENT DATA ; segment for DATA RAM. RSEG data_seg ; data segment ; *****your vars go valor: DS duracion: DS nota: DS here***** 1 1 1 ;-----------------------------------------------------------------------------; BIT SEGMENT ; Add your bit variables declaration in this segment. ; User DBIT # to reserve memory bit space. Remove the samples to save memory ;-----------------------------------------------------------------------------bit_seg SEGMENT BIT ; segment for BIT RAM. RSEG bit_seg ; bit segment ;*****Your bits go here******* ;bit_var2: DBIT 4 ; 4 bits var (sample) ;-----------------------------------------------------------------------------; Add your constants (typeless) here. ;-----------------------------------------------------------------------------;********Your constants go here*********** number1 EQU 0DH ; number substitudes for 0dh (sample) num1 EQU number1-8 ; evaluated value for num1 (sample) LCD_RS BIT P2.0 LCD_EN BIT P2.1 LCD_DATA DATA P2 Bocina BIT $EJECT P1.0 ; change page ;-----------------------------------------------------------------------------; Modify to reflect your code memory entry point ; This can also be used to relocate the ISR entry points ;-----------------------------------------------------------------------------CSEG LJMP AT 0000H _$start ; set code segment to start at 0 ; reset entry point (jump to start)
  • 2. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 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 Page 2 CSEG LJMP AT 0003H _ISR_EX0 ;ISR INT externa 0 CSEG LJMP AT 0013H _ISR_EX1 ;ISR INT externa 1 CSEG LJMP AT 001BH _ISR_T1 ;ISR INT Timer 1 CSEG AT 002BH ;ISR INT Timer 2 LJMP _ISR_T2 ;-----------------------------------------------------------------------------; CODE SEGMENT ; This is where your code goes ;-----------------------------------------------------------------------------code_seg SEGMENT CODE RSEG code_seg USING 0 _$start: ; code segment ; let the assembler know we are using register ; bank 0. This is needed for some statements. MOV SP,#?STACK-1 ; set stack to the right location SETB IT0 SETB IT1 ;habilitar interrupcion externa al micro ORL TMOD,#00010000b ;Configurar timer 1 en modo 1 MOV TL1,#low(32202) MOV TH1,#high(32202) ;Cuenta inicial del timer 1 para 0.05s CLR TR1 CLR TR2 ;Timer 1 OFF ;Timer 2 OFF MOV T2CON,#00000000b MOV TL2,#low(64778) MOV TH2,#high(64778) ;Timer 2 en autorecarga ;Cuenta inicial del timer 2 para 0.05s MOV IE,#10101101b ;Habilitar EX0,EX1,TF1 y global intr ACALL _LCD_init ACALL _LCD_cursoroff ;Inicializar LCD ;Apaga el cursor MOV DPTR,#msj ACALL _LCD_puts ;Carga e imprime msj (primera linea LCD) MOV A,#49h acall _LCD_gotoxy ;Posicionar el cursor para imprimir número de canción seleccionada MOV R0,valor acall _imprimir_dig ;Imprime en la LCD el número actual de la canción seleccionada _$otro: sjmp _$otro ;**************************************ISRs******************************************************* ;--ISR TIMER 1 _ISR_T2: CPL Bocina CLR TF2 RETI ;--ISR TIMER 1 _ISR_T1: ;Generar onda cuadrada 50%
  • 3. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 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 219 Page 3 PUSH PSW PUSH ACC DJNZ duracion,_$exit_isr_t1 ;Verificar que han pasado 1.0 segs mov duracion,#40d MOV A,nota MOVC A,@A+dptr MOV RCAP2H,A ;Indice de la nota a tocar ;Obtener parte alta INC nota MOV A,nota MOVC A,@A+dptr MOV RCAP2L,A ;Indice de la nota a tocar ;Obtener parte baja SETB TR2 INC nota ;mover a la siguiente nota mov A,nota ;Reiniciar: comparar con 13*2 = 26 CJNE A,#26,_$exit_isr_t1 mov nota,#00h _$exit_isr_t1: MOV TL1,#low(32202) ;Cuenta inicial del timer 1 para 0.05s MOV TH1,#high(32202) CLR TF1 ;INT Ack POP ACC POP PSW RETI ;Restaurar contexto ;--ISR EXTERNAL 0 _ISR_EX0: PUSH ACC PUSH PSW ;Salvar el contexto MOV A,valor ADD A,#1 DA A ;Incrementar el numero MOV valor,A POP PSW POP ACC RETI ;Salvar el contexto ;--ISR EXTERNAL 1 _ISR_EX1: PUSH ACC PUSH PSW ;Salvar el contexto MOV A,valor ADD A,#99h DA A ;Sumar R0 + (-1)bcd ;Ajustar a decimal MOV valor,A ;Guardar resultado de la suma POP PSW POP ACC RETI ;Salvar el contexto ;******************Funciones********************* ;---------------------------------------------------------------;Imprime una cadena en la LCD _imprimir_dig: PUSH ACC MOV A,R0 ;Imprimir parte alta
  • 4. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 Page 4 SWAP A ANL A,#0Fh ADD A,#30H ;Obtener parte alta ;Convertira a ascii SETB F0 ;Imprimir dato ACALL _LCD_wrcmd_data MOV A,R0 ANL A,#0Fh ADD A,#30H ;Imprimir parte alta ;Convertira a ascii SETB F0 ACALL _LCD_wrcmd_data ;Imprimir dato POP ACC RET ;-------------------------------------------------------------_LCD_Puts: PUSH AR0 PUSH ACC PUSH AR1 MOV R0,#0 ;Salvar contexto ;Para indexar tabla _$nextchar: MOV A,R0 MOVC A,@A+DPTR MOV R1,A ;Para indexar tabla ;Leer caracter y guardar XRL A,#10h JZ _$salir__LCD_Puts ;Comparar con fin de cadena MOV A,R1 ACALL _LCD_Putchar INC R0 ;Si no es fin de cadena imprimir caracter ;Apuntar al siguiente caracter de la cadena SJMP _$nextchar _$salir__LCD_Puts: POP AR1 POP ACC POP AR0 RET ;Restaurar contexto ;---------------------------------------------------------------;Imprime un caracter en la LCD _LCD_Putchar: PUSH PSW SETB F0 ;Para indicar qeu se escribira un dato ACALL _LCD_wrcmd_data POP PSW RET ;---------------------------------------------------------------;Limpia la LCD y pone el cusor en la posicion 0,0 _LCD_home: PUSH ACC ;Salvar contexto de la llamada CLR F0 MOV A,#02H ACALL _LCD_wrcmd_data POP ACC RET _LCD_clr: ;cursor at home ;Restaurar contexto de la llamada
  • 5. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 Page 5 PUSH ACC ;Salvar contexto de la llamada CLR F0 MOV A,#01H ACALL _LCD_wrcmd_data ;lcd CLEAR POP ACC RET ;Restaurar contexto de la llamada ;---------------------------------------------------------------------------;Inicializar la LCD a 4 bits _LCD_init: PUSH ACC MOV CLR LCD_DATA,#00h LCD_RS ;Iniciar puerto de LCD como salida ;Asegurar comandos MOV A,#30H ACALL _LCD_Adato SETB LCD_EN CLR LCD_EN MOV A,#5 ACALL _Delay_ms ;inicializacion y delay MOV A,#30H ACALL _LCD_Adato SETB LCD_EN CLR LCD_EN MOV A,#5 ACALL _Delay_ms ;inicializacion y delay MOV A,#30H ACALL _LCD_Adato SETB LCD_EN CLR LCD_EN MOV A,#5 ACALL _Delay_ms ;inicializacion y delay MOV A,#20H ACALL _LCD_Adato SETB LCD_EN CLR LCD_EN MOV A,#5 ACALL _Delay_ms ;inicializacion y delay CLR F0 MOV A,#28H ACALL _LCD_wrcmd_data ;LCD STROBE ;LCD STROBE ;LCD STROBE ;LCD STROBE ;Comandos de inicializacion MOV A,#08H ACALL _LCD_wrcmd_data MOV A,#01H ACALL _LCD_wrcmd_data MOV A,#06H ACALL _LCD_wrcmd_data MOV A,#00001101b ACALL _LCD_wrcmd_data ;lcd on blinking MOV A,#03H ACALL _LCD_wrcmd_data ;cursor at home y clear lcd POP ACC RET ;---------------------------------------------------------------;Escribir un comando o un dato a la LCD F0=1 dato, F0=0 cmd _LCD_wrcmd_data: CLR LCD_EN ;Asegurar enable en 0
  • 6. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 CLR LCD_RS JNB SETB F0,_$cmd LCD_RS ;Verificar si dato o comando _$cmd: PUSH ACC ANL A,#0F0h ACALL _LCD_Adato SETB LCD_EN CLR LCD_EN ;Sacar parte alta del comando ;Enviar parte alta ;Enable en 0 y luego en 1 MOV A,#2 ACALL _Delay_ms POP ACC SWAP A ANL A,#0F0h ACALL _LCD_Adato SETB LCD_EN CLR LCD_EN MOV A,#2 ACALL _Delay_ms ;Sacar parte baja del comando ;Enviar parte baja ;Enable en 0 y luego en 1 ;Delay RET ;---------------------------------------------------------------;Ajustar DATO para escbibir a la lcd DB4->P2.2....DB7->P2.5 _LCD_Adato: PUSH B ;Salvar contexto PUSH ACC RR A RR A MOV B,A MOV A,LCD_DATA ;Ajustar el bit mas significativo con el bit 5 del puerto ;Asegurarse de que no se modifiquen los bits del puerto que en uso 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 Page 6 ANL A,#11000011b ORL A,B ;Acomodar el dato MOV LCD_DATA,A ;Poner el dato POP ACC POP B RET ;Restaurar contexto ;---------------------------------------------------------------;Temporizar ACC*ms _Delay_ms: PUSH AR0 PUSH ACC _$waitxms: MOV R0,#10 _$wait1ms: ACALL _Delay_100us DJNZ R0,_$wait1ms ;Salvar el contexto de la llamada ;Para temporizar 1ms = 100us*10 ;Temporizar 100us ;Multiplicar 10 DJNZ ACC,_$waitxms ;Multiplicar el ACC * 1ms POP ACC POP AR0 ;Restaurar el contexto RET ;---------------------------------------------------------------;Temporia 100us no estan
  • 7. C:UsersManuelDesktopMicroPracticas laboratorioPractica #5CodigoPractica #5.A51 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 Page 7 _Delay_100us: MOV TMOD,#00000001b MOV TH0,#high(65469) MOV TL0,#low(65469) ;Configurar TIMER 0 en modo 1 ;Cuenta inicial para 1ms SETB TR0 CLR TF0 ;Encender TIMER 0 _$wTF0: JNB TF0,_$wTF0 ;Esperar por el overflow del timer 0 RET ;---------------------------------------------------------------_LCD_Gotoxy: push ACC ANL A,#10h JZ _$goto pop ACC ;Salvar contexto ;verifico la posicion de la linea y si son iguales salto a la etiqueta RET _$goto: POP ACC ADD A,#80h ;restauro el valor que tenia el acumulador ;le sumo al acumulador '80h' para ponerlo en la primera linea ;y la posicion que tenga el acumulador RET ;---------------------------------------------------------------_LCD_Cursoroff: PUSH ACC CLR F0 MOV A, #00001100b ACALL _LCD_wrcmd_data POP ACC RET ;Apagar Cursor De la LCD _LCD_Cursoron: PUSH ACC CLR F0 MOV A, #00001110b ACALL _LCD_wrcmd_data POP ACC RET $EJECT ;Encender Cursor de la LCD ; change page ;-----------------------------------------------------------------------------; CODE MEMORY CONSTANTS ; This is where your CODE MEMORY constants go. ; Remove the sample to save memory ;-----------------------------------------------------------------------------;table: db 31h, 32h, 33h, 5eh, 34h, 35h, 36h, 76h, 37h, 38h, 39h, 0e0h, 20h, 30h, 3fh, 3ah (sample) ;tablel_en equ 1+$-table msj: db "Elegir Cancion:",10h notas: dw 0FE06h, 0000H,0FE06h,0000H,0FE06h,0000H,0FD82h,0000H,0FE06h,0000H,0FE56h,0000H, 0FD82h,0000h tiempo: db 04d,01d,04d,01d,04d,01d,04d,01d,04d,01d,04d,04d,08d,06d END ; End Of File