Вы находитесь на странице: 1из 36

Universidad Autnoma de Yucatn Facultad de Matemticas Microprocesadores Otilio Santos Aguilar Sistema mnimo usando el microprocesador Z80

Addy Gabriela Ceballos Gmez Ricardo del Rayo Ochoa Felipe Mijangos Manrique Angel Manuel Montes de oca Segura Emmanuel Vera Tun 12 de marzo de 2012

ndice general
INTRODUCCIN
Microprocesador Z80 Caractersticas principales del Z80 . . . . Diagrama y descripcin de pines del Z80 . Registros internos del Z80 . . . . . . . . . Registros de uso general . . . . . . . Registros de uso especico en el Z80 El registro de estado . . . . . . . . . Las interrupciones en el Z80 . . . . . . . . Interrupcin no enmascarable (NMI) Interrupcin enmascarable(INT) . . Tipos de direccionamiento . . . . . . . . . Unidad Aritmtica-Lgica . . . . . . Ciclos o tiempos . . . . . . . . . . . . . . INTERFAZ DE PERIFRICOS 8255 DESCRIPCIN DEL INTEGRADO. . DESCRIPCIN FUNCIONAL . . . . . PROGRAMACIN DEL 8255 . . . . . MODOS DE OPERACIN DEL 8255 . ROM (AT28C64B) RAM (IS61LV256) Generador de Reloj RESET Selector de dispositivos(GAL16V8D) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
5 5 6 8 8 8 9 10 10 10 11 11 12 14 14 15 15 16 18 19 20 22 23

DESCRIPCIN DEL PROYECTO 24 Esquemtico Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Cdigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Cdigo del GAL16V8D . . . . . . . . . . . . . . . . . . . . . . . . Cdigo del Z80 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Software til . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27 27 32

INTRODUCCIN

Un ordenador es una mquina fundamentalmente secuencial. Esto quiere decir que realiza sus tareas una detrs de otra, siguiendo el orden en el que estn las instrucciones para realizarlas. Sus componentes bsicos sern, por tanto, un lugar donde almacenar las instrucciones y datos (Memoria) y un elemento encargado de ejecutar los procesos indicados por esas instrucciones (Unidad Central de Proceso o CPU). La CPU debe incluir todos los componentes necesarios para leer la memoria, decodicar las instrucciones y ejecutar clculos aritmticos y lgicos. En los ordenadores de pequeo tamao (minis y micros), la CPU est integrada dentro de un solo chip de silicio, a este chip se le conoce por el nombre de microprocesador.

Microprocesador Z80
El Z80 es uno de los uP mas importantes dentro de la rama de los 8 bits. Fabricado por la casa Zilog, fue empleado en muchos ordenadores personales. Se encuentra comercializado desde 1976 y al igual que el uP intel 8085, el Z80 es tambin similar al intel 8080 pero con mejoras notables.

Caractersticas principales del Z80


Fue diseado por la rma Zilog, aunque tambin lo fabricaron otras casas tales como SGS, MOSTEK, NEC y SHARP. Construido en tecnologa MOS canal N con puerta de silicio. Es uP de 8 bits en el bus de datos y de 16 en el bus de direcciones para alcanzar los 64 Kb de espacio de memoria. Era un uP rpido admitiendo una seal de clock de 2.5 MHz, aunque la versin Z80-A alcanza los 4 MHz. El nmero de instrucciones alcanza a las 158, que si te tienen en cuenta los modos de direccionamiento alcanza a 696. Los modos de direccionamiento son: Implcito, inmediato, relativo, directo e indexado. Su alimentacin es nica y de solo 5 voltios. Admite 2 tipos de interrupciones: INT (enmascarable) y NMI (no enmascarable) En cuanto a sus particularidades, el uP Z80 dispone de: * Entradas y salidas para direccionar hasta 256 puertos para perifricos. * Contador de 7 bits y los circuitos lgicos correspondientes para obtener las funciones de refresh al conectarle memorias dinmicas (DRAM) * Dispone de instrucciones adecuadas para la manipulacin a nivel de bit de registros y memoria. 5

* Instrucciones de copia y comparacin a nivel de bloque. En la gura 1 podemos observar el diagrama de bloques del uP Z80.

Figura 1: Diagrama de bloques internos del uP Z80

Diagrama y descripcin de pines del Z80

Figura 2: Diagrama de pines del Z80 El uP Z80 (gura 2) se encuentra encapsulado en el formato DIP de 40 terminales, como la mayora de los uP de 8 bits. Las funciones de sus terminales 6

son: A0-A15: D0-D7: WR: RD: MREQ: M1: HALT: WAIT: RESET: Bus de direcciones compuesto de 16 bits para alcanzar 64 Kb de memoria. Bus de datos, compuesto de 8 bits (Memory Write). Cuando este terminal esta a cero el uP indica al exterior la operacin de escritura. (Memory Read). Cuando se hace cero indica la operacin de lectura. (Memory Request). Cuando se pone en estado bajo, indica al exterior que la direccin del bus de direcciones es valida para leer o escribir. (Machine Cycle One) por este terminal el uP indica al exterior el primer tiempo de ejecucin de una instruccin (Ciclo de bsqueda) Cuando es cero, indica en que momento se detiene, como consecuencia de la instruccin HALT de un programa. Es por donde los perifricos y memorias lentas detienen al uP, para sincronizarse con el, esto ocurre cuando se lleva a cero. Llevando a cero esta entrada se produce el borrado del contador del programa, de modo que al retirarse el uP arranca en la direccin 0000. Es una salida de refresco, cuando se hace cero indica que los 7 bits de menor peso del bus de direcciones contienen la direccin de refresco para las memorias dinmicas que se pueden conectar al uP. (Input/Output Request) Cuando esta en estado bajo indica que el uP no se dirige a la memoria principal, sino a los dispositivos de entrada/salida. (Interrupt Request) Entrada por donde los perifricos hacen la peticin de interrupcin al uP. Se produce cuando se lleva a cero lgico. Entrada de interrupcin no enmascarada. Se activa por anco, concretamente con el anco de bajada de la interrupcin que se aplique por este terminal. La interrupcin ingresada por este terminal tiene prioridad total sobre la anterior (INT). Cuando se activa la NMI, el uP termina la ejecucin de la instruccin en curso e independientemente del contenido del registro de estado, bifurca a la direccin 0066 en hexadecimal. Esta direccin es la primera linea en que ha de esta ubicada la subrutina de tratamiento de la interrupcin. (Bus Request) Entrada por donde se lleva a alta impedancia las salidas del bus de datos, de direcciones y las salidas de control. El uP lleva sus buses a alta impedancia despus de ejecutar la instruccin en curso. 7

RFSH:

IORQ:

INT: NMI:

BUSRQ:

BUSACK: (Bus Acknowledge) Salida por donde se indica al exterior que el uP esta desconectado como consecuencia de la instruccin anterior (BUSRQ). Esto ocurre cuando la salida se hace cero lgico. CLK: Entrada del reloj, que para este uP es de una sola fase.

VCC-GND: Entradas nicas de 5V y GND que habr de ser aplicada entre los pines 11 y 29.

Registros internos del Z80


Este uP cuenta con 22 registros disponibles para el usuario. El uP dispone de dos juegos completos de registros equivalentes. El programador puede trabajar con uno u otro grupo de registros, pasando de uno a otro con las correspondientes instrucciones de cambio. Sin embargo, los registros de uso general que son tres, pueden ser utilizados como registros de 8 o 16 bits segn lo indique la instruccin aplicada.

Registros de uso general


Son utilizados a voluntad por el propio programador, son los registros acumuladores denominados A y A. Por programa se indica a cual de los dos se desea acceder. Los registros B, C, D, E, H y L son registros de uso general, a los cuales se accede mediante la instruccin determinada. Tambin se dispone de B, C, D, E, H y L para el otro banco de registros. Como ya he dicho, estos registros pueden trabajar en forma de ocho bits o diesiceis. Cuando se desea trabajar de esta manera los registros se asocian asi: B-C, D-E, H-L y B-C, D-E y H-L.

Registros de uso especico en el Z80


El Z80 dispone de 4 registros de uso especico de 16 bits, denominados PC, SP, IY, IX, y otros dos especcos de ocho bits llamados I y R. Sus funciones son: PC: (Program Counter) Es el registro del contador de programa, es de 16 bits y en el queda anotada la direccin de memoria de la instruccin en curso. Cuando acaba la ejecucin de esta, PC se incrementa en uno automticamente. Cuando el programa presenta una instruccin de salto, indica la direccin de este para el PC, ejecutndose el salto y continundose el programa a partir de esta nueva direccin. Es el cometido tpico de toda PC. (Stack Pointer) Es un registro de 16 bits cuya funcin es la de hacer de puntero para indicar en que direccin de la RAM esta ubicado el stack d subrutinas. Este stack esta tratado como una memoria LIFO (Last Input First Output), que quiere decir que el ultimo 8

SP:

dato guardado es el primero en recuperarse. El uP dispone de dos instrucciones, llamadas PUSH y POP que se encargan de introducir y sacar datos de este stack. IX,IY: Son dos registros ndice independientes entre si y de 16 bits cada uno de ellos. Son usados por el uP como ndice para ejecutar operaciones con direccionamiento indexado.

Este modo de direccionamiento simplica la confeccin de un programa en especial cuando se accede a tablas de datos. I: Denominado Interrupt Page Adress Register. Es un registro de ocho bits y puede ser usado donde una llamada indirecta a una posicin de memoria sea necesaria como consecuencia de una interrupcin. Denominado Memory Refresh Register. Tambin es de ocho bits y puede ser usado para acceder a memorias dinmicas. El contenido de este registro es automticamente incrementado despus de cada instruccin de bsqueda.

R:

Estos ocho bits pueden salir al exterior por la parte baja del bus de direcciones para refrescar continuamente la memoria RAM dinmica a donde se desea acceder.

El registro de estado
En este uP el registro de estado es de 8 bits, de los cuales solo seis tienen signicado propio. Bit0=C (Carry). Indica cuando existe acarreo en la parte mas alta del registro acumulador. Es usado en operaciones de adicin y de sustraccin, as como en instrucciones de rotacin. (Zero) Este bit es puesto a uno si la operacin ejecutada tiene como resultado cero o si ha sido cargado un cero en el acumulador, de lo contrario sera siempre cero. (Signe) Este bit indica el signo del dato contenido en el acumulador, se pondr a uno cuando el dato sea negativo, y a cero cuando sea positivo (un dato es negativo cuando su bit siente es un uno)

Bit6=Z

Bit7=S

Bit2=P/O (Parity/Overow) Indica dos funciones distintas: la paridad de un resultado entregado en el acumulador cuando ha sido ejecutada una instruccin lgica (Paridad Par=1, Impar=0) y el overow o desbordamiento cuando ha ejecutado una operacin aritmtica. Bit4 Bit1 (H) es el bit que indica el acarreo de medio byte cuando se opera en BCD. Es decir el acarreo de los cuatro bits de menor peso del byte. (N) este bit indica que tipo de instruccin se ha ejecutado: suma o resta, operando en BCD. 9

Las interrupciones en el Z80


Cualquier microprocesador tiene una posibilidad de interrumpir lo que est haciendo para atender inmediatamente a un dispositivo de alta prioridad que lo solicite, retornando a su tarea principal en el punto donde la dej, cuando el servicio a este dispositivo haya nalizado. El Z-80 tiene varias posibilidades de interrupcin que permiten el acceso con distinta prioridad.

Interrupcin no enmascarable (NMI)


Es la peticin de interrupcin de ms alta prioridad, se acepta siempre, y se responde siempre de la misma forma: saltando a la posicin de memoria 0066h. Salta a cero si el contenido de las posiciones de memoria 5CB0h y 5CB1h es "cero"; podemos evitar el salto a cero, almacenando un nmero distinto de cero en estas posiciones, pero en este caso, se producira un simple retorno y la interrupcin sera ignorada.

Interrupcin enmascarable(INT)
Se trata de la interrupcin ms usada en el Z-80 ya que permite denir el vector de interrupcin, y lo que es ms importante, decidir por software si se atiende o no la peticin. Se denomina vector de interrupcin a la direccin de memoria a que se salta para ejecutar la rutina de servicio a la interrupcin. En el Z-80 existe un "miniregistro" de un solo bit que se denomina ip/op de aceptacin de interrupcin. Si este registro est a "1", la peticin de interrupcin es aceptada, y si est a "0" es ignorada. Cuando el ip/op de aceptacin est a "0", se dice que la interrupcin est enmascarada. Existen dos instrucciones en el Z-80 que nos permiten enmascarar o habilitar la interrupcin, estas interrupciones son: "DI" (Disable Interrupt) y "EI" (Enable Interrupt), se vern detalladamente cuando se estudien las instrucciones de control de la CPU. Si la interrupcin est habilitada, y el microprocesador decide aceptarla, podr responder de tres modos distintos. Estos tres modos de interrupcin, tambin se seleccionan por software, mediante las instrucciones: "IM0", "IM1" e "IM2" (Interrupt Mode 0, 1 y 2). Estos modos de respuesta se denominan respectivamente: MODO 0, MODO 1 y MODO 2. MODO 0 En este modo de interrupcin, el microprocesador deja libre el bus de datos para permitir que el dispositivo que ha solicitado la interrupcin inserte el cdigo de operacin correspondiente a una instruccin que ser ejecutada seguidamente por el microprocesador.

10

MODO 1 En este modo de interrupcin, el microprocesador responde a la interrupcin, simplemente, saltando a la posicin de memoria 0038h. En este caso se dice que el vector de interrupcin es jo. MODO 2 Es el modo de interrupcin ms complejo del Z-80, y el que deberemos utilizar para nuestros nes. En este caso, el microprocesador responde de una forma bastante compleja que conviene analizar detenidamente: primero toma el contenido del registro "I", lo considera como un octeto superior de una direccin, el octeto inferior deber suministrarlo el dispositivo que ha solicitado la interrupcin (si no lo suministra, se entiende que es FFh). Acto seguido, lee el nmero almacenado en esa direccin y la siguiente, lo carga en el "PC", y contina la ejecucin desde ese punto.

Tipos de direccionamiento
El Z80 dispone de los siguientes modos de direccionamiento: Inmediato: Es usado en instrucciones de dos bytes, el primero es el de la instruccin a tratar, y el segundo es el del operando o dato a tratar. Inmediato-Extendido: Es usado en instrucciones de tres bytes, donde el operando ocupa dos de ellos. Relativo: Es usado para operar en las proximidades de la instruccin en curso. Esta relacionado con el contador del programa. Es de dos bytes.

Extendido: Es usado en instrucciones en que se determina la direccin efectiva. Es de tres bytes. Indexado: La direccin efectiva se obtiene sumando el contenido de los registros ndice con el del tercer byte. Es de tres bytes. De registros: Es usado en operaciones de tratamiento de registros. Indirecto: La direccin efectiva se encuentra en el lugar de memoria indicado por la instruccin.

Unidad Aritmtica-Lgica
Otro componente fundamental del microprocesador es la ALU o Unidad Aritmtica-Lgica que es la encargada de realizar todas las operaciones en el interior del microprocesador. Las operaciones que puede realizar son: Desplazamiento Comparacin Puesta a uno de bit

11

Puesta a cero de bit Prueba de bit AND OR OR exclusivo (XOR) Incremento Decremento Suma Resta Ajuste decimal El desplazamiento consiste en una rotacin, bit a bit, de un registro o una posicin de memoria, puede incluir el indicador de acarreo del registro F. El efecto de rotar a la izquierda es el de multiplicar el nmero por 2, y el de rotarlo a la derecha es el de dividirlo por 2. La comparacin consiste en cotejar el acumulador con otro nmero y alterar los indicadores del registro F de acuerdo con el resultado de la comparacin, permaneciendo inalterado el contenido del acumulador. Probar un bit consiste en ver si es "uno" o "cero" y anotar el resultado en el indicador de cero del registro F. Incrementar es sumar "1", decrementar es restar "1". La suma y la resta pueden ser con o sin acarreo. El ajuste decimal consiste en transformar el nmero Hexa contenido en el acumulador y comprendido entre "00" y "FF", en un nmero decimal codicado en binario (BCD) comprendido entre "00" y "99".

Ciclos o tiempos
Para realizar las operaciones secuencialmente, el Z-80 necesita sincronizar todas sus seales internas y externas y disponer, por tanto, de un patrn de tiempo. Es lo que se denomina: Reloj del microprocesador. Cabe sealar que existen varias versiones del microprocesador Z80, las cuales tienen diferente frecuencia mxima de operacin. La versin original trabaja a una frecuencia de 2.5 MHz. A continuacin se presenta las diferentes versiones con su velocidad mxima de operacin.

12

CPU Z80 Z80A Z80B Z80H Z80L-1 Z80L-3

Frecuencia Mxima en MHz 2.5 4 6 8 1 2.5

Cuadro 1: Frecuencias mximas de las versiones del Z80 Se denomina Ciclo de instruccin al tiempo durante el cual el microprocesador ejecuta una instruccin completa. El ciclo de instruccin se subdivide a su vez, en ciclos de mquina. Un ciclo de mquina es el tiempo durante el cual el microprocesador realiza una operacin elemental. Cada ciclo de mquina emplea varios ciclos (impulsos) de reloj. Se denomina "M1" al ciclo de mquina correspondiente a la bsqueda del cdigo de operacin, durante el cual, la pata M1 del microprocesador se coloca a nivel bajo. El ciclo de mquina M1 ocupa 4 ciclos de reloj. Un ciclo de memoria es una operacin de lectura o escritura en memoria, emplea 3 ciclos de reloj.

13

INTERFAZ DE PERIFRICOS 8255


El PPI 8255(gura 3) es un dispositivo de E/S general, programable, capaz de controlar 24 lneas con diferentes conguraciones (entrada/salida) y en hasta 3 modos de operacin.

Figura 3: Diagrama de pines del 8255A

DESCRIPCIN DEL INTEGRADO.


Conexiones del 8255 con el exterior: D0-D7: Bus de datos bidireccional de 3 estados. 14

RESET: Esta seal borra el registro de control y todos los puertos (A, B y C) son colocados en modo entrada. RD: Utilizada por la CPU para leer informacin de estado o datos procedentes del 8255. W R: Utilizada por la CPU para enviar palabras de control o datos al 8255. A0-A1: Lneas de direccin: permiten seleccionar uno de los tres puertos o el registro de control. PA0-PA7: Puerto A: puerto de entrada/salida de 8 bits. PB0-PB7: Puerto B: puerto de entrada/salida de 8 bits. PC0-PC7: Puerto C: puerto de entrada/salida de 8 bits.

DESCRIPCIN FUNCIONAL
Las dos lneas de direcciones denen cuatro puertos de E/S en el ordenador: los tres primeros permiten acceder a los puertos A, B y C; el cuarto sirve para leer o escribir la palabra de control. El 8255 est dividido en dos grupos internos: el grupo A, formado por el puerto A y los 4 bits ms signicativos del puerto C; y el grupo B, constituido por el puerto B junto a los 4 bits menos signicativos del puerto C. El puerto C est especialmente diseado para ser dividido en dos mitades y servir de apoyo a los puertos A y B en algunos sistemas.

PROGRAMACIN DEL 8255


El 8255 soporta 3 modos de operacin: el modo 0 (entrada y salida bsica), el modo 1 (entrada y salida con seales de control) y el modo 2 (bus bidireccional de comunicaciones). Tras un Reset, los 3 puertos quedan congurados en modo entrada, con las 24 lneas puestas a "1" gracias a la circuitera interna. Esta conguracin por defecto puede no obstante ser alterada con facilidad. El modo para el puerto A y B se puede seleccionar por separado; el puerto C est dividido en dos mitades relacionadas con el puerto A y el B. Todos los registros de salida son reseteados ante un cambio de modo, incluyendo los biestables de estado. Las conguraciones de modos son muy exibles y se acomodan a casi todas las necesidades posibles. Los tres puertos pueden ser accedidos en cualquier momento a travs de la direccin E/S que les corresponde, como se vio en el apartado anterior. La palabra de control a enviar a la 4 direccin es:

15

Figura 4: Palabra 1 de conguracin del 8255A Si el bit ms signicativo de la palabra de control est borrado, es tratada entonces como un comando especial que permite activar o inhibir selectivamente los bits del puerto C:

Figura 5: Palabra 2 de conguracin del 8255A Esto es particularmente til para los modos 1 y 2, donde las interrupciones generadas por las lneas del puerto C pueden ser activadas o inhibidas simplemente poniendo a 1 0, respectivamente, el ip-op interno INTE correspondiente a la interrupcin que se trate. Todos son puestos a cero tras establecer el modo.

MODOS DE OPERACIN DEL 8255


MODO 0: Esta conguracin implementa simples funciones de entrada/salida para cada bit de los 2 puertos de 8 bits y los 2 puertos de 4 bits; los datos son ledos y escritos sin ms, sin ningn tipo de control adicional. Los puertos pueden ser congurados de entrada (sin latch) o salida (los datos permanecen memorizados en un latch). MODO 1: Este modo es el strobed input/output (entrada/salida a travs de un protocolo de seales). Existen dos grupos (A y B) formados por los puertos A y B ms el puerto C, que es repartido a la mitad entre ambos grupos para gestionar las seales de control. Tanto si se congura de entrada como de salida, los datos permanecen en un latch. Con este modo es factible conectar dos 8255 entre s para realizar transferencias de datos en paralelo a una velocidad considerable, con posibilidad de generar interrupciones a la CPU en el momento en que los datos son recibidos o hay que enviar uno nuevo (consltese documentacin tcnica). MODO 2: En este modo se constituye un bus bidireccional de 8 bits, por el que los datos pueden ir en un sentido o en otro, siendo el ujo regulado de nuevo 16

por seales de control a travs del puerto C. Este modo slo puede operar en el Grupo A. Tanto las entradas como salidas son almacenadas en latch. NOTA: Existen varias combinaciones posibles de estos modos, en las que las lneas del puerto C que no son empleadas como seales de control pueden actuar como entradas o salidas normales, quedando las lneas de control fuera del rea de inuencia de los comandos que afectan a las restantes.

17

ROM (AT28C64B)
El AT28C64B (gura 6) es una EEPROM con 64K(8K X 8) de memoria, con un tiempo de acceso a lectura de 150ns

Figura 6: Diagrama de pines del AT28C64B Descripcin de pines: A0-A12: Bus de direcciones CE: Chip Enable OE: Output Enable I/O0-I/O7: Bus de Datos de Entrada y Salida NC: No conectado DC: No conectar

18

RAM (IS61LV256)
El IS61LV256 (gura 7) es una memoria SRAM de 32K X 8 de capacidad

Figura 7: Diagrama de pines del IS61LV256

19

Generador de Reloj
Para que el microprocesador pudiese funcionar adecuadamente, el circuito de generacin de reloj deba cumplir con las caractersticas mencionadas con anterioridad en la parte de descripcin del microprocesador. Para ello se uso un cristal de 4MHz.

Figura 8: Circuito generador de reloj Dicha seal debe cumplir con las caractersticas que se muestran en la imagen.

20

Figura 9: Seal de reloj Para medir los tiempos de ejecucin de las instrucciones se tomo en cuenta lo siguiente: Fosc = 4MHz por lo que el tiempo de los T-states es de 1/4MHz = 0.25 microSegundos (us).

21

RESET
El circuito que genera la seal de reset se muestra en la gura.

Figura 10: Circuito Reset Este tipo de circuito es necesario para retardar el inicio de operacin del microprocesador, mantenindolo en tri-state mientras la fuente de poder supera su transitorio inicial al encendido. De esta manera evitamos que el microprocesador empiece a operar cuando la alimentacin todava no alcanza un nivel adecuado, previniendo as una operacin incorrecta. La salida que est entre los inversores va conectado a reset del controlador de perifricos (8255) y la salida nal va conectado al reset del Z80. Las especicaciones del Z80 exigen que la seal de RESET este activa en 0 lgico por lo menos durante 3 ciclos de reloj (1.2 s) para una frecuencia de 2.5 MHz, por lo que al calcular la constante de tiempo del circuito RC es necesario tener en cuenta el tiempo de restablecimiento de las seales (en el orden de los 20 ms), por lo que RC debe ser mayor de 30 ms. Los trigger Schmitt (7414) aumenta la conabilidad del diseo al introducir histresis y acelerar la transicin entre niveles lgicos. El uso del diodo tiene por objetivo descargar rpidamente el capacitor, para asegurar la generacin del pulso de restablecimiento aun en los casos en que se apague y se vuelva a encender en un lapso de tiempo muy corto.

22

Selector de dispositivos(GAL16V8D)

Figura 11: Diagrama de pines GAL16V8D Para realizar la seleccin de dispositivos, es decir, si se lea/escriba a puerto o memoria (RAM/ROM) se puede utilizar la GAL16V8D (gura 11). El GAL16V8D es un PLD (Dispositivo Lgico Programable), en el cual se puede programar una tabla de verdad, esto facilitara la seleccin de dispositivos.

23

DESCRIPCIN DEL PROYECTO


Lo que se pretende realizar en este proyecto es desplegar en una pantalla LCD de 14 caracteres por 2 lneas, los nombres de los integrantes del equipo utilizando un microprocesador, en este proyecto utilizaremos el Z80B que trabaja a mximo 6MHz. Utilizando los dispositivos anteriormente mencionados, se logro realizar un sistema mnimo con las siguientes caractersticas. Memoria ROM: 0000H - 1FFFH Memoria RAM: 8000H - FFFFH PUERTOS: Puerto A: 0000H Puerto B: 0001H Puerto C: 0002H Conguracin 8255: 0003H Como se puede observar, no se direcciona de la 2000H - 7FFFH, ya que solo se consigui una memoria de esta capacidad. Para lograr la seleccin entre puertos se uso el PLD GAL16V8D, utilizando la siguiente tabla de verdad: A2 X X 0 A3 X X 0 A4 X X 0 A5 X X 0 A6 X X 0 A7 X X 0 A15 0 1 X !IORQ 1 1 0 !MREQ 0 0 1 !ROM 0 1 1 !RAM 1 0 1 !PORT 1 1 0

Cuadro 2: Tabla de verdad del GAL16V8D El A15 del Z80 se uso para seleccionar entre la memoria RAM y ROM si era 0 se selecciona la memoria ROM y si es 1 se selecciona la memoria RAM. El 24

IORQ si es 0 habilita el chip select del 8255 y deshabilita las memoria y tambin se toma en cuenta para la seleccin del puerto A12 al A15 ya que la direccin de puertos solo va del 00H al 03H. El LCD fue conectado de la siguiente manera. LCD D0-D7 RS R/W E Z80 PB0-PB7 PC5 PC6 PC7

Cuadro 3: Conexin del LCD

Esquemtico Final
A continuacin se muestra el esquemtico nal del sistema.

25

Figura 12: Esquemtico Final

26

Cdigos
Cdigo del GAL16V8D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Name Z80 ; PartNo 00 ; Date 08/12/2011 ; Revision 01 ; Designer Mi croproce sadores ; Company Microp rocesado res ; Assembly None ; Location FMAT ; Device G16v8 ; /* *************** INPUT PINS * * * * * * * * * * * * * * * * * * * * * / PIN 1= A2 ; PIN 2= A3 ; PIN 3= A4 ; PIN 4= A5 ; PIN 5= A6 ; PIN 6= A7 ; PIN 7= IORQ ; PIN 8= MREQ ; PIN 9= A15 ; PIN 11= WR ; PIN 19= RD ; /* *************** OUTPUT PINS * * * * * * * * * * * * * * * * * * * * * / PIN 12= ROMCE ; PIN 13= RAMCE ; PIN 14= RDPORT ; PIN 15= WRPORT ; PIN 16= RWMEM ; PIN 17= RDMEM ; PIN 18= PORTCE /* *************** LOGICA * * * * * * * * * * * * * * * * * * * * * * * * * * / ROMCE =! IORQ # MREQ # A15 ; RAMCE =! IORQ # MREQ #! A15 ; PORTCE = A2 # A3 # A4 # A5 # A6 # A7 # IORQ #! MREQ ; RDPORT = IORQ #! MREQ # RD #! WR ; WRPORT = IORQ #! MREQ #! RD # WR ; RDMEM =! IORQ # MREQ # RD #! WR ; RWMEM =! IORQ # MREQ #! RD # WR ;

Cdigo del Z80


1 2 ; Fosc = 4MHz p o r l o q u e 1 T s t a t e ;R M 0000H 1FFFH O es de 1/4MHz = 0 . 2 5 microSegundos ( us )

27

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

;RAM 8000H FFFFH ;PUERTOS: ; 0000H PuertoA (NADA) ; 0001H PuertoB (BUS DE DATOS LCD) ; 0002H PuertoC (CONTROL LCD) ; 0003H CONFIGURACION 8255 ; 0000H ;PUERTO B ; PB0 ; PB1 ; PB2 ; PB3 ; PB4 ; PB5 ; PB6 ; PB7 ; 0002H ;PUERTO C ; PC5 ; PC6 ; PC7 BUS DE DATOS LCD D0 D1 D2 D3 D4 D5 D6 D7 CONTROL LCD RS R/W_n E

; : : : DEFINICION DE NOMBRES QUE SE USARAN EN EL CODIGO : : : ; .....PALABRAS PARA EL 8255 . . . . . PORTS_OUT: EQU 80H ; P a l a b r a q u e c o n f i g u r a t o d o s l o s p u e r t o s d e l 8255 como PORTA_IN : EQU 90H ; e l p u e r t o A d e l 8255 como e n t r a d a , l o s r e s t a n t e s como ; ..Palabras de configuracion EQU 30H de LCD.... salida salidas

LCD_8b_1L_5x8 :

; P a l a b r a de c o n f i g u r a c i o n d e l LCD ; ( 8 b i t s , 1 Linea , C a r a c t e r 5 x8 ) ; Usada p a r a l a i n i c i a l i z a c i o n ; 0 0 1 DL N F ; DL=1 N=0 F=0 ; DL : Ancho de Datos , N: ; P a l a b r a de c o n f i g u r a c i o n u s a d a ; ( 8 b i t s , 2 L i n e a s , C a r a c t e r 5 x8 ) ; 0 0 1 DL N F ; DL=1 N=1 F=1 ; DL : Ancho de Datos , N:

Lineas , F :

Fuente

LCD_8b_2L_5x8 :

EQU 3FH

Lineas , F :

Fuente

DISPLAY_ON : EQU 0C H

; Palabra para encender e l D i s p l a y ; d i s p l a y on , c u r s o r o f f , b l i n k i n g o f f ;0 0 0 0 1 D C B ; D=1 C=0 B=0 ; D: D i s p l a y on/ o f f , C : Cu r s o r on / o f f , B :

Binking

DISPLAY_OFF :

EQU 08H

; P a l a b r a de c o n f i g u r a c i o n p a r a a p a g a r e l LCD ; cursor off , b l i n k i n g o f f ;0 0 0 0 1 D C B ; D=0 C=0 B=0 ; D: D i s p l a y on/ o f f , C : Cu r s o r on / o f f , B : B i n k i n g ; Palabra para l i m p i a r ; 0 0 0 0 0 0 0 1 el Display d e l LCD

CLEAR_LCD:

EQU 01H

LCD_MODO_SET: EQU 06H

; P a l a b r a p a r a e n t r a r a l modo SET ; a u t o i n c r e m e n t o ( Derecha ) no s h i f t ; 0 0 0 0 0 1 I /D S ; I /D=1 S=0 ; I /D: d e r e c h a / i z q u i e r d a , ; Palabra que pone el cursor al inicio ,

S:

Shift

on / o f f

LCD_HOME: EQU 02H

0 0 0 0 0 0 1

; ..DEFINICION DE LAS DIRECCIONES DE LOS PUERTOS . . . . . . BUS_DATOS_LCD: EQU 01H ; D e f i n i c i o n d e l b u s da d a t o s d e l LCD ; D i r e c c i o n 00H d e l Z80 y b 0 0 d e l 8 2 5 5 (PUERTO A) CONTROL_LCD: EQU 02H ; D e f i n i c i o n de l a d i r de ; 01H d e l Z80 y b 0 1 d e l l a s l i n e a s de c o n t r o l 8 2 5 5 (PUERTO C) la comfiguracion d e l LCD del 8255

CONFIG_8255 :

EQU 03H

; p u e r t o 3 d e l z80 usado para ; d i r e c c i o n b 1 1 d e l 8255

; . . . . P I N E S DE CONTROL DEL LCD (PUERTO C) . . . . . LCD_RS : EQU 5 ; R e g i s t e r S e l e c t d e l LCD, 0 i n s t r u c c i o n , 1 ; BIT 5 CONTROL_LCD q u e d e f i n e s i s e o p e r a n LCD_RW: EQU 6 LCD_E : EQU 7 ;R=1 W =0 L e c t u r a y escritura d e l LCD ::::

: datos datos o BIT 6

instrucciones

d e l CONTROL_LCD

; E n a b l e d e l LCD q u e ; para que s e a c e p t e

sirve e l contenido

de BUS_DATOS_LCD BIT 7 CONTROL_LCD

; ....DECLARACION DE VARIABLES.... ; Aqui d e f i n i r e m o s l a s v a r i a b l e s q u e s e u s a r a n ; e s t a s v a r i a b l e s s e e n c u e n t r a n en l a RAM q u e e m p i e z a en REG_CONTROL_LCD: EQU 8 0 0 0H ; R e g i s t r o usado para guardar

la el

direccion control

8000H d e l LCD

28

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

REG_DATOS_LCD:

EQU 8 0 0 1H

; Registro

usado

para

guardar

lo

que

se

enviara

en

e l LCD

; : : : : : : : : PROGRAMA PRINCIPAL : : : : : : : : : : : org 0 0 0 0H ; Vector de RESET e l LCD d i r e c c i o n de NOMBRES l o s nombres y a p u n t a a la primera letra

INICIO : c a l l INIT_LCD NOMBRE_INI : l d IX ,NOMBRES MUESTRA: l d A , ( IX +0)

; Inicializa

; Cargamos a IX con l a ; donde e s t a d e c l a r a d o

l d (REG_DATOS_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_DATO c a l l DELAY_15ms c a l l DELAY_15ms i n c IX l d A , ( IX +1) add A, A

; Cargamos l o q u e e s t a en IX a l r e g i s t r o A ; para d e s p l e g a r e l primer c a r a c t e r ; Guardamos e l v a l o r d e l r e g i s t r o A a l a d i r

de REG_DATOS_LCD

; Envia e l d a t o almacenado en REG_DATOS_LCD ; Espera 4 m i l i s e g u n d o s ; Espera 4 m i l i s e g u n d o s ; I n c r e m e n t a IX p a r a p a s a r a l s i g u i e n t e c a r a c t e r ; V e r i f i c a m o s s i no hemos l l e g a d o a l f i n a l d e l ; t e r m i n a cuando e n c u e n t r o e l d e l i m i t a d o r 0 ; Suma e l r e g i s t r o A con A ; s i s e a c t i v a l a b a n d e r a de ZEROS q u i e r e d e c i r ; l l e g a m o s a l f i n a l d e l nombre ; S i no e s c e r o m u e s t r a e l c a r a c t e r ; Movemos e l v a l o r de 130 ; para e s p e r a r aprx 2 s e g para imprimir el nombre que

j r NZ ,MUESTRA l d A, 0 8 2H LOOP: c a l l DELAY_15ms dec A j p NZ ,LOOP

siguiente

nombre

; Esperamos 15 ms ; Decrementa e l c o n t a d o r A ; S a l t a m i e n t r a s no hayan p a s a d o s 2 s e g u n d o s

l d A,CLEAR_LCD ; Movemos l a p a l a b r a p a r a l i m p i a r e l LCD l d (REG_DATOS_LCD) ,A ; Movemos l a p a l a b r a a l b u s de d a t o s c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Envia e l comando a l LCD c a l l DELAY_15ms ; Esperamos 15 ms c a l l DELAY_15ms ; Esperamos 15 ms c a l l DELAY_15ms ; Esperamos 15 ms ; VERIFICAREMOS S I YA SE ESCRIBIERON TODOS LOS NOMBRES i n c IX ; Incrementamos d o s v e c e s IX ; p a r a c o l o c a r n o s en l a s i g u i e n t e l i n e a de nombres i n c IX l d A , ( IX +0) ; Cargamos l o q u e e s t a en IX a A sub A, 0 FFH ; Restamos a A 0FFH q u e e s e l d e l i m i t a d o r f i n a l de l o s nombres j r NZ ,MUESTRA ; Muestra e l s i g u i e n t e nombre s i no ha l l e g a d o a l f i n j p NOMBRE_INI NOMBRES: ; E l 0 a l f i n a l de l o s nombre i n d i c a e l f i n a l de una c a d e n a DB "MICRO : Z80 " , 0 DB "PROFESOR : " , 0 DB "OTILIO SANTOS " , 0 DB "ALUMNOS: " , 0 DB "ADDY CEBALLOS " , 0 DB "FELIPE MIJANGOS " , 0 DB "ANGEL MONTES " , 0 DB "RICARDO DEL R. " , 0 DB "EMMANUEL VERA " , 0 DB "CAL : 1 0 0 " , 0 DB 0FFH j p END_PROGRAM ; : : FUNCIONES USADAS EN EL PROGRAMA : : : : : : : : ; ...CONFIGURA PUERTOS C M SALIDA EN EL M D 0 . . . . . . . . O O O O CONFIG_PORTS_OUT: l d A,PORTS_OUT ; Carga a A l a c o n f i g u r a c i o n d e l 8255 p a r a q u e ; t o d o s l o s p u e r t o s s e a n de s a l i d a en modo 0 c a l l DELAY_15ms out ( CONFIG_8255 ) ,A ; E s c r i b e l a c o n f i g u r a c i o n a l 8255 ret ; % % %INICIALIZACION DEL LCD % % % % % % % %% INIT_LCD : c a l l DELAY_15ms ; Esperamos un t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms l d A, 0 1H l d (REG_CONTROL_LCD) ,A l d HL ,REG_CONTROL_LCD ; D e l i m i t a d o r d e l f i n a l de l o s nombres ; e s t e numero no t i e n e v a l o r ASCII

por

el

voltaje

de

rizo

; Guarda

la

direccion

de

control

d e l LCD

29

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275

c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l CONFIG_PORTS_OUT l d A, LCD_8b_1L_5x8

; Configura

todos

los

p u e r t o s como

salida a l LCD d e l LCD

l d (REG_DATOS_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Mandamos e s t a i n s t r u c c i o n c a l l DELAY_15ms ; Esperamos t i e m p o p a r a mandar c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Envia e l comando p o r 2 da v e z c a l l DELAY_4ms ; Esperamos t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_4ms c a l l LCD_ENVIA_COMANDO ; Enviamos e l comando de nuevo c a l l DELAY_4ms ; Esperamos t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms

; Cargamos l a p r i m e r a p a l a b r a de c o n f i g u r a c i o n ; para i n i c i a l i z a r l o ; Guardamos e s t a c o n f i g u r a c i o n a l b u s de d a t o s

la

siguiente

instruccion

l d A, LCD_8b_2L_5x8 ; Cargamos a A l a c o n f i g u r a c i o n nueva p a r a e l LCD l d (REG_DATOS_LCD) ,A ; Cargamos l a c o n f i g u r a c i o n a l b u s de DATOS d e l LCD c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Enviamos e s t a i n s t r u c c i o n c a l l DELAY_4ms ; Esperamos t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms l d A, DISPLAY_OFF ; Cargamos a A l a c o n f i g u r a c i o n de APAGADO d e l D i s p l a y l d (REG_DATOS_LCD) ,A ; Cargamos e s t a c o n f i g u r a c i o n a l b u s de d a t o s d e l LCD c a l l LCD_ENVIA_COMANDO ; Enviamos e s t e comando a l LCD c a l l DELAY_4ms ; Esperamos o t r o s 4 ms p a r a mandar e l s i g u i e n t e comando c a l l DELAY_15ms c a l l DELAY_15ms l d A,CLEAR_LCD l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A,LCD_MODO_SET l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A,LCD_MODO_SET l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A,LCD_HOME l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A, DISPLAY_ON l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms ret ; Cargamos l a c o n f i g u r a c i o n a A p a r a ; Cargamos e s t a c o n f i g u r a c i o n a l b u s ; Enviamos e s t e comando a l LCD ; Esperamos t i e m p o l i m p i a r e l LCD de d a t o s d e l LCD

; Cargamos l a c o n f i g u r a c i o n p a r a ; Cargamos e s t a c o n f i g u r a c i o n a l ; Enviamos e s t e comando a l LCD ; Esperamos t i e m p o

entrar b u s de

a l modo SET d a t o s d e l LCD

; Cargamos de nuevo l a c o n f i g u r a c i o n ; Cargamos e s t a c o n f i g u r a c i o n a l b u s ; Enviamos e s t a i n s t r u c c i o n ; Esperamos t i e m p o

d e l modo SET de d a t o s d e l LCD

; Cargamos a A l a c o n f i g u r a c i o n p a r a ; mover e l C u r s o r a l i n i c i o ; Cargamos e s t a c o n f i g u r a c i o n a l b u s ; Enviamos e s t e comando a l LCD ; Esperamos t i e m p o

de

datos

d e l LCD

; Cargamos l a c o n f i g u r a c i o n p a r a ; Cargamos e s t a c o n f i g u r a c i o n a l ; Envia e s t e comando a l LCD ; Esperamos t i e m p o

encender e l d i s p l a y b u s de d a t o s d e l LCD

; ...MANDA UN PULSO AL LCD EN EL PIN DE ENABLE.... LCD_E_SIGNAL : c a l l DELAY_4ms r e s LCD_E, (HL) ; Pone a 0 e l b i t LCD_E d e l r e g i s t r o de CONTROL_LCD l d A , ( HL) ; Carga a A e s t a c o n f i g u r a c i o n out (CONTROL_LCD) ,A ; Mandamos e s t a c o n f i g u r a c i o n a l b u s de c o n t r o l d e l LCD

30

276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365

c a l l DELAY_4ms s e t LCD_E, ( HL) l d A , ( HL) out (CONTROL_LCD) ,A c a l l DELAY_4ms r e s LCD_E, ( HL) l d A , ( HL) out (CONTROL_LCD) ,A c a l l DELAY_4ms ret ; . . . . . E N V I A INSTRUCCION AL LCD QUE ESTA EN REGISTRO REG_DATOS_LCD.... LCD_ENVIA_COMANDO: call call call res DELAY_15ms DELAY_15ms DELAY_15ms LCD_RS, ( HL) ; Pone a 0 e l b i t LCD_E d e l r e g i s t r o ; Carga a A e s t a c o n f i g u r a c i o n ; Mandamos e s t a c o n f i g u r a c i o n a l b u s de CONTROL_LCD de control d e l LCD ; Ponemos a 1 e l ; Cargamos e s t a ; Sacamos en e l b i t LCD_E d e l r e g i s t r o de CONTROL_LCD configuracion a A b u s de c o n t r o l d e l LCD

r e s LCD_RW, ( HL) l d A , ( HL) c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (CONTROL_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms l d A, (REG_DATOS_LCD) c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (BUS_DATOS_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_E_SIGNAL ret

; Ponemos a 0 e l b i t LCD_RS ; p a r a mandar un comando a l LCD d e l ; Ponemos a 0 e l b i t L D R C _ W ; p a r a e s c r i b i r a l LCD d e l r e g i s t r o ; Cargamos e s t a c o n f i g u r a c i o n a A

registro

de CONTROL_LCD

de CONTROL_LCD

; Mandamos e s t a

seal

al

bus

de

control

d e l LCD

; Cargamos

esta

configuracion

a A

; Mandamos e s t a

configuracion

a l LCD

; Mandamos

el

pulso

de ENABLE d e l LCD

; . . . . E N V I A DATO AL LCD QUE ESTA EN REGISTRO REG_DATOS_LCD........ LCD_ENVIA_DATO: c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms s e t LCD_RS, ( HL) ; Ponemos en 1 e l b i t LCD_RS ; p a r a mandar un d a t o a l LCD d e l b u s de CONTROL_LCD r e s LCD_RW, ( HL) ; Ponemos a 0 e l b i t L D R C _ W p a r a e s c r i b i r en e l LCD l d A , ( HL) ; Cargamos e s t a c o n f i g u r a c i o n a A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (CONTROL_LCD) ,A ; Mandamos e s t a c o n f i g u r a c i o n a l b u s de c o n t r o l de LCD c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms l d A , (REG_DATOS_LCD) ; Cargamos e s t a c o n f i g u r a c i o n a A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (BUS_DATOS_LCD) ,A ; Cargamos en e l BUS de d a t o s d e l LCD l o q u e mandaremos c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_E_SIGNAL ; Manda e l p u l s o de ENABLE p a r a q u e l o a c e p t e e l LCD ret ; ..DELAY DE 15 ms DELAY_15ms : l d B , 0 EH ..... ; Cargamos e l r e s i t r o B con e l ; esta instruccion = 7 T s t a t e s ; T1 = 70 . 2 5 u s = 1 . 7 5 u s v a l o r 14 o 0EH en h e x y se ejecutara 1 vez hex

LOOP1_15ms : l d C, 0EDH

; Cargamos e l r e g i s t r o C con e l v a l o r de 237 o EDH en ; esta instruccion = 7 T s t a t e s s e e j e c u t a 14 v e c e s ; T2 = 1470 . 2 5 u s = 24 . 5 0 u s

LOOP2_15ms : dec C

; Decrementamos e l r e g i s t r o C ; son 4 T s t a t e s y s e e j e c u t a 23714 v e c e s ; T3 = 2371440 . 2 5 u s = 3 . 3 1 8 ms nop ; Espera 4 T s t a t e s y s e e j e c u t a 23714 v e c e s ; T4 = 2371440 . 2 5 u s = 3 . 3 1 8 ms j p NZ , LOOP2_15ms ; S a l t a a LOOP2_15ms s i no s e l e v a n t a l a b a n d e r a de ZEROS ; s e e j e c u t a 23714 v e c e s y e q u i v a l e a 10 T s t a t e s ; T5 = 23714100 . 2 5 u s = 8 . 2 9 5 0 ms dec B ; Decrementa e l r e g i s t r o B, son 4 T s t a t e s y s e e j e c u t a 14 veces

31

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399

j p NZ , LOOP1_15ms

; T6 = 1440 . 2 5 u s = 14 u s ; S a l t a a LOOP1_15ms s i no s e l e v a n t a l a b a n d e r a ; s e e j e c u t a 14 v e c e s y e q u i v a l a a 10 T s t a t e s ; T7 = 14100 . 2 5 u s = 35 u s ; T = T1+T2+T3+T4+T5+T6+T7 = 15 . 0 0 6 ms

de ZEROS

ret ; ..DELAY DE 4 ms DELAY_4ms : l d B, 0 4H ..... ; Cargamos e l r e s i t r o B con e l ; esta instruccion = 7 T s t a t e s ; T1 = 70 . 2 5 u s = 1 . 7 5 u s v a l o r 04 o 04H en h e x y se ejecutara 1 vez

LOOP1_4ms : l d C, 0DDH

; Cargamos e l r e g i s t r o C con e l v a l o r de 221 o DDH en h e x ; esta instruccion = 7 T s t a t e s s e e j e c u t a 04 v e c e s ; T2 = 0470 . 2 5 u s = 7 u s veces ; Decrementamos el r e g i s t r o C, son 4 T s t a t e s y se ejecuta

LOOP2_4ms : dec C 22104 nop

j p NZ , LOOP2_4ms

dec B veces j p NZ , LOOP1_4ms

; T3 = 2210440 . 2 5 u s = 884 u s ; Espera 4 T s t a t e s y s e e j e c u t a 22104 v e c e s ; T4 = 2210440 . 2 5 u s = 884 u s ; S a l t a a LOOP2_4ms s i no s e l e v a n t a l a b a n d e r a de ZEROS ; s e e j e c u t a 22104 v e c e s y e q u i v a l e a 10 T s t a t e s ; T5 = 22104100 . 2 5 u s = 2 . 2 1 ms ; Decrementa e l r e g i s t r o B, son 4 T s t a t e s y s e e j e c u t a ; T6 = 0440 . 2 5 u s = 4 u s ; S a l t a a LOOP1_4ms s i no s e l e v a n t a l a b a n d e r a ; s e e j e c u t a 04 v e c e s y e q u i v a l a a 10 T s t a t e s ; T7 = 04100 . 2 5 u s = 10 u s ; T = T1+T2+T3+T4+T5+T6+T7 = 4 . 0 0 0 7 ms de ZEROS

04

ret ; ....RUTINA QUE M N A AL FINAL DEL PROGRAMA.... A D END_PROGRAM: end

Software til
Compilacin z80asm en GNU/Linux y Winculp en Windows para la GAL Simulacin ZIM (gura 13) en GNU/Linux y Z80 IDE (gura 14)

32

Figura 13: ZIM

33

Figura 14: Z80 IDE

34

Bibliografa
[1] S. Ciarcia. Build your own Z80 computer: design guidelines and application notes. Byte, 1981. [2] R.S. Gaonkar. The Z80 microprocessor. Macmillan Press, 2000. [3] JC Matthews. Building a z80 minimum system computer. Physics experiments and projects for students, 2:177, 1989. http://en.wikipedia.org/wiki/Zilog_Z80 http://www.natmac.net/zim/ Z80 Datasheet

35