You are on page 1of 10

El Microprocesador 8051 CAP 5

_________________________________________________________________________
ITMAR, Mazatln 47 Ing. Rufino J. Domnguez Arellano

CAPITULO 5


Introduccin a la Programacin en Lenguaje
Ensamblador.

5.1. INTRODUCCION

Se entiende por modelo de programacin al conjunto de registros accesibles por el
usuario que junto al set de instrucciones y los modos de direccionamiento
constituyen las herramientas imprescindibles para el programador.

El objetivo de este captulo es mostrar estos tres aspectos combinados en varios
ejercicios que puedan servir de ayuda al comienzo. Estos ejercicios corresponden
a algunos de los modelos estn dar que suelen ser habituales en las operaciones
de control de procesos industriales pero no tienen el suficiente rigor como para
poder ser incorporadas dentro de una librera de rutinas operativas
profesionalmente; ms bien tienen un sentido didctico, objetivo principal de este
captulo.

A continuacin se proponen una serie de ejercicios, que irn distribuidos entre
este captulo y el siguiente. En total, 13 ejercicios que pueden servir de aperitivo;
por esta razn, casi todos los nombres de los archivos de los ejercicios figuran con
un nmero terminal, para que el lector pueda mejorarlos, como si de una nueva
versin se tratara.

Ejercicio 5.1. Estructura condicional o alternativa

Habitualmente el programa tiene que tomar decisiones en funcin del contenido de
una variable (posicin de memoria), de la informacin de un puerto de entrada o
salida y/o del estado de un bit o registro. Se produce lo que se conoce por una
bifurcacin condicional o alternativa.

En este ejercicio se trata de realizar la operacin suma o resta de dos variables
DA1 (78H) y DA2 (79H); si la localidad CHE (77H) es cero, suma el contenido de
DA1 y DA2; si el contenido es distinto de cero, entonces resta DA1 de DA2. En
cualquier caso, el resultado de la operacin suma o resta se deposita en la
localidad RES (7AH).


El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 48 Ing. Rufino J. Domnguez Arellano


%TITLE "ESTRUCTURA CONDICIONAL ECON0.ASM"
;
ORG 0200H
;
CHE EQU 77H
DA1 EQU 78H
DA2 EQU 79H
RES EQU 7AH
MOV DA1, #09H
MOV DA2, #06H ; CARGA DE DATOS
MOV A, CHE ; LEE LA LOCALIDAD 77H
JNZ SAL1 ; SI ES CERO SUMA, SI NO SALTA A RESTA
MOV A, DA1
ADD A, DA2 ; HACE LA SUMA
MOV RES, A ; GUARDA RESULTADO
MOV A, CHE
JZ SAL2
SAL1: MOV A, DA1
SUBB A, DA2 ; HACE LA RESTA
MOV RES, A ; GUARDA RESULTADO
SAL2: NOP
;
END


Ejercicio 5.2.- Estructura Iteractiva. Al menos una vez.

Enunciado
La localidad MEM (77H) puede contener nmeros comprendidos entre 1 y 9,
teniendo en cuenta esta caracterstica, poner las posiciones de memoria
comprendidas entre 61 H y 69H a FFH (todos los bits a uno), segn esta relacin:

Si MEM=1 cargar con FFH la localidad 61H
Si MEM=2 cargar con FFH las localidades 61H y 62H
Si MEM=3 cargar con FFH las localidades 61H, 62H y 63H
=========================================
Si MEM=9 cargar con FFH las localidades de la 61H ala 69H











El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 49 Ing. Rufino J. Domnguez Arellano

%TITLE ESTRUCTURA ITERATIVA. ITERAO.ASM
;
ORG 0200H
;
MEM EQU 778
CON EQU 78H
MOV CON, MEM ; Se transfiere el contenido de MEM a CON
SAL: MOV A, CON ; Cargar acumulador
ADD A, #60H ; Prepara el dir. indexado por software
MOV R0, A ; Carga el puntero
MOV @R0, # FFH ; Carga la localidad correspondiente
; Por lo menos carga una posicin
; de memoria
DJNZ CON, SAL ; Decrementa CON y salta si CON

; no es CERO
NOP
END


Ejercicio 5.3.- Estructura iteractiva. Puede que ninguna vez.


%TITLE ESTRUCTURAITERATIVA. ITERA1.ASM
;
ORG 0200H
;
MEM EQU 77H
CON EQU 78H
MOV CON, MEM ; Se transfiere el contenido de MEM a CON
SALO: MOV A, CON ; Cargar acumulador
JZ SAL1 ; No efecta ninguna accin si MEM=O
ADD A, #60H ; Prepara el dir. indexado por software
MOV RO, A ; Carga el puntero
MOV @RO, #FFH ; Carga la localidad correspondiente
DEC CON ; Decrementa CON
JMP SALO ; Salto incondicional
SAL1: NOP
END


Ejercicio 5.4.-Comprobacin de bits. Mtodo general

La operacin de comprobacin de bits es una prctica habitual en el control de
procesos. La secuencia del programa puede cambiar dependiendo del estado de
un bit. Este ejercicio muestra uno de los mtodos.



El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 50 Ing. Rufino J. Domnguez Arellano
Enunciado

Si el bit 2 de la localidad 28H (CHE) es igual a cero, entonces en la direccin 7FH
(RES) se sealar poniendo todos sus bits a cero, y si el bit 2 es igual a uno, se
sealar poniendo todos sus bits a uno. Es decir:

28.2 = 0 implica que: (7FH) 00H
28.2 = 1 implica que: (7FH) FFH


%TITLE TESTEO DE BITS. TESBITO.ASM
;
ORG 0200H
;
CHE EQU 28H
RES EQU 7FH
MOV A, CHE ; Se carga el ACC con el byte a chequear
ANL A, #04H ; Se detecta el bit.
JZ SAL0 ; Si es igual a CERO salta
MOV RES, #FFH ; Si no es igual a CERO, carga RES con unos
SALO: JNZ SALl ; ...y sale del proceso
MOV RES, #00 ; Si es igual a CERO. carga RES con ceros
SAL1: NOP
END



Ejercicio 5.5. Comprobacin de bits. Mtodo particular.


Cuando se estudiaba el set de instrucciones del 8052/8051, en el Apartado 4.1.
lnstrucciones booleanas, se deca que haba una zona de memoria interna
direccionable bit a bit (20H a 2FH) y una serie de instrucciones que permitan esta
forma de proceso (vase Tabla 4.2). Esta prctica es una muestra de este tipo de
instrucciones.

El problema es el mismo que el planteado en el ejercicio anterior, pero con la
salvedad de utilizar el carry como variable referencia! para establecer las
bifurcaciones.


%TITLE TESTEO DE BITS. TESBIT1.ASM
;
ORG 0200H
;
CHE EQU 28H
RES EQU 7FH
SETB C ; Se pone el "flag del Carry" a UNO
ANL C, CHE.2 ; Se detecta el bit 28.2 o 42
El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 51 Ing. Rufino J. Domnguez Arellano
JNC SALO ; Si es igual a CERO salta
MOV RES. # FFH ; Si no es igual a CERO, carga RES con unos
SALO: JC SALl ; ...y sale del proceso
MOV RES, #00 ; Si es igual a CERO, carga RES con ceros
SAL1: NOP
END


Ejercicio 5.6. Comprobacin de bytes con la operacin resta o
sustraccin


En el control de procesos industriales la informacin que se recibe o enva es
compleja y necesita de varios bits. En este caso, la informacin ocupar 8 bits, es
decir, 1 byte.

Este ejercicio, como los dos siguientes, corresponden al mismo planteamiento,
pero utiliza procedimientos distintos de resolucin. As, este ejercicio emplea la
operacin resta o sustraccin para detectar el byte que desencadena una
secuencia de proceso distinta.

En este y en los dos siguientes ejercicios el byte clave es 63H. Si el byte ledo en
la direccin 70H (CHE), es igual a 63H, pone el bit cero (b0) de la localidad 20H
(RES) a cero, y si el byte ledo es distinto a 63H, el bit cero (b0) de RES se pone a
uno, es decir:

Si (70H) = 63H implica que 20.0 0
Si (70H) <> 63H implica que 20.0 1



%TITLE TESTEO DE BYTES. TESPAL0.ASM
;
ORG 0200H
;
CHE EQU 70H
RES EQU 20H
MOV A, 7OH ; Se CARGA el ACC con la localidad a
; chequear.
CLR C ; Se pone el carry a 0
SUBB A, #63H ; Resta de localidad CHE la constante #63H
JZ SALO ; Si es igual a CERO salta
SETB RES.0 ; Si no es igual a CERO, carga con" 1'
; el bit0 del byte RES
SAL0: JNZ SALl ; ...y sale del proceso
CLR RES.0 ; Si es igual a CERO, carga con "0" el
; bit0 del byte RES
SAL1: NOP
END

El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 52 Ing. Rufino J. Domnguez Arellano



Ejercicio 5.7. Comprobacin de bytes con la operacin EXCLUSIVE-OR


El enunciado de este ejercicio es el mismo que el apartado anterior, pero
el procedimiento para la deteccin del byte que desencadena un cambio en
el proceso se realiza con la operacin EXCLUSIVE-OR (XRL). Efectivamente,
si:

0 1 1 0 0 0 1 1 = LECTURA BYTE
0 1 1 0 0 0 1 1 = REFERENCIA: 63H

0 0 0 0 0 0 0 0 = RESULTADO

El resultado de la operacin ser cero, slo si coinciden el byte ledo y
el byte de referencia.


Si los bytes difieren al menos en un bit, comoen el siguiente ejemplo:


0 l 1 0 0 0 1 0 = LECTURA BYTE
0 1 l 0 0 0 1 1 = REFERENCIA: 63H
0 0 0 0 0 0 0 l = RESULTADO


%TITLE TESTEO DE BYTES. TESPAL1.ASM
;
ORG O2OOH
;
CHE EQU 7OH
RES EQU 2OH
MOV A, 7OH ; Se CARGA el ACC con la localidad a
; chequear
XRL A, #63H ; Operacin EX-OR entre ACC y la cte. #63H
JZ SALO ; Si el resultado es igual a CERO salta
SETB RES.O ; Si no es igual a CERO, carga con" 1"
; el pitO del byte RES
SALO: JNZ SALl ; ...y sale del proceso
CLR RES.O ; Si es igual a CERO, carga con "O" el
; bitO del byte RES
SAL1: NOP
END




El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 53 Ing. Rufino J. Domnguez Arellano
Ejercicio 5.8. Comprobacin de bytes con la instruccin especial


Los ejercicios 5.6 y 5.7 pueden ser resueltos tambin con macroinstrucciones
como CJNE A,<byte>,rel estudiada en el apartado 4.2.2,<lnstrucciones de salto
condicional>.

Esta instruccin compara y salta si el resultado no es igual y su utilidad se puede
ver a continuacin.
La eficacia de estas macroinstrucciones puede verse amenazada por la falta de
flexibilidad, pero se puede fcilmente comprender que en este caso, que es
habitual, resulta muy eficaz, por lo que es ventajosa su inclusin en el set de
instrucciones.
%TITLE TESTEO DE BYTES. TESPAL2.ASM
;
ORG O2OOH
;
CHE EQU 7OH
RES EQU 2OH
MOV A, CHE ; Se carga ACC con el contenido de la
; variable CHE
CJNE A, #63H, SAL0 ; Compara el contenido del ACC con el
;dato #63H y salta a SALO. Si (ACC) es
; distinto de # 63H
CLR RES.O ; En el caso de que sean iguales, pone el
; bitO de la localidad 2OH a "CERO..
JMP SALl : ...y salta al final
SALO: SETB RES.O ; Si no es igual a CERO, carga con " I " el
; bitO de la localidad 2OH y finaliza
SAL1: NOP
END


Ejercicio 5.9.Movimiento de tablas de datos en la memoria externa.


En el control de procesos se producen prcticas habitua]es de manipulacin de
datos, que el programador debe convertir, gracias a su tcnica e ingenio, en
rutinas eficaces. As, el programador deber elaborar rutinas para:

El movimiento de datos de una posicin a otra de memoria.
Captura y seleccin de datos del exterior a travs de una unidad de E/S y
su colocacin en memoria.
Bsqueda y seleccin sobre tablas de datos, etc.

Este apartado y el siguiente proponen ejercicios de proceso sobre bloques de
datos. Para estas rutinas los 8052/8051 cuentan con unas instrucciones muy
potentes que van a ser analizadas.
El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 54 Ing. Rufino J. Domnguez Arellano

Este ejercicio copia de una posicin a otra de la memoria RAM externa un bloque
de datos. Estos bloques, para simplificar el problema, son de tamao fijo, de una
pgina de 256 bytes, y comienzan en el primer byte de la pgina seleccionada.
As, en nuestro caso, si se quiere copiar un bloque de datos situado en las
direcciones 0315H a 0380H (pgina 03H), a la pgina 05H, se copiara todo el
contenido de la pgina 03 (0300H a 03FFH) a la pgina 5 (0500H a 05FFH) y el
bloque de datos situado inicialmente en las localidades 0315H a 0380H se
encontrar copiado en las localidades 0515H a 0580H.

A continuacin se muestra el listado del programa fuente, tal como se ha previsto.
Se invita al usuario a que realice una versin mejorada, indicando el rango de las
direcciones acopiar (direccin inicial a direccin final) y la direccin de la primera
localidad destino, incluso por encima del rango de una pgina de 256 bytes.


%TITLE MOVIMIENTO DE TABLAS. MOTABLAO.ASM
;
ORG O2OOH
;
; RO es el puntero que recorre las pginas
; Rl es la pgina FUENTE
; R2 es la pgina DESTINO
;
MOV RO, #OOH ; Inicializa el puntero
SALO: MOV DPL, RO ; Carga RO en el byte bajo del DPTR
MOV DPH, Rl ; Carga R l en el byte alto del DPTR
; (FUENTE)
MOVX A, @DPTR ; Lee byte apuntado por DPTR
MOV DPH, R2 ; Carga el byte alto del DPTR
; (DESTINO)
MOVX @DPTR, A ; Escribe byte apuntado por DPTR
INC RO ; Incrementa puntero
MOV A, RO ; Carga el ACC para la siguiente instruccin
JNZ SALO ; Busca el siguiente byte en la pgina
; y si es CERO concluye porque ha
; terminado la pgina
NOP
END


Ejercicio 5.10. Comprobacin de tablas de datos


En algunas ocasiones interesa conocer, para hacer un estudio estadstico, la
cantidad de veces que aparece un determinado dato y en qu posicin de la tabla
de datos se encuentra localizado.


El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 55 Ing. Rufino J. Domnguez Arellano
Este ejercicio muestra cmo se realiza esta operacin dentro de la memoria de
programas de 8K, pudiendo hacer lo mismo en la memoria RAM externa o interna
de los 8052/8051, naturalmente, habr que hacer referencia a las instrucciones
correspondientes, pues claramente se resaltaron en el estudio del set de
instrucciones en el Apartado 3.7.1, la Transferencia de datos sobre la RAM
interna, en el Apartado 3.7.2, la Transferencia de datos sobre la RAM externa,
y en el Apartado 3.7.3, Memoria de programas para el tratamiento de tablas.

Concretamente este ejercicio trata de buscar un determinado dato, 23H, en una
tabla cuyo rango es 0300H a 03FFH. Los resultados que se han de indicar son el
nmero de veces que ha sido encontrado y la posicin de memoria en que se
encuentran estos datos.


R2 = nmero de veces
A partir de la localidad 60 = situacin



%TITLE CHEQUEO DE TABLAS DE DATOS. CHEQUEO.ASM
;
ORG O2OOH
;
POS EQU 6OH
MOV RO, #POS ; Apunta el comienzo de la tabla
; de las localidades en las que
; se van a localizar los caracteres
MOV R2, #OOH ; Se inicializa R2 con O.
; Contador de carcter
MOV Rl, #OOH ;Se inicializa R1 con O.
; Contador de tablas
MOV DPTR, #O2FFH ; Se inicializa DPTR con el
; comienzo de la tabla
SALO: INC DPTR ; Se busca otro carcter
MOV Rl, DPH
CJNE Rl, #O3H, SALl ; Si se termina la tabla 03xx sale
; del proceso
MOV A, #OOH ; El ACC se borra para la
; prxima instruccin
MOVC A, @A+DPTR ; Se LEE el carcter y se carga en el ACC.
CJNE A, #23H, SALO ; Si el carcter no es *23H busca
; siguiente
INC R2 ; Si el carcter es * 23H incrementa
; contador
MOV @RO, DPH ; Apunta direccin (H) localizacin carcter
INC RO
MOV @RO, DPL ; Apunta direccin (L) localizacin carcter
INC RO
JMP SALO ; Busca otro carcter para evaluar
SAL1: NOP
END


El Microprocesador 8051 CAP 5
_________________________________________________________________________
ITMAR, Mazatln 56 Ing. Rufino J. Domnguez Arellano
Ejercicio 5.11. Gestin de la pila y rotaciones

Finalmente, para terminar con este apartado dedicado al modelo de programacin
del 8052/8051 se dedica un ejercicio al manejo de las instrucciones de acceso a la
memoria de pila ya las rotaciones.

A la pila, como se puede ver en este ejercicio, no solamente la gestiona el
microcontrolador, de una forma automtica, para salvar los registros importantes
en los saltos a las subrutinas e interrupciones, si no que tambin puede y debe ser
utilizada y gestionada por el programador. En este ejercicio, que por otro lado no
tiene otras pretensiones que demostrar estas instrucciones, se ha situado la zona
reservada a la pila en otra zona de la memoria interna, distinta a la que por defecto
y despus de un RESET el microcontrolador posiciona. Como se recordar, en el
captulo 2, apartado 2.6, se deca que despus de un RESET el microcontrolador
situaba .el comienzo de la pila en la direccin 08H. En este ejercicio, como se
puede ver en la primera instruccin del programa, la pila se ubica a partir de la
direccin 40H y en sentido creciente.

El ejercicio planteado pretende que un dato como 01H realice una rotacin
completa y que finalice en la misma posicin con la que empez, dicho de otra
manera, que el contenido del b0 se desplace a la Izquierda sobre el registro para
despus de varios desplazamientos concluya en la misma posicin. Para esta
operacin es preciso efectuar como se comprobar, 8 rotaciones bit a bit>.

%TITLE GESTION DE LA PILA Y ROTACIONES. ROTAO.ASM
;
ORG O2OOH
;
REF EQU 7OH
ROT EQU 6FH
MOV SP, #4OH ; Inicializacin de la pila en rea
;SCRATCHPAD
MOV A, #OOH ; Carga del ACC con OOH
PUSH A ; Se guarda en la pila. Inicializacin
; del CONTADOR
MOV REF, #OlH ; Se inicializa el registro de REFERENCIA
MOV ROT, REF ; Se inicializa el registro de ROTACION
MOV A, ROT ; Se carga el ACC con el valor de ROT
SALO: RL A ; Rotacin a la izda. del ACC
MOV ROT, A ; Se salva el contenido de ACC una vez
; rotado
POP A ; Recupera valor contador. El ACC
; es ahora contador
INC A ; Incrementa CONTADOR
PUSH A ; Guarda contador en la PILA
MOV A, ROT ; Recupera el dato rotado
CJNE A, REF, SALO ; Compara ACC con REF para salir
; del programa cuando sean iguales
NOP
END

You might also like