Microcontroladores.
Unidad 1
Contenido:
1 Portada.
2 Temario.
3 Manual del Curso.
4 Anexos
Curso de Microcontroladores I
Tiempo aproximado
q 40 Horas
Número de prácticas
q Teoría: 25 hrs.
q Práctica: 15 hrs.
Practicas
Interrupciones.
• Introducción.
• Tipos de Interrupciones.
• Proceso de interrupción en los Microcontroladores.
• Niveles de prioridad.
• Interrupciones externas. (INT0 ) e (INT1 )
• Interrupciones internas producidas por Timer 0 y1.
Temporizadores y Contadores.
• Introducción
• Timer 0 (T0) y Timer 1 (T1).
• Temporizador/Contador de 13 y 16 bit, arranque por software.
• Programas.
El microprocesador de 8 bits
Figura 1.8
CPU
Memory Rom
In/Out Port.
Memory Ram
Figura 1.1
Central Processing Unit. El CPU es el corazón de toda µC, es el encargado de decodificar las
instrucciones, hacer más eficientes las operaciones aritméticas, y controlar algunas otras
partes de la maquina. Cuenta con cuatro partes básicas que hace los “verdaderos cómputos”.
(1) Decodificador
Acumulador. (ACC) de Instruccion (2)
(4) Unidad
Reg de Instrucción. Aritmetica.
Timing and y Logica.
Contador del Programa Control.
(3) (ALU)
(1) Los Registros: Son localizaciones que sirven para almacenar temporalmente datos,
pueden ser de 8 o de 16 bits. Los tres registros más usados son, el acumulador para
propósito general, el contador de programa y el registro de instrucciones que son de
propósito específico. El acumulador almacena temporalmente el resultado de las
operaciones aritméticas y lógicas. El registro de Instrucciones es usado para almacenar la
instrucción que se está ejecutando en ese momento por el microprocesador. El contador de
Programa contiene la dirección de la siguiente instrucción del programa.
(3) El Circuito de temporizador y control: Es una red secuencial que acepta un código
que define la operación que se va a ejecutar y luego prosigue a través de una secuencia de
estados, generando una correspondiente secuencia de señales de control. Estas señales de
control incluyen el control de lectura - escritura y señales de dirección de memoria válida en
el bus de control del sistema. Otras señales generadas por el controlador se conectan a la
unidad aritmética - lógica y a los registros internos del procesador para regular el flujo de
información en el procesador y a, y desde, los buses de dirección y de datos del sistema.
C P U ( µP)
Memory Rom
Amplificador Drive
and Circuit.
A/D Converter.
1 celda.
Otras letras ó otros tipos de información requieren otros tipos de combinación. La
mayoría de los microprocesadores almacenan instrucciones y datos en grupos de 8 bits (1
Byte). Para almacenar más de una letra es necesario más de un byte. Add.
0 1 0 0 1 0 0 1 =I 105
0 1 0 1 0 1 0 0 =T 106
0 1 0 0 1 1 1 0 =N 107
Cada byte almacenado en memoria tiene una dirección. Por ejemplo ITN puede estar
almacenado en las direcciones 105 a 107. Los µP son capaces de direccionar 65,536 bytes.
Figura 1.9
Figura 1.10
Figura 1.11
PUERTO 0(P0): Se encarga de multiplexar en el tiempo por sus 8 líneas la parte baja del
Bus de direcciones durante el acceso a la memoria externa, y el Bus de datos.
PUERTO 1(P1): Este puerto además de ser de proposito general también recibe la parte
baja de direcciones, durante la programación y verificación de la memoria EPROM interna.
PUERTO 2 (P2): El puerto 2 emite la parte alta del Bus de direcciones en los accesos de
memoria externa cuando utilizan 16 bits de dirección (MOVX @DPTR, A). Durante el acceso
a la memoria de datos externa con direccionamiento de 8 bits (MOVX @R1,A), los pines del
Puerto 2 emiten el contenido del registro P2 del SFR (Registro de funciones especiales).
PUERTO 3 (P3): Este puerto puede usarse para propósito general cuando trabaja como
microcontrolador pero tiene otras funciones especiales cuando trabaja como
microprocesador o con acceso a memoria de datos externa, como se muestra en la sig.
Tabla.
TABLA 2.2
EA/VPP: (External Access), cuando se mantiene un nivel alto, se ejecuta sólo el programa
de la EPROM interna, a menos que el contador de programa exceda de FFF (4K) para el
8751. Si EA se mantiene un nivel bajo, se ejecuta el programa de la memoria externa
siempre, independientemente de la dirección del programa.
XTAL1 y XTAL2: Son la entrada y salida respectivamente, de un amp lificador inversor que
puede ser configurado para su uso como un chip oscilador. Se puede utilizar indistintamente
un cristal de cuarzo o un resonador cerámico.
RESET: Señal de inicialización del sistema. Un reset interno al sistema se produce cuando
se pone el pin RST a un nivel alto durante un cierto tiempo, esto se logra de modo
automático conectando el pin RST a Vcc mediante un capacitor de 10 µF y a tierra medinte
una resistencia de 8.2 kΩ .
Una característica importante es que los puertos pueden ser utilizados como buses
de direcciones, de datos y control, debido a estas caracteristicas se dice que el
Microcontrolador puede trabajar como Microprocesador.
Los drivers de salida de los puertos P0 y P2 y los buffers de entrada del puerto P0 se
pueden utilizar para acceder a la memoria externa del sistema. En estas condiciones, el
puerto P0 se configura como salida del byte bajo del bus de direcciones (A0 a A7), de un
bus que consta de 16 bits (capacidad de direccionamiento 64K). Multiplexado en el tiempo
como bus de datos bidireccional (D0 a D7). El puerto P2 se configura como salida del byte
alto del bus de direcciones (A8 a A15). De esta manera el microcontrolador se configura a
modo de CP U (Microprocesador) de un sistema externo con unas capacidades de expansión
definibles por el usuario. Naturalmente, en estas condiciones, le queda como puerto íntegro,
para el control de periféricos, el puerto P1 y parte del puerto P3, puesto que hay señales
que se utilizan para el control del sistema (bus de control).
Figura 1.12
La memoria de programa sólo puede ser leída y tiene como máximo 64K byte
externos. (Internamente el 8751 es de 4K byte). La señal de autorización de lectura en la
memoria de programa externa es PSEN. El pin EA del MICROCONTROLADOR puesto a Vcc
(+5V) indica que el puntero de programa busca direcciones desde la posición de memoria
0000H hasta la 0FFFH de la memoria interna y de la 1000H a la FFFFH, en la memoria
externa. Si el pin EA es puesto a Vss (0v), la búsqueda de direcciones del programa se
dirige a la memoria externa en todo momento.
Figura 1.14
• El Puerto P0 emite el <<byte bajo>> del contador del programa PC (PCL). Una vez
estabilizada la señal sobre P0, la señal ALE (Address Latch Enable) introduce esta
dirección dentro del circuito integrado latch 74LS373, que pasa a apuntar la dirección de
la memoria externa de programas. Al mismo tiempo que el Microcontrolador emite el
PCL por P0, la parte alta del contador del programa (PCH) se emite por P2. Entonces
Figura 1.13
En las siguiente Fig. Se muestra el funcionamiento y diagramas de tiempos de esta
operación.
Figura 1..15
FF
SFR
Solo Directo. 64 KBytes
80 Memoria Externa
7F
Directo é
Indirecto
00
0000 RD WR
FIG. 3.5
el más importante.
SP: Stack Pointer: es un registro de 8 bits, este es incrementado antes de que el dato sea
almacenado, con un Push o Call. El Stack puede recidir en cualquier lugar de la RAM. El
Stack Pointer es inicializado a 07H después de un reset, esto hace que el Stack empiece en
la localidad 08H.
DPL y DPH: Data Pointer: Este registro puede ser manipulado como un registro de 16 bits o
PSW: Program Status Word: Contiene información del estado del CPU en cada ciclo de
instrucción.
b7 b6 b5 b4 b3 b2 b1 b0
CY AC F0 RS1 RS0 OV - P
b7 C: Bandera de Acarreo.
INSTRUCCIONES EJECUTABLES:
Cada instrucción ejecutable en lenguaje ensamblador es una representación
simbólica de una instrucción en lenguaje máquina. Por lo tanto, la instrucción en lenguaje
ensamblador debe definir la operación aritmética - lógica; el modo de direccionamiento y el
operando, dirección o desplazamiento de la dirección cuando sea necesario. Además las
instrucciones ejecutables en lenguaje ensamblador suelen contener una sentencia o
comentario que indica la razón fundamental de la instrucción. Por último, es frecuente
asignar una etiqueta, o nombre a una función, para facilitar su referencia. Toda esta
información se organiza en cuatro campos:
ADD A, 7FH ;El acumulador es sumado al dato que se encuentra en la dirección 7FH de la
Ram interna y el resultado será almacenado en el acumulador.
MOV A, 2EH ; El Acumulador es cargado con el dato que se encuentra en la dirección 2EH
de la memoria RAM interna.
q Direccionamiento Indirecto:
La instrucción específica un registro que contiene la dirección del operando. Tanto la
memoria RAM interna, como la externa se pueden direccionar indirectamente.
Los registros para direccionar sobre el mapa de 8 bits son el R0 y R1 del banco de
registros seleccionado, o el Stack Pointer. El registro para direccionar sobre 16 bits sólo
puede ser el DPTR.
Ejemplo:
ADD A, @R0 ; Así, si (R0)=4CH la operación será:
A<--(A)+(4C)
Código: 1111 1 r r r
q Direccionamiento Implícito.
En estas instrucciones se especifica, implícitamente, el registro sobre el que van a
operar, como el acumulador, el puntero de datos, etc. No necesitan especificar el operando
por que está implícito en el código de operación.
Ejemplo:
INC A; A ß (A) + 1 Incrementa el contenido del acumulador:
INC DPTR; DPTR ß (DPTR) + 1 Incrementa puntero de datos;
DEC R0; Decrementa el registro R0.
q Direccionamiento Inmediato
Al código de operación le sigue una constante en la memoria de programas.
Ejemplo:
MOV A, #255 ; Carga en el acumulador el número decimal 255.
Generalmente se expresan en hexadecimal:
MOV A, #0FFH
o en binario:
MOV A, #11111111B
MOV A, #64H ;El acumulador es cargado con el dato 64H inmediatamente.
ADD A, #120 ;El acumulador es sumado al número decimal 120 y el resultado
;se almacena en el acumulador.
MOV DPTR, #1245H ;El DPTR es cargado con el dato 1245H en forma inmediata.
• Direccionamiento Indexado
Este direccionamiento sólo es posible en la memoria de programas y sólo permite la
lectura. Es utilizado para la lectura de tablas. Un registro base de 16 bits (el DPTR o el
Figura 1.14
En las tablas simplificadas también se indica el posible flag (C= Carry, OV=
overflow, AC= Auxiliar Carry) afectado por la instrucción según el siguiente código:
No es afectado....................................
Sí es afectado...................................... X
Afectado poniéndolo a ...................... 0
Afectado poniéndolo a........................ 1
En algunas tablas no son afectados los flags, y esto se indica con un mensaje en la
parte inferior de las mismas.
INSTRUCCIONES ARITMETICAS
En la tabla 4.2. Se muestra el menú de las instrucciones aritméticas. Se indican en la
tabla los modos de direccionamiento que permite la instrucción y los flags afectados.
Los tiempos de ejecución que se indican en la tabla están evaluados sobre una
frecuencia de reloj de 12 MHz.
Tabla 4.2
X =Si =No
Ejemplo:
A = 5FH
INSTRUCCIONES LOGICAS
La tabla 4.3 muestra la lista de instrucciones lógicas y los modelos de
direccionamiento que permiten así como los flags afectados.
La duración de ejecución de 1 ó 2 microsegundos considerando un cristal de 12 MHz.
• Las primeras instrucciones corresponden a las operaciones AND, OR, EXOR y NOT.
Ejemplo:
ANL <byte>, # 3F
Si <byte> = (3A) = 0011 1010
# 3F = 0000 1111
0000 1010 = 0AH
(<byte> se refiere, en este caso, a una posición de memoria.)
Tiempo de
Nemónico Operación Modos de direccionamiento Flag afectados
Ejecución
Dir Ind Reg Imm C OV AC
µs
ANL A,<byte> A=A.AND.<byte> X X X X 1
ANL <byte>,A <byte>=<byte>.A X 1
C b7 ßACCà b0
C ß B7 ßACCà B0
<dest> = <destino>
<src> = <fuente>
Ejemplo:
Antes de ejecutar la instrucción:
(3A)= 35H : (3D) = 78H
MOV 3AH, 3DH Después de ejecutarla:
(3A)= 78H : (3D) = 78H
• La instrucción MOV DPTR.# data 16 bits, permite transferir datos de 16 bits para
inicializar el DPTR (Data pointer = puntero de datos) en el tratamiento de tablas en la
memoria de programas o para acceder a los datos de la memoria externa.
• La instrucción XCH A,<bite>, intercambia los datos del acumulador y del byte
direccionando. La instrucción XCHD A,@Ri es similar a la anterior, pero sólo implica en el
intercambio el nibble bajo; es una instrucción especializada en la manipulación de datos
en el código BCD.
Ejemplos:
Antes de ejecutar la instrucción:
(A)= 37H y (2D) = 23H
XCH A, 2DH Después de ejecutarla:
(A) = 23H y (2D) = 37H
Antes de ejecutar la instrucción:
XCHD A, @R0 (R0) = 2DH = 37H y (A) = 23H
Después de ejecutarla:
(A) = 27H y (2D) = 33H
INSTRUCCIONES BOOLEANAS
CLR C C=0 1 0
CLR bit bit = 0 1
SETB C C=1 1 1
X =SI: = No
Las instrucciones que aparecen en las tablas son: MOVE, SET, CLEAR, NOT, OR y AND.
Se observa cómo en casi todas las instrucciones se hace referencia al flag Carry (C).
Se podría decir que cumple todas las características que tiene el acumulador en el
procesamiento de palabras. El flag Carry se direcciona directamente dentro de la palabra de
estado PSW, en la posición <<bit7>>.
B7 b5 b0
C F0
Todos los bits del PSW son direccionables bit a bit, como todos los registros
señalados del SRF. Es importante reseñar la presencia del flag F0 (b5 del PSW) de propósito
general, disponible como flag del usuario. ¿Por qué no utilizarlo como indicador, en las
operaciones aritméticas de signo (flag N)?
Comentario aparte exige el tratamiento de las instrucciones booleanas de salto. Hay
instrucciones que producen el salto cuando el bit direccionado está en estado <<1>>, como
son las instrucciones JC,JB y JBC; también están las que producen el salto cuando el bit
direccionado está puesto <<0>>, como son las instrucciones JNC, y JNB. JBC Produce el
SJMP rel : (short jump). La dirección destino del salto viene dada por un <<offset
relativo>>, igual que en las instrucciones de salto booleanas. La instrucción tiene dos bytes,
correspondientes al código de operación y al byte de offset relativo. El rango del salto está
limitado a –128 y + 127 byte relativos. al primer byte siguiente a la instrucción de salto.
(PC) ß(PC) +2
CPC) ß(PC) +
LJMP addr 16: ( Long jump). La dirección destino del salto viene dad por una constante de
16 bits. La instrucción está formada por 3 bytes, 1 byte para el código de operación y 2
para la dirección del salto. Por tanto, la dirección de destino está ubicada dentro del área de
los 64K de la memoria de programa.
PC ß addr 16
AJMP addr 11: (Absolute jump). La dirección destino del salto viene dada por una constante
de 11 bits. La instrucción tiene 2 bytes, uno para el código de operación que también
contiene en sí misma 3 de los 11 bits de direcciones, y otro byte que contiene los 8 bits
bajos de la dirección de destino. El código de la instrucción y el operando es :
a10 a9 a8 0 0 0 0 1 A7 a6 a5 a4 A3 a2 a1 a0
CODIGO DE OPERACIÓN OPERANDO
Por tanto, el destino del salto tiene que estar comprendido dentro del bloque de los 2
K bytes referenciado respecto a la siguiente instrucción a la del salto.
PC ß (PC) + 2
(PC 10-0) ß dirección de la página
acumulador con los 16 bits del puntero de datos (DPTR) y carga el resultado de la suma en
el contador de programa (PC). Esta será la dirección para la subsiguiente búsqueda de la
instrucción.
Ejemplo: Se trata de establecer cinco caminos de ramificación del programa, dependiendo
de que el acumulador tome valores comprendidos entre 0 y 4.
• Programa:
MOV DPTR,# TABLA_ SALTO ;Se carga el DPTR con la dirección de la tabla de saltos.
MOV A, INDI ; Se carga el acumulador con la variable índice (INDI).
; 0 <INDI< 4.
RL A ;El valor cargado sufre un desplazamiento de un bit
;a la izquierda (multiplica por 2 el contenido del acumulador).
JMP @A +DPTR ;Se efectúa la suma: PC ß (A) + (DPTR)
; y se produce el salto a otra instrucción
; de salto que a su vez saltará al
; subprograma a ejecutar.
----------------------------------
INDI: AJMP SALTO0
AJMP SALTO1
AJMP SALTO2
AJMP SALTO3
AJMP SALTO4
La instrucción RL A convierte la variable INDI (valor comprendido entre 0 y 4) en un
número par de rango entre 0 y 8 para salvar, en el salto, los datos bytes de longitud que
tiene cada entrada de salto, AJMP SALTO0,AJMP SALTO 1...
_ Siguiendo con las instrucciones incondicionales, de la tabla 4.3 ésta muestra la instrucción
CALL addr que tiene 2 formatos, LCALL y ACALL, que difiere en la forma en la que la CPU
implementa la dirección donde se encuentra la subrutina.
Nota: CALL es el nombre genérico con que el programador se refiere a estas instrucciones
de salto, y que se traducen en una <<llamada>> (generalmente suelen producirse varias
LCALL addr 16 : utiliza un formato de 16 bits para direccionar la subrutina y esa área de
ACALL addr 11: utiliza un formato de direccionamiento de 11 bits, por lo que la subrutina
debe estar dentro del área de los 2 Kbytes, a partir de la siguiente instrucción.
Secuencia de operaciones:
• (PC)ß (PC) +2
• (SP)ß (SP) + 1
• ((SP))ß (PC7-0 )
• (SP)ß (SP) + 1
• ((SP))ß (PC15-8)
• (PC10-0)ß dirección de la página
Lo mismo que se indicó en los saltos incondicionales, el programador cuando trabaja en
ensamblador sólo debe preocuparse de colocar la etiqueta; el programador ensamblador
determinerá la longitud del salto y el formato que debe dar al código de instrucción según la
longitud del salto.
RET: Las subrutinas terminan su ejecución con la instrucción RET, que es la instrucción que
RETI: Utilizada para retornar de las rutinas del servicio de interrupciones. Las interrupciones
X =Si =No
Nota: en la tabla 3.10 se señalara como posible operando <byte>, pudiendo ser <byte>:
a) El acumulador.
b) Los registros R0 a R7 con direccionamiento directo.
Los registros R0 y R1 con direccionamiento indirecto.
JZ y JNZ:
Salta si es cero y salta si no es cero. Para determinar si cumple las condiciones de las
instrucciones JZ, y JNZ, la CPU no pasa revista al registro de estado como ocurre en otros
DJNZ:
Decrementa y salta si no es cero. Esta instrucción está especializada en lazos de control.
Para que ejecute un lazo n veces se carga un <<contador>> con n y, cada vez que se
ejecute el contenido del lazo, el contador decrementa una unidad, saliendo del lazo cuando
el contenido del contador sea cero.
• (PC)ß(PC) + 2
• (<byte>) ß (<byte>) – 1
• Si (<byte>)> 0 o (<byte>)< 0
Entonces
(PC)ß (PC) + rel
Ejemlpo:
Ejecutar el lazo 10 veces.
MOV CONTADOR, # 10
LAZO: (comienzo del lazo)
------------------------ àInstruciones que se van a ejecutar mientras
-------------------------- CONTADOR sea distinto de <<cero>>.
( fin del lazo)
DJNZ CONTADOR , LAZO
CJNE:
Compara y salta, si el resultado de la comparación no es igual.
En este caso hay dos formatos, según la comparación se haga con el acumulador o con un
operando tipo <byte>, que puede ser:
• Con direccionamiento indirecto ( registros R0 y R1).
• Con direccionamiento directo ( registros R0 y R7 )
CASO 1.MODELO àCJNE A,<byte>, salto relativo
Secuencia de operaciones:
90H MOV
91H #01H
92H CALL
93H Dire, rutina
A0H INC A
A1H MOVC A, @A+PC
A2H RET
A3H 20H
A4H 21H
A5H 22H
A6H 23H
MOV A, #01H
CALL TABLA
(A) = 21H
PROCESO
Se trata de controla el nivel de líquido de un depósito, utilizando tres sensores
detectores de niveles A,B y C, Y DOS BOMBAS B1 Y B2 (Figura 5.9)
He aquí una descripción del proceso, desde el punto de vista de su relación con el mundo
exterior, según los tres tipos de señales principales:
• Entrada de información: SENSORES.
• Actuación sobre los elementos finales: ACTUADORES.
• Señalización del proceso: INDICADORES.
END
ENTRADAS SALIDAS
P3.2 P3.1 P3.0 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
C B A N.C N.C AL RE LL V B2 B1
0 0 0 0 0 0 0 0 1 1 1
0 0 1 0 0 0 0 0 1 1 1
0 1 0 0 0 1 0 0 0 0 0
0 1 1 0 0 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 0 1 0 0 0 0 0
1 1 1 0 0 0 1 0 0 0 0
diseñado para usarse con los microprocesadores de INTEL, cuenta con 24 pines de E/S que
operación.
necesaria lógica digital externa. El bus de salida de datos del 8255 cuenta con un buffer de
tres estados bidireccional, el cual es usado para acoplarse con el sistema. Los datos se
transmiten o reciben por el buffer después de ejecutar una orden de entrada o salida por el
LOGICO”
(CS)Chip Select: Una entrada baja en este pin habilita la comunicación entre el 8255 y el
Micro.
A1 A0 RD WR CS OPERACIONES DE LECTURA
0 0 0 1 0 Del Puerto A --> Al bus de Datos
0 1 0 1 0 Del Puerto B --> Al bus de Datos
1 0 0 1 0 Del Puerto C--> Al bus de Datos
OPERACIONES DE ESCRITURA
0 0 1 0 0 Del bus de Datos--> Al Puerto A
0 1 1 0 0 Del bus de Datos--> Al puerto B
1 0 1 0 0 Del bus de Datos--> Al puerto C
1 1 1 0 0 Del bus de Datos-> Reg. de Control
FUNCIONES DE 3 ESTADOS
X X X X 1 Bus de Datos--> 3 Estados.
1 1 0 1 0 CONDICION ILEGAL.
X X 1 1 0 Bus de Datos --> 3 Estados
TABLA 1. 6
m m m m m m m m m m m m m m
14 13 12 11 10 9 8 7 6 5 4 3 2 1
BD5 debe estar a 1, DB4 especifica el tamaño del bus (4 ó 8 bits), y el DB3 el numero
de líneas del display. Se debe dar un retardo de 40µS antes de enviar la siguiente
instrucción.
2. Se limpia toda la memoria del display y se regresa el cursor a la posición inicial.
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
01H 0 0 0 0 0 0 0 0 0 1
Esta instrucción toma un tiempo de 1.64 mS.
3. Se establece el movimiento del cursor hacia la derecha, la pantalla del display
permanece fija con la entrada de los caracteres.
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
06H 0 0 0 0 0 0 0 1 1 0
Esta instrucción toma un tiempo de 40µS.
4. Se prende la pantalla del display y se prende el cursor señalando la posición del
proximo carácter de entrada, se desactiva el parpadeo.
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0EH 0 0 0 0 0 0 1 1 1 0
Esta instrucción toma un tiempo de 40µS.
5. A partir de aquí se puede comenzar a enviar los caracteres que se desean mostrar
dejando un tiempo de 40µS como mínimo y colocando RS=1. Por ejemplo se enviara la
palabra “TECNOLOGICO” por lo tanto se escribirá el siguiente código ASCII.
Primero el código de la letra “T”
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
54H 1 0 0 1 0 1 0 1 0 0
T __
T E __
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
43H 1 0 0 1 0 0 0 0 1 1
T E C __
REGISTROS.
El LCD tiene 2 registros de 8-bits, uno es el registro de instrucciones (IR) y otro el
registro de datos (DR).
• Escribir en el registro IR.
El IR almacena código de instrucción para display clear y cursor shift, etc., y también
para escribir una nueva dirección en el registro AC (Address Counter), que es el registro
encargado de apuntar, tanto a la DD RAM (RAM de Datos del Display) como a la CG RAM
(RAM Generador de Caracteres).
• Leer del IR.
Permite la lectura del registro AC, del cual sólo son válidos los 7 bits de menos significativos
DB0-DB6, el bit de mayor peso, DB7 informa del estado del Busy Flag o indicador del
display Ocupado.
• Escritura en el DR.
Permite escribir en DD RAM o CG RAM donde se encuentre apuntando el registro AC.
• Leer del DR.
RS R/W Operación
0 0 Escribir en IR:Borrar Display, etc., o modificar AC.
Tabla 1.2
Cuando se encuentra a “1” indica que el LCD está ocupado realizando operaciones internas
y no puede aceptar nuevas instrucciones. Hay que esperar que el Busy Flag valga “0” para
enviar la siguiente instrucción.
• Contador de Dirección (AC):
Indica la dirección donde serán leídos o escritos los datos sobre DD RAM o CG RAM. Este
registro puede modificarse realizando una escritura en el IR.
Además, cuando se escriben o se leen datos en el DD RAM o CG RAM, el AC se incrementa o
decrementa de manera automática de acuerdo con el Modo de Entrada (Entry Mode Set).
• Ram de Datos del Display (DD RAM):
Tiene una capacidad de 80 bytes, 40 por cada línea; lógicamente dependiendo del modelo
sólo 16,32,40 ó 80 caracteres podrán ser visualizados a la vez, aunque desplazando (shift)
el display podrán irse visualizando todos los caracteres escritos.
• Generador de caracteres en ROM (CG ROM):
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
38H 0 0 0 0 1 1 1 0 0 0
2.- Se prende la pantalla del display, se activa el cursor señalando la posición del próximo
caracter de entrada y se desactiva el parpadeo.
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0EH 0 0 0 0 0 0 1 1 1 0
3.- Se establece el movimiento del cursor hacia la derecha, la pantalla del display
permanece fija con la entrada de los caracteres.
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
06H 0 0 0 0 0 0 0 1 1 0
4.- A partir de aquí se pueden comenzar a enviar los caracteres que se desean exhibir
dejando un tiempo entre cada uno de ellos
de 40µS. Mínimo, y con RS=1.
Por ejemplo para enviar las letras T,E y C se escribe el siguiente código ASCII.
Primero el código para la letra “T”
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
54H 1 0 0 1 0 1 0 1 0 0
T __
T E __
T E C __
T E C N O L O G I C O
m m m m m m m m m m m m m m
BIBLIOGRAFIA
1. HITACHI DATABOOK.
Notas sobre el significado de los operandos de las instrucciones que se describen a continuación:
Rn..................... Registros R0-R7 del banco de registros seleccionado.
Direct............... Dirección del dato de 8 bits de la memoria interna. Puede ser un dato de
la RAM interna (0-127 para el 8051 o 0-225 para el 8052) o un registro
del SFR (por ejemplo, puerto de E/S, registro de control, registro de
estado (128-255).
ADD A,direct Add direct byte to Accumulador. 0010 0101 Direct address 2 12
ADDC A, direct Add direct byte to Accumulador with Carry 0011 0101 Direct address 2 12
ADDC A,@Ri Add indirect RAM to Accumulador with Carry 0011 011i 1 12
ADDC A,# data Add immediate data to Acc with Carry 0011 0100 Immediate data 2 12
SUBB A,Rn Subtract Register from Acc with boorrow 1001 1rrr 1 12
SUBB A, direct Subtrac direct byte from Acc with boorrow 1001 0101 Direct address 2 12
SUBB A,@Ri Subtract indirect RAM from ACC with boorrow 1001 011i 1 12
SUBB A, # data Subtract immediate data from Acc with boorrow 1001 0100 Immediate data 2 12
ANL A,direct AND direct byte to Acumulator 0101 0101 Direct address 2
ANL A,# data AND immediate data to Accumulator 0101 0111 Immediate data 2
ANL Direct,A AND Accumulator to direct byte 0101 0010 Direct address 2
ANL Direct,# data AND immediate data to direct byte 0101 0011 Direct address Immediate data 3
ORL Direct.#data OR immediate data to direct byte 0100 0011 Direct address Immediate data 3
XRL A,direct Exclusive -OR direct byte to Accumulator 0110 0101 Directs address 2
XRL A.#dat Exclusive -OR immediate data to Accumulator 0110 0110 Immediate data 2
XRL Direct,A Exclusive -OR Accumulator to direct byte 0110 0010 Direct address 2
XRL Direct,# data Exclus ive -OR immediate data to direct byte 0110 0011 Direct address Inmediate data 3
MOV A,direct Move direct byte to Accumulator 1110 0101 Direct address 2
MOV A,#data Move immediate data to Accumulator 0111 0100 Immediate data 1
MOV Rn,,direct Move direct bute to regiter 1010 1rrr Direct address 2
MOV Rn,#data Move immediate data to regiter 0111 1rrr Immediate data 1
MOV Direct,Rn Move register to direct byte 1000 1rrr Direct address 2
MOV Direct,direct Move direct to direct 1000 1010 Dir. Addr. (src) Dir. Addr (dest) 3
MOV Direct,@Ri Move indirect RAM to direct byte 1000 011i Direct address 2
MOV Direct,# data Move immediate data to direct bute 0111 0101 Direct address Immediate data 3
MOV @Ri,direct Move direct byte to indirect RAM 1010 011i Direct address 2
MOV @Ri,# data Move immediate data to indirect RAM 0111 011i I mmediate data 2
MOV DPTR,#data 16 Load data pointer with a 16- bit constant 1001 0000 Immed. Data 15 -8 . Immed. Data 7 -0 3
MOVC A,@A+DPTR Move code byte relative to DPTR to Acc 1001 0011 1
MOVX A,@Ri Move External RAM (8 - bit addr) to Acc 1110 001i 1
MOVX A,@DPTR Move External RAM (16- bit addr) to Acc 1110 0000 1
MOVX @Ri,A Move Acc to external RAM (8 - bit addr) 1111 001i 1
MOVX @DPTR,A Move Acc to External RAM (16- bit addr) 1111 0000 1
PUSH Direct Push direct byte stack 1100 0000 Direct address 2
POP Direct Pop direct byte from stack 1101 0000 Direct address 2
XCH A,direct Exchange direct byte with Accumulator 1100 0101 Direct address 2
XCHD A,@Ri Echange low-order digit indirect RAM with 1101 011i 1
Acc
ANL C.bit AND direct bit to Carry 1000 0010 Bid address 2 24
ANL C,/bit ANDcomplement of direct bit to Carry 1011 0000 Bid address 2 24
MOV C,bit Move direct bit to Carry 1010 0010 Bid address 2 12
MOV Bit, C Move Carry to direct bit 1001 0010 Bit address 2 24
JNC Rel Jump if Carry not set 0101 0000 Rel address 2 24
JB Bit,rel Jump if direct bit is set 0010 0000 Bit address Rel, address 3 24
JNB Bit,rel Jump if direct bit is not set 0011 0000 Bit address Rel, address 3 24
JBC Bit,rel Jump if direct bit is set & clear bit 0001 0000 Bit address Rel, address 3 24
LCALL Addr 16 Long Subroutine Call 0001 0010 addr15- addr8 addr7 - addr0 3
LJMP Addr 16 Long jump 0000 0010 addr15- addr8 addr7 - addr0 3
CJNE A,direct,rel Compare direct byte to Acc and jump if not 1011 0101 diret.address rel.address 3
Equal
CJNE A,#data , rel Compare immediate to Acc and jump if not 1011 0100 immediate data rel.address 3
Equal
CJNE Rn,#data,rel Compare immediate to registrer and jump if 1011 1rrr immediate data rel.address 3
not Equale
CJNE @R1,#data,rel Compare immediate to indirect and jump if Not 1011 010i immediate data rel.address 3
Equale
DJNZ Rn,rel Decrement register and jump if Not Zero 1101 1rrr rel.address 2
DJNZ Direct,rel Dcrement direct byte and jump if Not Zero 1101 0101 direct address rel.address 3
CROSS-ASSEMBLER
• El ensamblador (AVMAC51) traslada mnemónicos, pseudooperaciones, y direcciones
simbólicas, a código de operación a nivel maquina, y direcciones numéricas así como
manejo de macros, directivas de procesador y directivas condicionales de ensamblador.
• EL encadenador (AVLINK) habilita la utilización por segmentos para código relocalizable
(así como absoluto), datos. Etc. así como modularización de archivos fuente.
• Las librerías (AVLIB) colecta múltiples modules objeto para simplificar el
encadenamiento.
• El generador de reportes cross-reference (AVREF) ayuda en la coordinación de
proyectos grandes.
• EL (HEXFORM) formateador de archivos HEX, produce un archivo binario, o un archivo
HEX revisado.
EJEMPLOS:
AVMAC51 file.asm
AVMAC51 file.asm NOMACEVAL ; Lo procesa y lo ensambla.
AVMAC51 file.asm NOPROCESS ; Lo ensambla únicamente.
AVMAC51 file.asm ALLPUBLIC ; Lo preprocesa únicamente.
AVMAC51 file.asm XREF1 ; Genera un .XRF
AVMAC51 file.asm MACFILE(filename) ; Genera un .MXP
EL ENCADNADOR AVLINK
El encadenador es un programa que acepta como entrada uno o varios módulos
objeto, y produce un solo modulo de salida, encadenado, con código relocalizado y listo
para ser cargado en memoria.
El AVLINK entrega un archivo de salida en formato .HEX (INTEL), o
.MOT(MOTOROLA) ó .TEK(TEKT RONICS).
Así como un archivo .MAP el cual muestra las localidades de segmentos y símbolos.
EJEMPLOS:
AVLINK outfile=file.obj
AVLINK outfile=one.obj, two.obj, rutinas.obj
AVLINK outfile=file.obj OF=MOT
AVLINK outfile=infile.obj -SYMBOLS ;genera un .SYM
Note que "DEFSEG" define un nombre para un segmento (llamado un segmento definido
por el usuario), mientras "SEG" es colocado dentro de un segmento. Usted permanece en
un segmento hasta que usted lo especifica (usando otro pseudo-op "SEG") que usted desea
estar en un segmento diferente.
DEFSEG nombre_del_segmento_1
SEG nombre_del_segmento_1
db 1
DEFSEG nombre_del_segmento_2
SEG nombre_del_segmento_2
db 2
Usted puede asignar atributos a un segmento especificando el atributo "ABSOLUTE"
permite el uso de la palabra "ORG" (origen del inicio de dirección absoluta) dentro del
segmento.
DEFSEG NOMBRE_SEGMENTO, ABSOLUTE
SEG NOMBRE_SEGMENTO
ORG 100H
db 3
ORG 200H
db 4
El atributo "OVERLAID" puede ser usado solamente por el mismo nombre del segmento
en mas de un modulo . . .
Uso del atributo "CLASS=" . . . Usted puede asignar cualesquier atributo clase aplicable
con la oración "CLASS="
Algunos chips usan otras clases, por ocasiones la clase "PAGE0", con la cual coloca datos
en pagina0 . . .
; DEFSEG segzero, CLASS=PAGE0
; SEG segzero
; db 1
Note que cualquier CLASS aplicable a un chip tiene un nombre de segmento predefinido
conocido para el ensamblador, por ejemplo:
SEG CODE
db 0AH
SEG DATA
db 0BH
Note que el campo de la dirección del file '.PRN' mostrara después de la dirección:
& -> Para un segmento definido por el usuario
' -> Para un segmento predefinido como CODE
'' - > Para un segmento predefinido como DATA
@ -> (Si es aplicable) para un segmento predefinido PAGE0
* -> Para una etiqueta externa
Usted puede usar usa símbolos atraves de módulos (ej., programas en archivos fuentes
separados) usando los pseudo-ops PUBLIC y EXTERN.
Note que usando la opcion ALLPUBLIC hará que todas las etiquetas usadas en el presente
modulo sean como PUBLIC.
Para tomar como referencia un símbolo que es definido en otro modulo, use el pseudo-op
EXTERN ...
EXTERN outlabel
Usando la directiva EXTERN permite que la etiqueta sea usada en el presente modulo, aun
cuando no esta definida allí.
Sinónimos de EXTERN incluyen EXT, EXTRN, EXTERNAL, y XREF.
Uso de PROCedures...
Usando PROC permite el uso local de símbolos, esto es, símbolos cual identidad es conocida
solamente entre lo que precede a PROC y antes de ENDPROC.
proclab PROC
L?local db 5
ENDPROC
proc2lab PROC
L?local db 6
ENDPROC
Note que el símbolo 'L?local' no causa un error 'multiply-defined symbol'. Note además,
que los símbolos locales deberán iniciar con L?
END...
El pseudo-op END deberá aparecer en un archivo (file) hasta el final del mismo (el
ensamblador terminara su trabajo al reconocer END).
END
REGISTROS DE INTERRUPCIONES.
Las interrupciones son controladas mediante la escritura en los registros IE
(Interruption Enable) e IP (Interruption Priority) los cuales físicamente son representados
en la Figura sig.
poniendo a 1 o a 0 los bits de este registro. Una interrupción de bajo nivel de prioridad se
puede interrumpir por otra de un nivel más alto. Una interrupción de alto nivel de prioridad
no puede ser interrumpida por otra interrupción de un nivel más bajo.
b6 Reservada.
b7 Reservada.
DEFSEG INTER,ABSOLUTE
SEG INTER
ORG 0H
JMP START
ORG 3H
JMP Tek_INTO
ORG 30H
START: MOV TCON,#01H ;Se programa la INT0 por transición
MOV IE,#081H ;Habilita interrupción INT0
MOV A,#00H ;Limpia Acumulador
SETB C
SALTO1: RLC A
MOV P0,A
CALL RETARDO
JNB ACC.7,SALTO1
SALTO2: RRC A
MOV P0,A
CALL RETARDO
ORG 100H
Tek_INTO: MOV IE,#0
PUSH ACC
MOV A,PSW
PUSH ACC
MOV A,R0
PUSH ACC
MOV R0,#0AH
SALTO5: MOV P0,#0FFH
CALL RETARDO
MOV P0,#00H
CALL RETARDO
DJNZ R0, SALTO5
POP ACC
MOV R0,A
POP ACC
MOV PSW,A
POP ACC
MOV IE,#081
RETI
END
La función como Timer ó como Counter es seleccionada por el bit de control C/T
perteneciente al registro TMOD (Timer/Counter Mode Control Register). El registro TMOD no
es direccionable <<bit a bit>>. Estos dos timer tienen cuatro modos de operación y se
seleccionan mediante los bit (M0,M1) en el registro TMOD.
REGISTRO TMOD
B7 B6 B5 B4 B3 B2 B1 B0
GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0
Si C/T=0 entonces funciona como temporizador con los pulsos de reloj internos.
Si C/T=1 entonces cuenta los pulsos que llegan por T0 (pin 14)
B3 GATE: Habilita la entrada exterior INT0 (pin 12)
Si GATE=1 entonces habilita INT0 si TR0=1 control por Hardware.
Si GATE=0 entonces deshabilita INT) y depende exclusivamente de TR0.
(TR0 es un bit del Reg. TCON y se activa o desactiva por software).
el modo de operación de los Timer 0 y 1 en relación con las interrupciones y los flancos de
activación de los mismos.
REGISTRO TCON
B7 B6 B5 B4 B3 B2 B1 B0
La autorización para contar pulsos, procedentes del reloj interno o bien del pin 15
(T1) (actuando como contador), se produce en el Timer 1, cuando TR1=1 y las entradas
GATE=0 o INT1=1.
Una aplicación podría ser, para medir el ancho de pulso a través del pin INT1 ó INT0.
EJEMPLO No.1 Timer 1 en Modo 1 como temporizador de 16 bits. El bit 0 del puerto P1
(P1.0), prendera y se apagara en función de los valores de carga del Timer 1 (TH1+TL1).
ORG 30H
INICIO: MOV TMOD,#10H ;M0=1 de Timer1,GATE=0,C/T=0
END
EJEMPLO No.2 Timer 1 en Modo 1 como temporizador de 16 bits con arranque por hardware desde el
exterior. El bit 0 del puerto P1 (P1.0), prendera y se apagara en función de los valores de carga del Timer
1 (TH1+TL1) cuando se aplica un nivel alto por el pin exterior 13 (INT 1).
EJEMPLO No.3 Timer 1 en Modo 2 como temporizador de 8 bits con auto-recarga arranque por
hardware desde el exterior. El contenido de TL1 es enviado por el puerto P0, cuando se aplica un nivel
alto por el pin exterior 13 (INT 1).
SCON: Este registro se encarga de establecer los parámetros para la transmisión o recepción de datos
en comunicación serie; así si se trata de una transmisión o recepción, formato de la palabra (bit de start,
bit de datos, bit de stop), Velocidad, etc.
REGISTRO SCON
b7 B6 b5 b4 b3 b2 b1 b0
SM0 SM1 SM2 REN TB8 RB8 TI RI
BIT NOMBRE Y COMENTARIO
SBUF : Serial Data Buffer: son dos registros buffer aparentemente separados, pero
PCON: Power Control Register: Para aplicaciones en donde la característica de consumo sea
crítica, la versión CHMOS ofrece dos modos de trabajo de bajo consumo: el modo POWER
DOWN y el IDLE. También ofrece, este registro, posibilidades de variar la velocidad de
comunicación en el canal serie.
SMOD - - - GF1 GF0 PD IDL
SMOD Dobla el “BAUD RATE” para el puerto serie cuando se utiliza el timer para generar el BAUD RATE.
GF1 Propósito general.
GF0 Propósito general.
PD Bajo consumo de energía. (80C51 solamente)
IDL Bajo consumo de energía. (80C51 solamente)