Sie sind auf Seite 1von 16

EnvioCaracteresLCD_EDSIM51_L2 db "Computadores"

db 0
; constantes mov r0,#homeCur ;cursor al inicio de la línea
LCD_DATA equ 090h ; puerto 1 es usado para datos o lcall wrlcdcom4
instrucciones sjmp $
LCD_DB4 equ 094h ; high nibble del puerto 1(P1.4) es usado
para datos o instrucciones ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
LCD_DB5 equ 095h ; high nibble del puerto 1(P1.5) es usado ; subrutinas
para datos o instrucciones ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
LCD_DB6 equ 096h ; high nibble del puerto 1(P1.6) es usado
para datos o instrucciones inicio_display:
LCD_DB7 equ 097h ; high nibble del puerto 1(P1.7) es usado CLR P1.3 ; clear RS - indica que instrucciones
para datos o instrucciones estan siendo enviados al módulo
LCD_RS equ 093h ; p1.1 LCD linea Register Select
LCD_RW equ 091h ; p1.2 LCD linea Read / Write ; function set
LCD_E equ 092h ; p1.3 LCD linea Enable CLR P1.7 ;|
CLR P1.6 ;|
;instrucciones del sistema SETB P1.5 ;|
Config equ 28h ; 4 bits de datos, 2 lineas, 5 por 7 caracter CLR P1.4 ;
matriz
entryMode equ 6 ; incrementar cursor, no traslada display, SETB P1.2 ;|
incremento CLR P1.2 ;
; autom tico del registro AC al escribir.
lcall retardo;
; instrucciones de control del cursor
offCur equ 0Ch SETB P1.2 ;|
lineCur equ 0Eh CLR P1.2 ;
blinkCur equ 0Dh ;
combnCur equ 0Fh
homeCur equ 02h ;se coloca el cursor al principio de la línea SETB P1.7 ;
;cursor al rinc¢n
shLfCur equ 10h SETB P1.2 ;
shRtCur equ 14h CLR P1.2 ;
;
; instrucciones de control del display lcall retardo ;
clrDsp equ 01h ;Limpia el display(los contenidos son
borrados) ret
;borra display, cursor al rinc¢n, y pone el modo retardo:
;de entrada en incrementar. mov R0,#50
offDsp equ 0Ah ;blanquea el display(display se apaga)no hay djnz R0,$
efecto ret
;de parpadeo y el cursor es visualizado
onDsp equ 0Eh ;Muestra mensaje en el display(el display se ;
enciende) ===============================================
shLfDsp equ 18h ;Desplazamiento del display a la izquierda ; subrutina crShLf4
shRtDsp equ 1Ch ;Desplazamiento del display a la derecha ; Esta rutina traslada el cursor a la izquierda. El numero de
; posiciones a ser trasladado es localizado en el acumulador.
org 0000h ; entrada : acumulador indica numero de posiciones a trasladar
; inicializa el m¢dulo LCD -------------------------- ; salida : nada
start: ;
lcall inicio_display ===============================================
lcall initLCD4 ; inicializa fonts, #lineas, Modo de entrada ;
; imprime un mensaje en la primera linea del display LCD crShLf4:
------------------------------------ jz ret_scl
lcall prtLCD4 mov r0, #shLfCur ; palabra de control para trasladar a la
db "Arquitectura de " izquierda
db 0 acall wrLCDcom4
lcall retardo dec acc
;localiza un cursor en la linea 2, posicion 4 y muestra mensaje sjmp crShLf4
mov a, #2 ; linea 2 ret_scl: ret
mov b, #4 ; posicion 4
lcall placeCur4 ;
lcall prtLCD4 ; imprime el mensaje en la segunda línea del ===============================================
display LCD ; subrutina crShRt4
; Esta rutina traslada el cursor a la derecha. El numero de ;
; posiciones a ser trasladado es localizado en el acumulador. setCGRAM4:
; entrada : acumulador indica el numero de posiciones a trasladar push b
; salida : nada mov b, #8
; mul ab ; multiplica numero del caracter por 8
=============================================== pop b ; b sostiene numero de fila
; add a, b ; a holds CGRAM address
crShRt4: add a, #40h ; convert to instruction
jz ret_scr mov r0, a ; place instruction
mov r0, #shRtCur ; palabra de control para trasladar a la acall wrLCDcom4 ; issue command
derecha ret
acall wrLCDcom4
dec acc ;
sjmp crShRt4 ===============================================
ret_scr: ret ; subrutina dspShLf4
; Esta rutina traslada los contenidos del LCD a la izquierda. El
; ; numero de caracteres a ser trasladados es localizado en el
=============================================== ; acumulador.
; subrutina placeCur4 ; entrada : acumulador indica el numero de caracteres a trasladar
; Esta rutina fija la posicion del cursor. La posicion del cursor ; salida : nada
; es localizado en el registro b. La posicion del cursor empieza ;
; en 0. El acumulador da el numero de linea. ===============================================
; entrada: acumulador indica el numero de linea (1, 2) ;
; : el registro b guarda la posicion del cursor dspShLf4:
; salida : nada jz ret_sdl
; mov r0, #shLfDsp ; palabra de control para trasladar a la
=============================================== ; izquierda
; acall wrLCDcom4
placeCur4: dec a
dec acc ; acc=0 para linea=1 sjmp dspShLf4
jnz line2 ; si acc=0 luego primera lnea ret_sdl: ret
mov a, b
add a, #080h ; palabra de control para la linea 1 ;
sjmp setcur ===============================================
line2: ; subrutina dspShRt4
mov a, b ; Esta rutina traslada los contenidos del LCD a la derecha. El
add a, #0C0h ; palabra de control para la l¡nea 2 ; numero de caracteres a ser trasladados es localizado en el
setcur: ; acumulador.
mov r0, a ; localizar palabra de control ; entrada : acumulador indica el numero de caracteres a trasladar
acall wrLCDcom4 ; ; salida : nada
ret ;
===============================================
; ;
=============================================== dspShRt4:
; subrutina setCGRAM4 jz ret_sdr
; Esta rutina fija la direccion del Character Generator RAM. El mov r0, #shRtDsp ; palabra de control para trasladar a
; caracter [0..7] es localizado en el acumulador. La fila del font ; la derecha
; es localizado en el registro b. Las instrucciones 40h a 7Fh acall wrLCDcom4
; selecciona las direcciones del CGRAM 0 to 3Fh (0 to 63 dec a
decimal). sjmp dspShRt4
; el font de 5x7 para el caracter es asumido. Esto es, cada posici¢n ret_sdr: ret
del
; caracter contiene una matriz de 40 puntos arreglados en 8 filas de ;
; 5 puntos cada uno. las 7 filas son para los caracteres y la 8va ===============================================
; fila para el cursor debajo del caracter. Direcciones de CGRAM 0 ; subrutina wrLCDdata4
corresponde ; escribe un dato al LCD
; a la primera fila del caracter 0, direccion 7 corresponde ; el dato debe ser localizado en r0 para llamar el programa
; al 8vo (ultima) fila del caracter 0, y direccion 3Fh ; ----------------------------------------------------
; corresponde a la 8va fila del caracter 7. wrLCDdata4:
; clr LCD_E
; entrada : acumulador indica el c¢digo del caracter [0..7] setb LCD_RS ; selecciona enviar Dato
; : el registro b guarda la fila del font [0..7] clr LCD_RW ; selecciona operacion de escritura
; salida : nada push acc ; salva acumulador
; mov a, r0 ; pone byte de datos en el acc
===============================================
mov c, acc.4 ; carga high nibble sobre el bus de datos
mov LCD_DB4, c ; un bit a la vez...
mov c, acc.5 ; ;
mov LCD_DB5, c ===============================================
mov c, acc.6 =====
mov LCD_DB6, c ; subrutina initLCD4 - inicializa el LCD
mov c, acc.7 ;
mov LCD_DB7, c ; ----------------------------------------------------
initLCD4:
setb LCD_E ; pone a uno el pin Enable clr LCD_RS ; LCD linea de Register Select
clr LCD_E ; pone a cero el pin Enable clr LCD_RW ; linea de Read / Write
clr LCD_E ; linea de Enable
mov c, acc.0 ; similarmente, carga el low nibble
mov LCD_DB4, c mov r0, #entryMode ; fijar Entry Mode
mov c, acc.1 acall wrLCDcom4 ; incrementar cursor a la derecha, no traslada
mov LCD_DB5, c el display
mov c, acc.2
mov LCD_DB6, c mov r0, #onDsp ; Enciende el display, home cursor
mov c, acc.3 lcall wrLCDcom4
mov LCD_DB7, c ret
setb LCD_E ; pone a uno el pin Enable
clr LCD_E ; pone a cero el pin Enable ;
lcall retardo ===============================================
; subrutina prtLCD4
; Toma la cadena inmediatamente que sigue a la llamada a esta
pop acc
; subrutina y lo displaya sobre el LCD. La cadena es leida con la
ret
; instrucci¢n mov a, @a+dptr
; de este modo, la cadena esta en la memoria de datos.
;
;
===============================================
; entrada : nada
; subrutina wrLCDcom4
; salida : nada
; escribe una palabra de comando al LCD
; destruye : acc, dptr
; comando debe estar localizado en r0 para llamar el programa
;
; ----------------------------------------------------
===============================================
wrLCDcom4:
;
clr LCD_E
prtLCD4:
clr LCD_RS ; selecciona enviar comando
pop dph ; regresa direcci¢n de retorno en dptr
clr LCD_RW ; selecciona operaci¢n de escritura
pop dpl
push acc ; salva el acumulador
prtNext:
mov a, r0 ; pone el byte de datos en el acc
clr a ; set offset = 0
movc a, @a+dptr ; consigue chr de la memoria de c¢digo
mov c, acc.4 ; carga el high nibble en el bus de datos
cjne a, #0, chrOK ; si chr = 0 entonces retorna
mov LCD_DB4, c ; un bit a la vez usando...
sjmp retPrtLCD
mov c, acc.5 ; operaciones de mover bit
chrOK:
mov LCD_DB5, c
mov r0, a
mov c, acc.6
acall wrLCDdata4 ; enviar caracter
mov LCD_DB6, c
inc dptr ; apuntar al siguiente caracter
mov c, acc.7
ajmp prtNext ; lazo hasta que finalize la cadena
mov LCD_DB7, c
retPrtLCD:
mov a, #1h ; apunta a la instrucci¢n despu‚s de la
setb LCD_E ; pulsa la l¡nea Enable
cadena
clr LCD_E
jmp @a+dptr ; retorno con una instrucci¢n de salto
mov c, acc.0 ; similarmente, carga el low nibble
mov LCD_DB4, c
;
mov c, acc.1
===============================================
mov LCD_DB5, c
=====
mov c, acc.2
; subrutina sdelay - retardo de un segundo
mov LCD_DB6, c
; entrada : nada
mov c, acc.3
; salida : nada
mov LCD_DB7, c
; destruye : nada - usa a
setb LCD_E ; pulsa la l¡nea Enable
; ----------------------------------------------------
clr LCD_E
; 100h-91h=6fh=(111)decimal
lcall retardo
; 9008 * 111 = 999888
pop acc
; mas 102 del segundo lazo
ret
; mas 8 da 999998 microsegundos
; ;===============================================
; microsegundos (ciclos) getchr:
; ----------------------- jnb ri, getchr ; espera hasta que el caracter sea recivido
sdelay: push acc ; 2.17 mov a, sbuf ; consigue el caracter
mov a, #91h ; 1.085 anl a, #7fh ; vuelve a cero el octavo bit
clr ri ; limpia el bit de estado serial
sd_olp: inc a ; \ ret
acall mdelay ; |
acall mdelay ; | ;
acall mdelay ; | ===============================================
acall mdelay ; | ================
acall mdelay ; | ; waitKey es una rutina util que imprime el mensaje
acall mdelay ; | ; "presione una tecla para continuar" y luego espera hasta que
acall mdelay ; |- el lazo toma 9008 microsegundos ; un caracter sea recivido.
acall mdelay ; | ;
acall mdelay ; | ===============================================
nop ;| ================
nop ;| waitKey:
nop ;| lcall print
nop ;| db "presione una tecla para continuar"
nop ;| db 0
jnz sd_olp ; / lcall crlf
lcall getchr ; espera hasta que se presione una tecla
mov a, #33h ; 1.085 ret
sd_ilp: djnz acc, sd_ilp ; -el lazo toma 2*33h=66h=(102)dec
;
pop acc ; 2.17 ===============================================
ret ; 2.17 ================
; ; subrutina crlf
=============================================== ; crlf envia un carriage return y line feed fuera del puerto serie
===== ;
; subrutina mdelay - retardo de 1 milisegundo ===============================================
; retardo para 998 microsegundos - 2 microsegundos son ================
; reservados para la llamada a esta rutina. crlf:
; intrada : nada mov a, #0Dh ; print cr
; salida : nada lcall sndchr
; destruye : nada - usa a cret:
; ---------------------------------------------------- mov a, #0Ah ; print lf
; 100h-a6h=5ah=(90)decimal lcall sndchr
; 90 * 11 = 990 ret
; mas 8 da 998 microsegundos ;
; ===============================================
; microsegundos (ciclos) ================
; ----------------------- ; subroutine sndchr
mdelay: push acc ; 2 ; esta rutina toma el caracter en el acc y lo envia fuera del
mov a, #0a6h ; 1 ; puerto serie.
;===============================================
md_olp: inc a ; 1 \ sndchr:
nop ; 1 | clr scon.1 ; clear the tx buffer full flag.
nop ; 1 | mov sbuf,a ; pone el caracter en sbuf
nop ; 1 | txloop:
nop ; 1 | jnb scon.1, txloop ; espera hasta que el caracter es enviado
nop ; 1 |- 11 ciclos ret
nop ; 1 |
nop ; 1 | ;===============================================
nop ; 1 | ; subrutina print
jnz md_olp ; 2 / ; print takes the string immediately following the call and
; sends it out the serial port. the string must be terminated
nop ; 1 ; with a null. this routine will ret to the instruction
pop acc ; 2 ; immediately following the string.
ret ; 2 ;===============================================
;=============================================== print:
; subrutina getchr pop dph ; put return address in dptr
; esta rutina lee un caracter desde el puerto serie y lo salva pop dpl
; en el acumulador. prtstr:
clr a ; set offset = 0 mov r0,#37h
movc a, @a+dptr ; get chr from code memory lcall wrLCDdata4
cjne a, #0h, mchrok ; if chr = ff then return mov r0,#shlfcur
sjmp prtdone lcall wrlcdcom4
mchrok: mov r0,#offcur ;no se ve el cursor
lcall sndchr ; send character lcall wrlcdcom4
inc dptr ; point at next character lcall sdelay
sjmp prtstr ; loop till end of string mov r0,#38h
prtdone: lcall wrLCDdata4
mov a, #1h ; point to instruction after string mov r0,#shlfcur
jmp @a+dptr ; return lcall wrlcdcom4
;=============================================== mov r0,#offcur ;no se ve el cursor
;Subrutina segs0_a_9 de display LCD para cuenta en segundos lcall wrlcdcom4
;Visualizacion de Segundos desde 0 a 9. lcall sdelay
;=============================================== mov r0,#39h
segs0_a_9: lcall wrLCDdata4
mov r0,#30h ;mov r0,#shlfcur
lcall wrLCDdata4 ;lcall wrlcdcom4
mov r0,#shlfcur mov r0,#offcur ;no se ve el cursor
lcall wrlcdcom4 lcall wrlcdcom4
mov r0,#offcur ;no se ve el cursor lcall sdelay
lcall wrlcdcom4 ret
lcall sdelay end
mov r0,#31h
lcall wrLCDdata4
mov r0,#shlfcur LABO 1
lcall wrlcdcom4
mov r0,#offcur ;no se ve el cursor Instrucciones a practicar
lcall wrlcdcom4
lcall sdelay mov R1,A MOVER O COPIAR EL VALOR DE A AL
mov r0,#32h REGISTRO R1, A TIENE UN VALOR 11 DESPUES DE
lcall wrLCDdata4 EJECUTADPE STA INSTRUCCION EL VALOR DE R1=11
mov r0,#shlfcur mov R2,A
lcall wrlcdcom4 mov R3,A
mov r0,#offcur ;no se ve el cursor .......
lcall wrlcdcom4 .......
lcall sdelay mov R7,A
mov r0,#33h
lcall wrLCDdata4 mov A,30h :mover el valor de 30h al acumulador despues de
mov r0,#shlfcur ejecutado esta instruccion el valor de A sera 0A
lcall wrlcdcom4 mov A,31h
mov r0,#offcur ;no se ve el cursor .........
lcall wrlcdcom4 .........
lcall sdelay mov 30h,A mover el valor de 30h a A
mov r0,#34h mov 31h,A
lcall wrLCDdata4 mov A,#data
mov r0,#shlfcur
lcall wrlcdcom4 add A,R1: adicionar R1 a A y el resultados e guarda en A
mov r0,#offcur ;no se ve el cursor add A,R2
lcall wrlcdcom4 add A,R3
lcall sdelay ........
mov r0,#35h add A,R7
lcall wrLCDdata4
mov r0,#shlfcur add A,40h :sumo el vlaor de A con el contenidod e 40h y el vaor se
lcall wrlcdcom4 guarda en A.
mov r0,#offcur ;no se ve el cursor add A,41h
lcall wrlcdcom4
lcall sdelay subb A,R1 :resta el valor de A con el contenido de R1 y el
mov r0,#36h resultado se guarda en el valor de A
lcall wrLCDdata4
mov r0,#shlfcur subb A,R2
lcall wrlcdcom4 subb A,R3
mov r0,#offcur ;no se ve el cursor .........
lcall wrlcdcom4 subb A,R7
lcall sdelay
add A,#data: suma el valor de A con el valor data por ejemplo si jnc notnum
data es 5 entonces se ba a sumar A+5 y7 el resultado se guarda en clr c ; chequea si chr es 0-9
A. add a, #0f6h ; lo ajusta
subb A,#data jc hextry ; salta si chr no es 0-9
add a, #0ah ; si lo es entonces lo ajusta
mul AB; BA<--A * B: A contiene la parte menos significativa ret
div AB; A + B <--A /B
hextry: clr acc.5 ;
setb P1.0: pone a 1 logico el vaor de P1.0 clr c ; chequea si chr es a-f
setb P1.1 :equivalente al primero add a, #0f9h ; lo ajusta
setb P1.2 jnc notnum ; si no es a-f entonces error
....... clr c ; averigua si char es 46 o menos.
setb P1.7 add a, #0fah ; ajusta el acumulador
jc notnum ; si carry=1 entonces no es un número
clr P1.0: hex
clr P1.1 anl a, #0fh ; limpia bits no usados
clr P1.2 ret
-----
clr P1.5 notnum: setb errorf ;
clr P1.6 ret
clr P1.7 ;===============================================
nop :no operacion ;Subrutina prthex
;Esta rutina toma el contenido del acumulador y lo envía
mov P1,#0: ; vía serie como 2 dígitos ascii hexadecimal.
mov P1,#0ffh ;===============================================
prthex: lcall binasc
jnb P2.0, loop: si el bit p2.0 es 0 salta a loop lcall sndchr
jb P2.0, lazo: si el bit P2.0 es uno salta al lazo ,donde lazo es una mov A,R2
etiqueta, de lo contrario ba a la siguiente instruccion lcall sndchr
ret

Fh=1111h no enciende el nibble mas significativo ;===============================================


8h= 1000B nivel menos significativo ;Subrutina binasc
F8= envio solamente al puerto P1 para encender solamente 3 leds ;Toma el contenido del acumulador y
;lo convierte en dos números ascii hexadecimales.
LABO 2 ;El resultado es retornado en el acumulador y R2
;===============================================
RUTINAS binasc: mov R2,A ;se mueve a R2 para salvar el valor de A
anl A,#0Fh ;se convierte el dígito menos significativo
=============================================== add A,#0F6h ;lo ajusta
; subrutina getbyt jnc noadj1
; esta rutina lee un número ascii hexadecimal de 2 digitos add A,#07h
; desde el puerto serie. El resultado es retornado en el acumulador noadj1: add A,#3Ah ;lo hace ascii
; xch A,R2 ;pone el resultado en R2
=============================================== swap A ;se convierte ahora el digito más significativo
; anl A,#0Fh
getbyt: lcall getchr ; consigue el caracter ascii msb add A,#0F6h ;lo ajusta
lcall ascbin ; lo convierte a binario jnc noadj2
swap A ; lo mueve a la mitad mas significativa del add A,#07h
acumulador noadj2: add A,#3Ah ;lo hace ascii
mov B, A ; lo salva en B ret
lcall getchr ; consigue el caracter ascii lsb
lcall ascbin ; lo convierte a binario ;===============================================
orl A, B ; combina las dos mitades ;Subrutina print
ret ;toma la cadena inmediatamente que sigue a "lcall"
;y lo envia por el puerto serie. La cadena debe terminar
; con un nulo(0).
=============================================== ;Esta subrutina retornará a la instrucción que sigue
; subrutina ascbin ;inmediatamente a la cadena.
; esta rutina toma el caracter ascii pasado en el ;===============================================
; acumulador y lo convierte a un número binario de 4 bits print: pop dph ;coloca dirección de reterno en dptr
; que es retornado en el acumulador. pop dpl
; prtstr: clr A
=============================================== movc A,@A+DPTR
ascbin: add a, #0d0h ; si chr < 30 entonces error cjne A,#0h,mchrok
sjmp prtdone
mchrok: lcall sndchr org 0000h
inc DPTR
sjmp PRTSTR repite:
prtdone: mov A,#1h
jmp @A+DPTR clr P3.4 ; Selecciona el display que se encuentra en la derecha
(segundo)
;======================================== setb P3.3
;Subrutina sndchr mov R1,#10 ; contador de 10
;que envia un caracter mov R0,#0 ; número inicial a mostrar en el display
;que está contenido en el acumulador A
;======================================== loop:
sndchr:
clr TI mov A,R0 ; Muevo el registro A el contenido de R0
mov SBUF,A lcall display ; se consigue el patròn de bits a mostrar en el display
txloop: mov P1,A ; Enío el patrón de bits del múmero al puerto P1
jnb TI,txloop inc R0 ; siguiente número a mostrar
ret djnz R1,loop ; decremento de R1 y salto a loop si R1 es distinto
de cero
;=============================================== sjmp repite ; se repite indefinidamente
;Subrutina init
;que configura el puerto serie
;a una velocidad de comunicación de 19200 baudios ===========================================
;=============================================== ;Subrutina display
init: ;que convierte el valor del registro A
mov PCON,#80H ;en un patron de bits que corresponde a un número que
mov TMOD,#20H ;se muestra en el display de 7 segmentos
mov TCON,#41H ;===============================================
mov TH1,#0FDH display:
mov SCON,#50H inc a ;incremento el valor de A
ret movc a,@a+pc ;muevo a A el valor del contenido de la
dirección de memoria (pc+a)
;=============================================== ret ;Retorno de la subrutina al programa
;Subrutina display principal
;que convierte el valor del registro A db 0C0h ;Con este código se muestra "0" en el
;en un patron de bits que corresponde a un número que display
;se muestra en el display de 7 segmentos db 0F9h ;Con este código se muestra "1" en el
;=============================================== display
display: db 0A4h ;"2"
inc a ;incremento el valor de A db 0B0h ;"3"
movc a,@a+pc ;muevo a A el valor del contenido de la db 99h ;"4"
dirección de memoria (pc+a) db 92h ;"5"
ret ;Retorno de la subrutina al programa db 82h ;"6"
principal db 0F8h ;"7"
db 0C0h ;Con este código se muestra "0" en el db 80h ;"8"
display db 90h ;"9"
db 0F9h ;Con este código se muestra "1" en el
display
db 0A4h ;"2" ;; ; Problema 2)
db 0B0h ;"3"
db 99h ;"4"
db 92h ;"5" org 0000h
db 82h ;"6"
db 0F8h ;"7" lcall llena_memoria
db 80h ;"8" mov R0,#9 ; contador
mov R1,#30h ; Direccion inicial
mov R3,0 ; Aquí se guardará el mayor número. R3 es el largest
Problema 1)
loop:
;===============================================
;Programa contador decimal de 0 a 9 que se muestra en un display mov A,@R1 ; Muevo a A el valor corriente de la dirección de
de 7 segmentos memoria
; ànodo comùn subb A,R3 ; Se realiza la resta de "A - R3" y el resultado se guarda
;Se repite en forma indefinida en A
;=============================================== jc mayor ; El carry "C" es 1 si es negativo la operaciòn anterior
mov A,@R1 lcall hex_a_dec
mov R3,A ; Se cambia el contenido de R3 al valor corriente
muestra: ; se muestra el resultado en los dìsplay de 7 segmentos
mayor:
setb P3.3
inc R1 clr P3.4
djnz R0,loop mov A,decena
mov 50h,R3 ; Se guarda el valor en 50h lcall display
mov P1,A
Fin: nop
nop
sjmp Fin mov P1,#0FFh
clr P3.3
llena_memoria: clr P3.4
mov R0,#30h ; dirección inicial de memoria a llenar mov A,unidad
mov R4,#9 ; cantidad de datos a llenar lcall display
mov R5,#0 ; Número inicial para obtener el primer dato a llenar mov P1,A
nop
lazo: nop
mov P1,#0FFh
mov A,R5 sjmp muestra
lcall obtengo_valor
mov @R0,A ; Muevo el dato a la dirección de memoria hex_a_dec:
inc R5
inc R0 mov B,#10
djnz R4,lazo div AB
ret mov decena,A
mov unidad,B
; Subrutina para obtener el dato a llenar en la memoria ret
obtengo_valor:
;===============================================
inc A ;Subrutina display
movc A,@A+PC ;que convierte el valor del registro A
ret ;en un patron de bits que corresponde a un número que
;se muestra en el display de 7 segmentos
db 03h; ;===============================================
db 02h; display:
db 09h; inc a ;incremento el valor de A
db 05h; movc a,@a+pc ;muevo a A el valor del contenido de la
db 04h; dirección de memoria (pc+a)
db 07h; ret ;Retorno de la subrutina al programa
db 06h; principal
db 08h; db 0C0h ;Con este código se muestra "0" en el
db 01h; display
db 0F9h ;Con este código se muestra "1" en el
display
db 0A4h ;"2"
;; ; Problema 4) db 0B0h ;"3"
db 99h ;"4"
decena equ 40h db 92h ;"5"
unidad equ 41h db 82h ;"6"
db 0F8h ;"7"
org 0000h db 80h ;"8"
mov R0,#4 db 90h ;"9"
mov R1,#1
mov R2,#1
mov A,R1 =============================================
;; ; Problema 7)
loop:

mov B,R2
mul AB ; Generación de una señal de 1khz en el pin P1.2
inc R2 ; utilizando el timer 0
djnz R0,loop
mov 50h,A
org 0000h inc r7 ; incrementa el contador
mov TMOD,#02h ; configura el timer 0 en modo 2 como un clr TF0 ; este flag de desbordamiento se pone a hardware
; temporizador de 8 bits con autorecarga ; este flag debe ser puesto a cero por software
MOV TH0,#6 ; valor de recarga
SETB TR0 ; inicia el timer cero cjne r7,#4,espera_desborde
MOV R7,#0 ; contador mov R7,#0
cpl P1.2 ; complementa el pin 3 en el puerto 1
espera_desborde: sjmp espera_desborde
end
jnb TF0,$ ; esto se repite mientras TF0 es cero y no hay
; desbordamiento ;==========
inc R7 ; incrementa el contador
clr TF0 ; este flag de desbordamiento se pone a ; Generación de una señal de 500hz en el pin P1.2
; este flag debe ser puesto a cero por ... software ; utilizando el timer 0

cjne R7,#2,espera_desborde ; selección de fecuencias


mov R7,#0 ; f1=500hz
cpl P1.2 ; complementa el pin 3 en el puerto 1 ; f2=1000hz
sjmp espera_desborde ; f3=4000hz
end ; usar el pin P1.2 utilizando el timer 2

org 0000h
; ==============================
salir:
; Generación de una señal de 4khz en el pin P1.2 jb P2.0,salir ; sw1=0
; utilizando el timer 0 jnb P2.1,salir; sw2=1
lcall frecuencia500hz
sjmp salir
org 0000h
mov TMOD,#02h ; configura el timer 0 en modo 2 como un frecuencia500hz:
; temporizador de 8 bits con autorecarga mov TMOD,#02h ; configura el timer 0 en modo 2 como un
MOV TH0,#131 ; valor de recarga ; temporizador de 8 bits con autorecarga
SETB TR0 ; inicia el timer cero mov TH0,#6 ; valor de recarga
setb TR0 ; inicia el timer cero
mov R7,#0 ; contador
espera_desborde:
espera_desborde:
jnb TF0,$ ; esto se repite mientras TF0 es cero y no hay
; desbordamiento jnb TF0,$ ; esto se repite mientras TF0 es cero y no hay
cpl P1.2 ; complementa el pin 3 en el puerto 1 ; desbordamiento
clr TF0 ; este flag de desbordamiento se pone a inc r7 ; incrementa el contador
; este flag debe ser puesto a cero por ... software clr TF0 ; este flag de desbordamiento se pone a hardware
; este flag debe ser puesto a cero por software

sjmp espera_desborde cjne r7,#4,espera_desborde


end mov R7,#0
cpl P1.2 ; complementa el pin 3 en el puerto 1
;; sjmp espera_desborde
=============================================== end

; Generación de una señal de 500hz en el pin P1.2


; utilizando el timer 0 FALTA

LABO 3
org 0000h
mov TMOD,#02h ; configura el timer 0 en modo 2 como un ;Selección de frecuencias
; temporizador de 8 bits con autorecarga ;de señales de 500hz, 1khz y 4khz
mov TH0,#6 ; valor de recarga ;en los pines P1.0 y P1.1
setb TR0 ; inicia el timer cero ;utilizando el timer 0
mov R7,#0 ; contador ;frecuencia del reloj: 11.0592Mhz

espera_desborde: ascbin equ 100h


binasc equ 109h
jnb TF0,$ ; esto se repite mientras TF0 es cero y no hay break equ 010ch ; a, (lee acumulador)
; desbordamiento inkey equ 012ah ; a
prthex equ 13fh mov TMOD,#80h ;configura el timer 0 en modo
prsphx equ 139h 2
crlf equ 115h ; como un temporizador de 8
endloop equ 2f0h bits con auto recarga
print equ 136h ;mov TH0,#27 ;valor de recarga
getbyt equ 11eh setb TR0 ;inicia el timer 0
getchr equ 121h mov R7,#0 ;contador
sndchr equ 148h loop1:
chkbrk equ 10fh lcall f1khz
display equ 11bh sjmp loop1

org 8000h ;El programa empieza en esta direcci¢n de otrafrecuencia1:


;de memoria cjne a,#3h,salir2
ejemplo: sjmp frec4khz
lcall print ;PRINT es una subrutina grabado en la salir2:
EPROM sjmp salir2
;se usa para imprimir mensajes en la frec4khz:
computadora. lcall print
db 0dh,0ah," M E N U " db 0dh,0ah,"FRECUENCIA SELECCIONADA: 1KHz"
db 0dh,0ah,"=========",0dh,0ah db 0dh,0ah,"==============================",
db 0dh,0ah," HECHO POR: C. Martin Cruz 0dh,0ah,0h
Salazar",0dh,0ah mov TMOD,#80h ;configura el timer 0 en modo
db 0dh,0ah," 01) FRECUENCIA: 30 HZ" 2
db 0dh,0ah," 02) FRECUENCIA: 10 HZ" ; como un temporizador de 8
db 0dh,0ah," 03) FRECUENCIA: 1 HZ",0dh,0ah bits con auto recarga
db 0dh,0ah," Seleccione numero hexadecimal: ",0 ;mov TH0,#141 ;valor de recarga
lcall getbyt setb TR0 ;inicia el timer 0
cjne a,#1h,salir mov R7,#0 ;contador
sjmp frec500hz loop2:
salir: lcall f4khz
sjmp otrafrecuencia sjmp loop2

frec500hz:
lcall print f500hz:
db 0dh,0ah,"FRECUENCIA SELECCIONADA: 30Hz" jnb TF0,$ ;esto se repite mientras TF0
db es cero y no hay
0dh,0ah,"==============================",0dh,0ah,0h ;desbordamiento
mov TMOD,#80h ;configura el timer 0 en modo inc R7 ;incrementa el contador
2 clr TF0 ;este flag de desbordamiento
; como un temporizador de 8 se pone a 1 por hardware,
bits con auto recarga ;este flag debe ser puesto a 0
;mov TH0,#1024 ;valor de recarga por software
setb TR0 ;inicia el timer 0 cjne R7,#4,f500hz ;R7 debe ser 4 para hacer el
mov R7,#0 ;contador complemento de P1.0 y P1.1
mov R7,#0
cpl P1.0
cpl P1.1 ;complementa el pin 2 en el
loop:
Puerto 1
lcall f500hz
ret
lcall inkey ;
f1khz:
lcall break ; termina programa si CTL-C
jnb TF0,$ ;esto se repite mientras TF0
sjmp loop
es cero y no hay
;desbordamiento
otrafrecuencia: inc R7 ;incrementa el contador
cjne a,#2h,salir1 clr TF0 ;este flag de desbordamiento
sjmp frec1khz se pone a 1 por hardware,
salir1: ;este flag debe ser puesto a 0
sjmp otrafrecuencia1 por software
frec1khz: cjne R7,#13,f1khz ;R7 debe ser 4 para hacer el
lcall print complemento de P1.0 y P1.1
db 0dh,0ah,"FRECUENCIA SELECCIONADA: mov R7,#0
10KHz" cpl P1.0
db cpl P1.1 ;complementa el pin 2 en el
0dh,0ah,"==============================",0dh,0ah,0h Puerto 1
ret
f4khz: lcall resetLCD4 ; duplicate power on reset
jnb TF0,$ ;esto se repite mientras TF0
es cero y no hay lcall print
;desbordamiento db "El reset del LCD fue completado",0
inc R7
clr TF0
lcall crlf
cjne R7,#132,f4khz
lcall getchr
mov R7,#0
lcall initLCD4 ; initialize fonts, #lines, Entry Mode
cpl P1.0
lcall print
cpl P1.1 ;complementa el pin 2 en el Puerto 1
db "inicio del LCD fue completado",0
;clr TF0
lcall crlf
ret
lcall getchr
end
lcall prtLCD4 ;pinta un mensaje en la pantalla LCD.
LABO 4

; poniendo datos en la RAM db "linea N = 2", 0


; constantes
LCD_DATA equ 090h ; puerto 1 es usado para datos
LCD_DB4 equ 094h ; high nibble del puerto 1(P1.4) es usado ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
para datos ; subrutinas
LCD_DB5 equ 095h ; high nibble del puerto 1(P1.5) es usado ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
para datos
LCD_DB6 equ 096h ; high nibble del puerto 1(P1.6) es usado ===============================================
para datos ; subrutina crShLf4
LCD_DB7 equ 097h ; high nibble del puerto 1(P1.7) es usado ; Esta rutina traslada el cursor a la izquierda. El numero de
para datos ; posiciones a ser trasladado es localizado en el acumulador.
LCD_RS equ 091h ; p1.1 LCD l¡nea Register Select ; entrada : acumulador indica numero de posiciones a trasladar
LCD_RW equ 092h ; p1.2 LCD l¡nea Read / Write ; salida : nada
LCD_E equ 093h ; p1.3 LCD l¡nea Enable ;
===============================================
;
;instrucciones del sistema crShLf4:
Config equ 28h ; 4 bits de datos, 2 lineas, 5 por 7 caracter jz ret_scl
matriz mov r0, #shLfCur ; palabra de control para trasladar a la
entryMode equ 6 ; incrementar cursor, no traslada display, izquierda
incremento acall wrLCDcom4
; autom tico del registro AC al escribir. dec acc
sjmp crShLf4
; instrucciones de control del cursor ret_scl: ret
offCur equ 0Ch
lineCur equ 0Eh ;
blinkCur equ 0Dh ===============================================
combnCur equ 0Fh ; subrutina crShRt4
homeCur equ 02h ;se coloca el cursor al principio ; Esta rutina traslada el cursor a la derecha. El numero de
;cursor al rinc¢n ; posiciones a ser trasladado es localizado en el acumulador.
shLfCur equ 10h ; entrada : acumulador indica el numero de posiciones a trasladar
shRtCur equ 14h ; salida : nada
;
; instrucciones de control del display ===============================================
clrDsp equ 01h ;Limpia el display(los contenidos son ;
borrados) crShRt4:
;borra display, cursor al rinc¢n, y pone el modo jz ret_scr
;de entrada en incrementar. mov r0, #shRtCur ; palabra de control para trasladar a la
offDsp equ 0Ah ;blanquea el display(display se apaga)no hay derecha
efecto acall wrLCDcom4
;de parpadeo y el cursor es visualizado dec acc
onDsp equ 0Eh ;Muestra mensaje en el display(el display se sjmp crShRt4
enciende) ret_scr: ret
shLfDsp equ 18h ;Desplazamiento del display a la izquierda
shRtDsp equ 1Ch ;Desplazamiento del display a la derecha ;
===============================================
org 8000h ; subrutina placeCur4
; Esta rutina fija la posicion del cursor. La posicion del cursor ;
; es localizado en el registro b. La posicion del cursor empieza ===============================================
; en 0. El acumulador da el numero de linea. ;
; entrada: acumulador indica el numero de linea (1, 2) dspShLf4:
; : el registro b sostiene la posicion del cursor jz ret_sdl
; salida : nada mov r0, #shLfDsp ; palabra de control para trasladar a la
=============================================== ; izquierda
; acall wrLCDcom4
placeCur4: dec a
dec acc ; acc=0 para linea=1 sjmp dspShLf4
jnz line2 ; si acc=0 luego primera lnea ret_sdl: ret
mov a, b
add a, #080h ; palabra de control para la linea 1 ;
sjmp setcur ===============================================
line2: ; subrutina dspShRt4
mov a, b ; Esta rutina traslada los contenidos del LCD a la derecha. El
add a, #0C0h ; palabra de control para la l¡nea 2 ; numero de caracteres a ser trasladados es localizado en el
setcur: ; acumulador.
mov r0, a ; localizar palabra de control ; entrada : acumulador indica el numero de caracteres a trasladar
acall wrLCDcom4 ; ; salida : nada
ret ===============================================
;
; dspShRt4:
=============================================== jz ret_sdr
=========== mov r0, #shRtDsp ; palabra de control para trasladar a
; subrutina setCGRAM4 ; la derecha
; Esta rutina fija la direccion del Character Generator RAM. El acall wrLCDcom4
; caracter [0..7] es localizado en el acumulador. La fila del font dec a
; es localizado en el registro b. Las instrucciones 40h a 7Fh sjmp dspShRt4
; selecciona las direcciones del CGRAM 0 to 3Fh (0 to 63 ret_sdr: ret
decimal).
; el font de 5x7 para el caracter es asumido. Esto es, cada posici¢n ;
del ===============================================
; caracter contiene una matriz de 40 puntos arreglados en 8 filas de ; subrutina wrLCDdata4
; 5 puntos cada uno. las 7 filas son para los caracteres y la 8va ; escribe un dato al LCD
; fila para el cursor debajo del caracter. Direcciones de CGRAM 0 ; el dato debe ser localizado en r0 para llamar el programa
corresponde ; ----------------------------------------------------
; a la primera fila del caracter 0, direccion 7 corresponde wrLCDdata4:
; al 8vo (ultima) fila del caracter 0, y direccion 3Fh clr LCD_E
; corresponde a la 8va fila del caracter 7. setb LCD_RS ; selecciona enviar Dato
; clr LCD_RW ; selecciona operaci¢n de escritura
; entrada : acumulador indica el c¢digo del caracter [0..7] push acc ; salva acumulador
; : el registro b sostiene fila del font [0..7] mov a, r0 ; pone byte de datos en el acc
; salida : nada
; mov c, acc.4 ; carga high nibble sobre el bus de datos
=============================================== mov LCD_DB4, c ; un bit a la vez...
; mov c, acc.5 ;
setCGRAM4: mov LCD_DB5, c
push b mov c, acc.6
mov b, #8 mov LCD_DB6, c
mul ab ; multiplica numero del caracter por 8 mov c, acc.7
pop b ; b sostiene numero de fila mov LCD_DB7, c
add a, b ; a holds CGRAM address
add a, #40h ; convert to instruction setb LCD_E ; pone a uno el pin Enable
mov r0, a ; place instruction clr LCD_E ; pone a cero el pin Enable
acall wrLCDcom4 ; issue command
ret mov c, acc.0 ; similarmente, carga el low nibble
; mov LCD_DB4, c
=============================================== mov c, acc.1
; subrutina dspShLf4 mov LCD_DB5, c
; Esta rutina traslada los contenidos del LCD a la izquierda. El mov c, acc.2
; numero de caracteres a ser trasladados es localizado en el mov LCD_DB6, c
; acumulador. mov c, acc.3
; entrada : acumulador indica el numero de caracteres a trasladar mov LCD_DB7, c
; salida : nada
acall pulseEwait4 ; pulsa el pin Enable... swap a
; y espera para que el Flag Busy aclare anl a, #0fh
pop acc add a, b
ret pop b
ret
;
=============================================== ;
; subrutina wrLCDcom4 ===============================================
; escribe una palabra de comando al LCD ; subrutina pulseEwait4
; comando debe estar localizado en r0 para llamar el programa ; genera un pulso positivo en la l¡nea enable del LCD.
; ---------------------------------------------------- ; espera para que el Flag Busy aclare(0 l¢gico) antes de retornar.
wrLCDcom4: ; entrada : nada
clr LCD_E ; salida : nada
clr LCD_RS ; selecciona enviar comando ; destruye : LCD_RW, LCD_RS, LCD_DATA
clr LCD_RW ; selecciona operaci¢n de escritura ;
push acc ; salva el acumulador ; ----------------------------------------------------
mov a, r0 ; pone el byte de datos en el acc pulseEwait4:
clr LCD_E
mov c, acc.4 ; carga el high nibble en el bus de datos setb LCD_E ; se genera un pulso en la l¡nea Enable
mov LCD_DB4, c ; un bit a la vez usando... clr LCD_E
mov c, acc.5 ; operaciones de mover bit
mov LCD_DB5, c mov LCD_DATA, #0ffh ; prepara puerto para entrada
mov c, acc.6 setb LCD_RW ; prepara R/W para operaci¢n de lectura
mov LCD_DB6, c push acc ; salva contenidos del acumulador
mov c, acc.7 pEw:
mov LCD_DB7, c setb LCD_E ; empieza el pulso Enable
mov a, LCD_DATA ; read el estado del nibble
setb LCD_E ; pulsa la l¡nea Enable clr LCD_E ; finaliza pulso Enable
clr LCD_E setb LCD_E ;
clr LCD_E
mov c, acc.0 ; similarmente, carga el low nibble jb acc.7, pEw ; lazo mientras el Flag Busy es 1 l¢gico
mov LCD_DB4, c pop acc ; recarga el acumulador
mov c, acc.1 ret
mov LCD_DB5, c
mov c, acc.2 ;
mov LCD_DB6, c ===============================================
mov c, acc.3 ; subrutina initLCD4 - inicializa el LCD
mov LCD_DB7, c ; ----------------------------------------------------
initLCD4:
acall pulseEwait4 ; pulsa la l¡nea Enable... clr LCD_RS ; LCD linea de Register Select
; y espera para que el Busy Flag aclare clr LCD_RW ; linea de Read / Write
pop acc clr LCD_E ; linea de Enable
ret
mov r0, #Config ; Function Set - data bits, lines, fonts
; acall wrLCDcom4
===============================================
; subrutina rdLCDstat4 mov r0, #onDsp ; Enciende el display
; Lee el byte de estado (Flag Busy y Contador de direcci¢n) acall wrLCDcom4
; el byte de estado es retornado en el acumulador
; entrada : nada mov r0, #entryMode ; fijar Entry Mode
; salida : byte de estado en el acumulador acall wrLCDcom4 ; incrementar cursor a la derecha, no traslada
; ---------------------------------------------------- el display
rdLCDstat4:
push b mov r0, #clrDsp ; aclara el display, home cursor
mov LCD_DATA, #0ffh ; prepara puerto para entrada de datos lcall wrLCDcom4
setb LCD_RW ; prepara R/W para operaci¢n de lectura ret
; uno l¢gico es lectura y cero l¢gico es escritura
setb LCD_E ; empieza el pulso Enable ;
mov a, LCD_DATA ; lee el estado high nibble ===============================================
clr LCD_E ; finaliza el pulso Enable ; subrutina resetLCD4 - resetea el LCD
anl a, #0f0h ; version de software del power on operacion de reset
mov b, a ;
setb LCD_E ; empieza el pulso Enable ; ----------------------------------------------------
mov a, LCD_DATA ; lee el estado low nibble resetLCD4:
clr LCD_E ; finaliza el pulso Enable clr LCD_RS ; linea Register Select envio un cero
clr LCD_RW ; linea Read / Write envio un cero prtLCD4:
clr LCD_E ; linea Enable envio un cero pop dph ; regresa direcci¢n de retorno en dptr
;setb LCD_E pop dpl
prtNext:
;envio como dato:0011 clr a ; set offset = 0
clr LCD_DB7 ; movc a, @a+dptr ; consigue chr de la memoria de c¢digo
clr LCD_DB6 ; cjne a, #0, chrOK ; si chr = 0 entonces retorna
setb LCD_DB5 sjmp retPrtLCD
setb LCD_DB4 chrOK:
; paso 1 mov r0, a
;habilito el display acall wrLCDdata4 ; enviar caracter
setb LCD_E ; empieza pulso Enable inc dptr ; apuntar al siguiente caracter
clr LCD_E ; finaliza pulso Enable ajmp prtNext ; lazo hasta que finalize la cadena
mov a, #4 ; retardo de 4 milisegundos retPrtLCD:
; mov a, #8 mov a, #1h ; apunta a la instrucci¢n despu‚s de la
acall mdelay cadena
; paso 2 jmp @a+dptr ; retorno con una instrucci¢n de salto
setb LCD_E ; empieza pulso Enable
clr LCD_E ; finaliza pulso Enable ;
mov a, #1 ; retardo de 1 milisegundo ===============================================
;mov a, #2 ; subrutina sdelay - retardo de un segundo
acall mdelay ; entrada : nada
; paso 3 ; salida : nada
setb LCD_E ; empieza pulso Enable ; destruye : nada - usa a
clr LCD_E ; finaliza pulso Enable ; ----------------------------------------------------
mov a, #1 ; retardo de 1 milisegundo ; 100h-91h=6fh=(111)decimal
; mov a,#2 ; 9008 * 111 = 999888
acall mdelay ; mas 102 del segundo lazo
; mas 8 da 999998 microsegundos
clr LCD_DB4 ; specify 4-bit operation ;
; step 4 ; microsegundos (ciclos)
setb LCD_E ; start Enable pulse ; -----------------------
clr LCD_E ; end Enable pulse sdelay: push acc ; 2.17
mov a, #1 ; delay 1 millisecond mov a, #91h ; 1.085
; mov a, #2
acall mdelay sd_olp: inc a ;\
acall mdelay ; |
;configura el display acall mdelay ; |
mov r0, #Config ; FUNCTION SET acall mdelay ; |
acall wrLCDcom4 acall mdelay ; |
acall mdelay ; |
mov r0, #08h ; display off acall mdelay ; |
acall wrLCDcom4 acall mdelay ; |- el lazo toma 9008 microsegundos
acall mdelay ; |
mov r0, #1 ; clear display, home cursor acall mdelay ; |
acall wrLCDcom4 nop ;|
nop ;|
mov r0, #entryMode ; set ENTRY MODE nop ;|
acall wrLCDcom4 nop ;|
ret nop ;|
jnz sd_olp ; /
;
=============================================== mov a, #33h ; 1.085
; subrutina prtLCD4 sd_ilp: djnz acc, sd_ilp ; -el lazo toma 2*33h=66h=(102)dec
; Toma la cadena inmediatamente que sigue a la llamada a esta
; subrutina y lo displaya sobre el LCD. La cadena es leida con la pop acc ; 2.17
; instrucci¢n mov a, @a+dptr ret ; 2.17
; de este modo, la cadena esta en la memoria de datos. ;
; ===============================================
; entrada : nada =====
; salida : nada ; subrutina mdelay - retardo de 1 milisegundo
; destruye : acc, dptr ; retardo para 998 microsegundos - 2 microsegundos son
; ; reservados para la llamada a esta rutina.
=============================================== ; intrada : nada
; ; salida : nada
; destruye : nada - usa a
; ---------------------------------------------------- ; necesita para esperar 998 microsegundos mas
; 100h-a6h=5ah=(90)decimal
; 90 * 11 = 990 mov a, #0a6h ; 1
; mas 8 da 998 microsegundos
; d_lp2: inc a ; 1 \
; microsegundos (ciclos) nop ; 1 |
; ----------------------- nop ; 1 |
mdelay: push acc ; 2 nop ; 1 |
mov a, #0a6h ; 1 nop ; 1 |
nop ; 1 |- 11
md_olp: inc a ; 1 \ nop ; 1 | cycles
nop ; 1 | nop ; 1 |
nop ; 1 | nop ; 1 |
nop ; 1 | jnz d_lp2 ; 2 /
nop ; 1 | nop ; 1
nop ; 1 |- 11 ciclos nop ; 1
nop ; 1 | nop ; 1
nop ; 1 | nop ; 1
nop ; 1 | nop ; 1
jnz md_olp ; 2 / ret ; 2

nop ; 1 ;
pop acc ; 2 ===============================================;
ret ; 2 subrutina getchr
; ; esta rutina lee un caracter desde el puerto serie y lo salva
=============================================== ; en el acumulador.
; subrutina delay - retardo de 1 milisegundo ;===============================================
; el acumulador sostiene tiempo en milisegundos para el retardo getchr:
; - 2 microsegundos son reservados para la llamada jnb ri, getchr ; espera hasta que el caracter sea recivido
; a esta rutina. mov a, sbuf ; consigue el caracter
; entrada : milisegundos para retardo en el acumulador anl a, #7fh ; vuelve a cero el octavo bit
; salida : nada clr ri ; limpia el bit de estado serial
; destruye : nada - usa a ret
; ----------------------------------------------------
; 100h-a6h=5ah=(90)decimal ;===============================================
; 90 * 11 = 990 ; waitKey es una rutina util que imprime el mensaje
; mas 10 da 1 millisecond ; "presione una tecla para continuar" y luego espera hasta que
; ; un caracter sea recivido.
; microsegundos (ciclos) ;===============================================
; ----------------------- waitKey:
delay: lcall print
dec a ; 1 db "presione una tecla para continuar", 0
lcall crlf
d_olp: lcall getchr ; espera hasta que se presione una tecla
push acc ; 2 \ ret
mov a, #0a6h ; 1 |
; | ;===============================================
d_ilp: inc a ; 1 \ | ; subrutina crlf
nop ; 1 | | ; crlf envia un carriage return y line feed fuera del puerto serie
nop ; 1 | | ;===============================================
nop ; 1 | | crlf:
nop ; 1 | | mov a, #0Dh ; print cr
nop ; 1 |- 11 | (acc-1) lcall sndchr
nop ; 1 | cycles |- msec cret:
nop ; 1 | | mov a, #0Ah ; print lf
nop ; 1 | | lcall sndchr
jnz d_ilp ; 2 / | ret
; | ;===============================================
nop ; 1 | ; subroutine sndchr
nop ; 1 | ; esta rutina toma el caracter en el acc y lo envia fuera del
nop ; 1 | ; puerto serie.
pop acc ; 2 | ;===============================================
; | sndchr:
djnz acc,d_olp ; 2 / clr scon.1 ; clear the tx buffer full flag.
mov sbuf,a ; pone el caracter en sbuf mov r0,#offcur ;no se ve el cursor
txloop: lcall wrlcdcom4
jnb scon.1, txloop ; espera hasta que el caracter es enviado lcall sdelay
ret mov r0,#35h
lcall wrLCDdata4
; mov r0,#shlfcur
===============================================; lcall wrlcdcom4
subrutina print mov r0,#offcur ;no se ve el cursor
; print takes the string immediately following the call and lcall wrlcdcom4
; sends it out the serial port. the string must be terminated lcall sdelay
; with a null. this routine will ret to the instruction mov r0,#36h
; immediately following the string. lcall wrLCDdata4
;=============================================== mov r0,#shlfcur
print: lcall wrlcdcom4
pop dph ; put return address in dptr mov r0,#offcur ;no se ve el cursor
pop dpl lcall wrlcdcom4
prtstr: lcall sdelay
clr a ; set offset = 0 mov r0,#37h
movc a, @a+dptr ; get chr from code memory lcall wrLCDdata4
cjne a, #0h, mchrok ; if chr = ff then return mov r0,#shlfcur
sjmp prtdone lcall wrlcdcom4
mchrok: mov r0,#offcur ;no se ve el cursor
lcall sndchr ; send character lcall wrlcdcom4
inc dptr ; point at next character lcall sdelay
sjmp prtstr ; loop till end of string mov r0,#38h
prtdone: lcall wrLCDdata4
mov a, #1h ; point to instruction after string mov r0,#shlfcur
jmp @a+dptr ; return lcall wrlcdcom4
;=============================================== mov r0,#offcur ;no se ve el cursor
;Subrutina segs0_a_9 de display LCD para cuenta en segundos lcall wrlcdcom4
;Visualizacion de Segundos desde 0 a 9. lcall sdelay
;=============================================== mov r0,#39h
segs0_a_9: lcall wrLCDdata4
mov r0,#30h ;mov r0,#shlfcur
lcall wrLCDdata4 ;lcall wrlcdcom4
mov r0,#shlfcur mov r0,#offcur ;no se ve el cursor
lcall wrlcdcom4 lcall wrlcdcom4
mov r0,#offcur ;no se ve el cursor lcall sdelay
lcall wrlcdcom4 ret
lcall sdelay
mov r0,#31h end
lcall wrLCDdata4
mov r0,#shlfcur
lcall wrlcdcom4
mov r0,#offcur ;no se ve el cursor
lcall wrlcdcom4
lcall sdelay
mov r0,#32h
lcall wrLCDdata4
mov r0,#shlfcur
lcall wrlcdcom4
mov r0,#offcur ;no se ve el cursor
lcall wrlcdcom4
lcall sdelay
mov r0,#33h
lcall wrLCDdata4
mov r0,#shlfcur
lcall wrlcdcom4
mov r0,#offcur ;no se ve el cursor
lcall wrlcdcom4
lcall sdelay
mov r0,#34h
lcall wrLCDdata4
mov r0,#shlfcur
lcall wrlcdcom4

Das könnte Ihnen auch gefallen