Beruflich Dokumente
Kultur Dokumente
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
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
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
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
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
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