You are on page 1of 262

Prcticas PIC basadas

en mquina de vending

AUTOR: Flix Rizo Lobato


DIRECTOR: Nicolau Caellas Alberich
FECHA: Septiembre / 2004

1.- NDICE

2.- MEMORIA DESCRIPTIVA

2.1. INTRODUCCIN
2.1.1. Antecedentes
2.1.2. Objetivos

2
2
2

2.2. SOLUCIN ADOPTADA


2.2.1. Los microcontroladores. Consideraciones previas
2.2.2. Ventajas de los diseos basados en microcontroladores
2.2.3. Arquitectura bsica de los C
2.2.3.1.
CPU (Central Process Unit)
2.2.3.2.
Memoria de programa
2.2.3.3.
Memoria de datos
2.2.3.4.
Puertos entrada / salida
2.2.3.5.
Watch-Dog
2.2.3.6.
Brown-out
2.2.3.7.
Contador / timer
2.2.3.8.
ADC y DAC
2.2.3.9.
PWM
2.2.3.10.
Comunicacin Serie
2.2.4. Que es un PIC?
2.2.4.1.
Diferencias con otros C
2.2.5. Los microcontroladores PIC
2.2.5.1.
Caractersticas de los microcontroladores PIC
2.2.5.2.
Familias PICmicro
2.2.5.3.
Que PIC escogemos?
2.2.5.4.
PIC 16F876 y 16F877

4
4
5
5
6
6
6
7
7
7
7
8
8
8
8
8
9
9
10
10
11

2.3. PRCTICAS CON MICROCONTROLADORES


2.3.1. Consideraciones previas
2.3.2. Descripcin del MPLAB
2.3.2.1.
Introduccin programa
2.3.2.2.
Funcionamiento del MPLAB IDE
2.3.3. Descripcin del Kit MPLAB-ICD
2.3.3.1.
Introduccin
2.3.3.2.
Caractersticas del MPLAB-ICD Module
2.3.3.3.
Caractersticas del MPLAB-ICD Header
2.3.4. Placa base de laboratorio
2.3.4.1
Descripcin de la paca usada en laboratotio
2.3.5. Regulador de tensin
2.3.6. Descripcin Pantalla LCD
2.3.6.1.
Introduccin
2.3.6.2.
Que pantalla LCD vamos a utilizar?
2.3.6.3.
Funcionamiento de la pantalla LCD

13
13
13
13
14
16
16
17
17
18
18
18
19
19
19
19

2.3.7. Descripcin teclado


2.3.7.1.
Introduccin
2.3.7.2.
Funcionamiento del teclado

21
21
21

2.4. DESCRIPCIN FUNCIONAL DE NUESTRO SISTEMA


2.4.1. Visin general
2.4.2. Funcionamiento
2.4.2.1
Funcionamiento general
2.4.2.2
Funcionamiento Mdulo 1
2.4.2.3
Funcionamiento Mdulo 2

24
24
25
25
26
27

2.5. DESCRIPCIN CIRCUITAL


2.5.1. Introduccin
2.5.2. Circuito regulador de tensin
2.5.3. El microcontrolador
2.5.4. Decodificador 74LS138
2.5.5. Decodificador de BCD a 7 segmentos 7447 y display
2.5.6. El Teclado
2.5.7. Pantalla LCD

30
30
31
31
34
36
38
40

2.6. PRCTICAS A REALIZAR


2.6.1. Introduccin
2.6.2. Enunciados de prcticas
2.6.2.1.
Prctica 1
2.6.2.2.
Prctica 2
2.6.2.3.
Prctica 3
2.6.2.4.
Prctica 4
2.6.2.5.
Prctica 5
2.6.2.6.
Prctica 6

42
42
42
43
50
59
69
78
88

2.7. PROGRAMA ASM


2.7.1 Introduccin
2.7.2. Modulo 1
2.7.2.1.
2.7.2.2.
2.7.2.3.
2.7.2.4.
2.7.2.5.
2.7.3. Mdulo 2
2.7.3.1.
2.7.3.2.
2.7.3.3.
2.7.3.4.
2.7.3.5.

Visin general.
Revisar monedero
Revisar producto
Dar cambio
Interrupcin

97
97
97
97
98
99
101
102

Visin general
Seleccionar producto o precio
Elegir producto
Enviar EEPROM
Interrupcin

103
103
104
104
105
106

2.7.4. Datos de inters


2.7.4.1.
Registros de dinero
2.7.4.2.
Clasificacin de los productos.
2.7.4.3.
Funcin Escribir_LCD
2.7.4.4.
Funcin Clear_display
2.7.4.5.
Funcin EE_escribe
2.7.4.6.
Funcin EE_LEE

3.- MEMORIA DE CLCULO


3.1. CLCULOS DE LOS ESQUEMAS ELCTRICOS
3.2. CLCULOS DEL PROGRAMA ASM

4.- PRESUPUESTO

107
107
108
108
109
109
109

110
111
112
114

4.1. LISTA ELEMENTOS


4.1.1. Lista de elementos del mdulo 1
4.1.2. Lista de elementos del mdulo 2

115
115
116

4.2. LISTA DE PRECIOS


4.2.1. Lista de precios de elementos del mdulo 1
4.2.2. Lista de precios de elementos del mdulo 2

117
117
118

4.3. COSTE TOTAL


4.3.1. Coste total del mdulo 1
4.3.2. Coste total del mdulo 2

119
119
120

4.4. RESUMEN DEL PRESUPUESTO

121

5.- PLANOS
5.1. ESQUEMAS DE ELEMENTOS
5.1.1. Esquema Regulador fuente tensin
5.1.2. Esquema del 74LS47
5.1.3. Esquema del 74LS138
5.1.4. Esquema Comunicacin USART
5.1.5. Conector teclado
5.1.5.1.Teclado producto
5.1.5.2.Teclado monedas
5.1.5.3.Teclado precio
5.1.6. Esquema conector pantalla LCD
5.1.6.1. LCD Mdulo 1
5.1.6.2. LCD Mdulo 2

122
123
123
123
124
124
125
125
125
126
126
126
126

5.2. ESQUEMAS PRCTICAS MDULO 1


5.2.1. Esquemas Prctica 1
5.2.2. Esquemas Prctica 3
5.2.3. Esquemas Prctica 4
5.2.4. Esquemas Prctica 6
5.2.5. Esquema general
5.2.6. Diseo placa base

127
127
128
129
130
131
132

5.3. ESQUEMAS PRCTICAS MDULO 2


5.3.1. Esquemas Prctica 2
5.3.2. Esquemas Prctica 5 y Mdulo 2
5.3.3. Diseo placa base

133
133
133
134

ANEXOS
A. LISTA DE CDIGOS DE PROGRAMA
A.1. Mdulo 1
A.1.1. Programa ASM de prctica 1
A.1.2. Programa ASM de prctica 3
A.1.3. Programa ASM de prctica 4
A.1.4. Programa ASM de prctica 6
A.1.5. Programa ASM del Mdulo 1 completo

I
I
X
XXV
XXXV
XLVIII

A.2. Mdulo 2
A.2.1. Programa ASM de prctica 2
A.2.2. Programa ASM de prctica 6
A.2.3. Programa ASM del Mdulo 2 completo

LXX
LXX
LXXXVI
CI

Memoria descriptiva

2. MEMORIA DESCRIPTIVA

Memoria descriptiva

Introduccin

2.1. Introduccin
En este proyecto encontraremos seis prcticas para la asignatura de Sistemes
electrnics amb microcontrolador, en las cuales se pretende que el alumno aprenda a
programar un microcontrolador.
Estas prcticas sern diferentes partes de una simulacin de una mquina de vending.
Cada grupo de alumnos debera realizar una prctica. Al finalizar correctamente todas las
prcticas, se deberan poder unir los cdigos de todos los grupos y se podra simular dicha
mquina, por ello, se tendra que intentar que todos los grupos trabajasen en conjunto para
poder unir al final todas las prcticas.
Para ello, este proyecto de final de carrera propuesto por Nicolau Caellas pretende
montar el hardware y el software de la mquina de vending y disear las diferentes prcticas a
realizar por los alumnos.
2.1.1. Antecedentes
Nuestro antecedente ser la asignatura de Sistemes electrnics amb
microcontrolador que se realiza en el segundo cuatrimestre del tercer curso de E.T.I. en
Electrnica Industrial.
Dicha asignatura tiene 3 crditos prcticos con lo cual este proyecto pretende
complementar las prcticas ya existentes utilizando al mximo los recursos de hardware ya
existentes en estas prcticas.
2.1.2. Objetivos
La finalidad de este proyecto es realizar una serie de prcticas con el objetivo de que
los alumnos puedan utilizarlas para aprender a programar mediante el MPLAB a un
microcontrolador.
Al mismo tiempo pretendemos, debido a que las prcticas a realizar son las diferentes
partes de una mquina de vending, que estas prcticas puedan unirse, con lo cual pretendemos
que exista una unin entre los diferentes alumnos para poder conseguir al final del curso unir
todas las prcticas y que funcionen como una sola.
Como queriamos una prctica de comunicaciones serie hemos pensado crear un
sistema para modificar los precios de la EEPROM. La idea sera guardar todos los precios en
un mdulo que podramos conectar a la mquina y transmitir los datos para modificar los
precios.
Tambin se dejan abiertas una serie de posibilidades para poder aadir diferentes
prcticas a estas para mejorar la simulacin, con lo cual los alumnos podran proponer alguna
prctica nueva o para un posible proyecto futuro que ampliase los mdulos y el nmero de
prcticas.

Memoria descriptiva

Introduccin

Las diferentes prcticas tienen unos objetivos diferentes. Se ha pretendido que con
cada prctica se simule una parte de la mquina de vending, aunque como se ha dicho
anteriormente todas estas partes tienen registros en comn, como por ejemplo el que realiza la
prctica del monedero y el que realiza la prctica del cambio tienen en comn el registro que
se encarga de saber la cantidad de dinero que se ha pagado.
Las diferentes prcticas a realizar tienen como objetivos:
-

PRCTICA 1: Realizar la simulacin de un monedero, con el objetivo de


guardar la cantidad de dinero que el usuario introduce a una mquina.

PRCTICA 2: Realizar un sistema para poder modificar los precios de los


productos a vender en la EEPROM.

PRACTICA 3: Realizar el programa que se encarga de pedir el producto,


revisar el dinero pagado, el que se tiene que pagar y entregar el producto.

PRACTICA 4: Realizar el programa que se encarga de dar el cambio, tanto


cuando seleccionamos un producto como cuando queremos que nos devuelva
el dinero pagado.

PRACTICA 5: Realizar el cdigo para poder comunicar dos


microcontroladores mediante la comunicacin de USART. Este sera para
enviar la EEPROM para modificar los precios de los productos.

PRCTICA 6: Realizar el cdigo para poder comunicar dos


microcontroladores mediante la comunicacin de USART. Este sera para
pedir producto.

Memoria descriptiva

Solucin adoptada

2.2. Solucin adoptada


2.2.1.Los microcontroladores. Consideraciones previas.
Antes que nada, nos interesa saber que es un microcontrolador, as que partiremos de
las funciones que ste hace y haremos una pequea comparacin con otros dispositivos que
tambin hacen esas o otras funciones similares, para descubrir realmente las posibilidades en
general de los microcontroladores y de lo que haremos servir en este proyecto. Por esto,
haremos unas definiciones previas:
Controlador: Dispositivo usado por control automtico de un conjunto de procesos
Controlador digital: Controlador con lgica de control digital
Implementaciones de los controladores digitales:
- Lgica discreta

Baja densidad de integracin


Diseo (Hardware) sencillo / medio / complejo
Poco generalizable
Coste bajo / medio / alto

- PLC (Programmable Logic Controller)

Mayor densidad de integracin


Diseo (Software) sencillo
Muy generalizable
Coste elevado

- Microprocesador + RAM + ROM + Perifricos (A/D, Timers...)

Elevada densidad de integracin


Diseo (Software + Hardware) medio / complejo
Generalizable
Coste bajo / medio

- Microcontroladores

Densidad de integracin muy elevada


Diseo (Software + Hardware) sencillo / medio
Muy generalizable
Coste bajo

Memoria descriptiva

Solucin adoptada

2.2.2. Ventajas de los diseos basados en microcontroladores

Reduccin del tamao y precio: El elevado grado de integracin de un


microcontrolador (C) en circuito integrado permite una elevada funcionalidad
por rea a bajo coste y un menor tamao del PCB.
Elevada flexibilidad: Un mismo microcontrolador (C) puede ser usado por un
elevado nmero de aplicaciones variando solo el software.
Rapidez de desarrollo: La adaptacin de un C en otra aplicacin puede
consistir en adaptar el software y muy poco hardware.
Aumento de la fiabilidad: La disminucin de componentes en placa hace
disminuir tambin los riesgos de averas.
Buenas prestaciones: Los C usan P que permiten la ejecucin eficiente de
algoritmos de control.

2.2.3. Arquitectura bsica de los C


En este apartado se muestran todos los elementos que puede tener un C, no quiere
decir ue todos lo C tengan estos dispositivos, esto depende de la versin del C que
escogamos. Este C se escoge dependiendo de las aplicaciones que necesitemos.

Figura 1. Arquitectura de los mC

Viendo la descripcin de cada uno de los elementos que aparecen en el diagrama


anterior, se puede entender mejor.

Memoria descriptiva

Solucin adoptada

2.2.3.1. CPU (Central Process Unit)


Es el microprocesador del sistema. Sus caractersticas y funcionalidad se definen
sobretodo a partir de tres clasificaciones:
- Clasificacin en funcin del tamao de los datos:

4 bit: Aplicaciones muy sencillas y muy econmicas


8 bit: Aplicaciones sencillas /medias y econmicas. Es el tipo de C dominante
en el mercado
16 bit: Aplicaciones medias y coste medio
32 bit: Aplicaciones complejas y de coste elevado

- Clasificacin en funcin del conjunto de instrucciones:

RISC (Reduced Instruction Set Code). Instrucciones sencillas y de rpida


ejecucin.
CISC (Complex Instruction Set Code). Instrucciones ms complejas y de mayor
tiempo de ejecucin.

- Clasificacin en funcin de la arquitectura de buses:

Von Newmann: Buses de datos y direcciones compartidos por la memoria de


datos y de programa. Simplifica el diseo y el coste.
Harvard: Buses de datos y direcciones diferentes por la memoria de datos y de
programa. Permite acceso simultaneo.

2.2.3.2. Memoria de Programa


sta es la memoria donde se guarda el programa que escribimos. Es una memoria que
se mantiene aunque apaguemos el sistema que la contiene. Existen diferentes tipos de
memoria de programa en funcin de la forma de gravarla y/o borrarla:

ROM: Dispositivo OTP grabado en fbrica


EPROM: Dispositivo OTP o borrable (con ventana)
EEPROM: Dispositivo regrabable in-system con Vpp = 12v
FLASH: Dispositivo regrabable in-system

2.2.3.3. Memoria de datos


La podemos diferenciar en dos tipos de memoria, dependiendo de si sta se mantiene o
no en desconectar el programa. As tenemos:
- Memoria voltil de datos: Es la memoria donde se guardan temporalmente variables
usadas en el programa. Tenemos dos, una genrica y otra ms especfica:

Memoria descriptiva

Solucin adoptada

RAM: Almacenaje de variables del programa


SFR: (Special Function Regiters). Usados para hacer servir los perifricos, las
interrupciones,...

- Memoria no voltil de datos: Es un tipo de memoria como la anterior, ya que sirve


para almacenar datos, pero con la particularidad de que stos se mantienen en memoria. Es
muy til, por ejemplo, para guardar en memoria algunos datos que queramos llamar desde
diversos programas, como datos de configuracin o de seguridad. Existen dos tipos:

EEPROM
FLASH

2.2.3.4. Puertos de Entrada / Salida


Son los pins que sirven para la entrada y salida de datos desde o al exterior. Son
generalmente de 8 bits, aunque pueden variar segn el puerto y algunos de ellos incorporan
resistencias de pull-up, la funcin de las cuales es evitar ponerlas exteriormente en algn tipo
de conexin, como entradas procedentes de fuentes de tensin, corriente,... donde tenemos que
controlar, por ejemplo las corrientes de entrada. Esto nos hace ahorrar especialmente espacio.
2.2.3.5. WatchDog
El WatchDog es un temporizador especial y su funcin es realizar un reset del
microcontrolador peridicamente para refrescarlo. Su funcionamiento no est predefinido,
sino que tenemos que introducir un cdigo de programa para hacerlo funcionar como mejor
nos convenga y para reinicializarlo en el momento determinado.
2.2.3.6. Brown-out
El Brown-out es un circuito interno que sirve como detector de posibles errores en la
alimentacin del microcontrolador, paralizando el sistema para evitar posibles daos en ste.
2.2.3.7. Contador /Timer
En este apartado definimos el contador como un contador de pulsaciones procedentes
de un reloj o un dispositivo asincrnico externo y recibidos por un pin destinado a esta
funcin.
En cambio, llamamos Timer al contador de ciclos de una seal de reloj generado
internamente en el dispositivo, pudiendo programarlo como el anterior para que produzca
algn evento en el momento determinado que nos interese segn lo programemos. Tanto uno
como el otro suelen incluir pre-scaler para multiplicar el valor programado y conseguir as
posibles temporizaciones ms altas.

Memoria descriptiva

Solucin adoptada

2.2.3.8. ADC y DAC


Estas opciones son una la inversa de la otra. La primera, mucho ms fcil de encontrar,
se refiere a la conversin de un valor analgico procedente del exterior en uno de digital
dentro de nuestro dispositivo, por esto poder tratarlo. En cambio, el conversor digital
analgico nos interesa para transformar un valor que tenemos en formato digital en nuestro
dispositivo analgico a la salida al exterior. Pensamos que las seales externas pueden estar en
los dos formatos, mientras que en nuestro microcontrolador slo las podemos tratar en formato
digital, de forma que es lgico que el A/D sea en la direccin exterior-interior y el D/A en
direccin inversa.
2.2.3.9. PWM
El PWM (Pulse Width Modulator) es, como su nombre indica, un generador de pulsos
de anchura variable, til para controles del mismo tipo haciendo la funcin de duty-cycle, es
decir, variaciones en las duraciones de los semiciclos positivos y negativos para obtener
tensiones medias variables y conseguir as, por ejemplo, controlar la velocidad de un motor
DC.
Tambin existe la posibilidad de variar la frecuencia de estos pulsos y conseguir as,
por ejemplo, emitir diferentes sonidos en una aplicacin.
2.2.3.10. Comunicaciones Serie
Los microcontroladores son capaces de enviar o recibir datos del exterior por medio de
las comunicaciones serie. Dependiendo del microcontrolador, stos pueden ser:

SPI (Serial Peripherical Interface)


I2 C (Inter-Integrated Circuit)
UART (Universal Asynchronous Receiver-Transmiter)
USART (Universal Synchronous-Asynchronous Receiver-Transmiter)
CAN (Controller Area Network)
USB (Universal Serial Bus)

2.2.4. Que es un PIC?


Un PIC es un microcontrolador fabricado por Microchip Inc. De este fabricante de
Cs ser el nuestro. Aparte de este fabricante existen diferentes fabricantes de
microcontroladores, National, Motorola, Intel ,Zilog ,Thomson.
2.2.4.1. Diferencias con otros C.
Las pricipales diferencias entre los PIC y otras marcas es que tienen gran variedad de
mdelos que permiten sleccionar el que ms convenga para tu proyecto. Que tienen gran
variedad de herraminetas para desarrollar hardware y software. Por su longitud de palabra de

Memoria descriptiva

Solucin adoptada

12 bits son los que menos espacio ocupan en la memoria de instrucciones. Y son bastante ms
rapidos que la mayora.
Dspues de estas diferencias parece que los PIC son los mejores, cosa que no es verdad
para aplicaciones muy especificas en lso que las otras marcas pueden dar unas prestaciones
ms elevadas.
2.2.5. Los microcontroladores PIC
2.2.5.1. Caractersticas de los microcontroladores PIC

RISC (Reduced Instruction Code)


o Gama baja (PIC 16C5X) 33 instrucciones
o Gama media (PIC 16CXXX) 35 instrucciones
o Gama alta (PIC 17CXXX/18CXXX) 58/77 instrucciones

Arquitectura Harvard (Buses diferentes para las memorias de datos y


direcciones)
o Memoria de datos de 8 bits
o Memoria de programa de 12/14/16 bits
Arquitectura Pipeline
o Todas las instrucciones ocupan 1 palabra de instruccin
o Ejecucin de todas las instrucciones en 2 ciclos
o Throghput 1 ciclo de instruccin, excepto saltos que son 2 ciclos

Pila Hardware
WatchDog Timer (WDT)
Power on Reset (POR)
Modo de bajo consumo (SLEEP)
Lneas E/S de alta corriente (20/25 mA)
Proteccin de cdigo
Nmero de serie/cdigo de identificacin
Programacin:
o C = CMOS OTP/EPROM
o CR = CMOS ROM
o CE = CMOS OTP/EPROM+EEPROM
o F = FLASH
o HV = High Voltage (15v)
o LF = Low Voltage Flash
o LC = Low Voltage OTP
o LCR = Low Voltage ROM

Memoria descriptiva

Solucin adoptada

2.2.5.2. Familias PICmicro


Seguidamente se muestran las familias PIC pertenecientes a la marca Microchip, a
partir de las caractersticas de las cuales escogemos el modelo ms apropiado para nuestra
aplicacin.

Familia PIC 16C5X


o 12-bit program word
o Familia base
o 2 Niveles de pila hardware
o No interrupciones
o 1 Timer-8bits + WDT

Familia PIC 12C5XXX


o 12-bit/14-bit program word
o EEPROM
o Interrupciones
o 1 Timer-8bits + WDT

Familia PIC 16CXXX, 16 FXXX


o 14-bit program word
o Prestaciones medias
o Gran variedad de perifricos on-chip: Comparadores, PWM, 3 Timers,
Conversores A/D, EEPROM de datos, USART,...
o 8 Niveles de pila hardware
o Interrupciones internas y externas

Familia PIC 17CXXX


o 14-bit program word
o Otras prestaciones
o Gran variedad de perifricos on-chip: Comparadores, PWM, 3 Timers,
Conversores A/D, EEPROM de datos, USART,...
o 16 Niveles de pila hardware
o Interrupciones vectorizadas
Familia PIX 18CXXX
o 16-bit program word
o Muchas otras prestaciones (10 MIPS)
o Gran variedad de perifricos on-chip: Comparadores, PWM, 3 Timers,
Conversores A/D, EEPROM de datos, USART,...
o 32 Niveles de pila hardware
o Interrupciones vectorizadas (internas y externas)

2.2.5.3. Que PIC escogemos?


Como hemos explicado anteriormente, el PIC a escoger ser 16F876 debido a que
actualmente en las clases prcticas ya se utiliza este microcontrolador, con lo cual tendremos

10

Memoria descriptiva

Solucin adoptada

ya los microcontroladores e incluso los kits del ICD-DEBUGER, con lo que nos podemos
ahorrar una gran parte del presupuesto.
Tambin lo elegimos ya que es un micro de gama media. Con lo cual tenemos
funciones de sobra en el micro para poder realizar las prcticas diseadas, he incluso sirve
para posteriores ampliaciones, ya que no gastamos todos los recursos que nos da el
microcontrolador.
Se utilizarn dos PIC debido a que queremos hacer una prctica de comunicacin por
USART y ya que tenemos que utilizar los dos micros utilizaremos el segundo micro tanto en
la simulacin del mdulo para modificar los precios de la EEPROM, como para entregar el
producto seleccionado, ya que para posibles ampliaciones de las prcticas se necesitaran ms
entradas y salidas. De este modo, con este segundo micro se podra seguir ampliando la
mquina.
2.2.5.4. PIC 16F876 y 16F877
A continuacin se exponen las caractersticas principales de estos microprocesador.
Estos PICs disponen de:

Arquitectura Harvard (Memoria de datos y programa separados)


Memoria de datos de 8 bit
Memoria de programa de 14 bit
Lneas E/S de alta corriente
Memoria RAM de 368 Bytes
Memoria de datos EEPROM de 256 Bytes
Memoria FLASH de programa de 14336 Bytes (14bit*8192 word)
3 Puertos de Entrada/Salida (1 de 6 bits, 2 de 8bits) en el 16F876 y 5 Puertos de salida
en el 16F877 (1 de 3 bits, 1 de 6 bits, 3 de 8 bits) en el 16F877
WatchDog (Temporizador especial que hace un reset peridicamente)
Timer de 16bit
2 Timer de 8 bit
5 conversores A/D de 10 bits en el 16F876 y 8 convresores A/D de 10 bits en el
16F877
1 Puerto Serie para comunicacin
1Puerto Paralelo para comunicacin en el 16F877
Posibilidades de interrupciones internas / externas
Posibilidad de interrupcin del Puerto Serie

11

Memoria descriptiva

Solucin adoptada

Figura 2. Diagrama de bloques del PIC 16F876

12

Memoria descriptiva

Prcticas con microcontroladores

2.3. Prcticas con microcontroladores


2.3.1. Consideraciones previas
En los siguientes apartados vamos a explicar los diferentes dispositivos que
necesitamos para poder realizar las prcticas. El teclado, la pantalla de LCD, el kit MPLABICD y una pequea descripcin del funcionamiento del MPLAB.
2.3.2. Descripcin del MPLAB
2.3.2.1. Introduccin programa
En este apartado explicamos el programa que tienen que utilizar los alumnos para
programar y realizar las pruebas sobre el C.
Hay varios programas en la pgina de microchip, la relacin de estos es:

Development
Tools

MPLAB IDE
v6.60

Simulator Part Number

Linker

Library

Integrated
Free
Development Download
Environment Available

Demo
Download Compiler
Available

Assembler

Yes

SW007002

Yes

Yes

Yes

Yes

No

No

Yes

Yes

SW006011

Yes

Yes

No

No

Yes

Yes

Yes

Motor Control
Graphical User
Interface (MCGUI)
MPLAB C18
Application
Maestro
Software
MPLAB C30
MPLAB Visual
Device
Initializer
MPLAB C17
FilterLab filter
design software

No

Yes

Yes

Yes

SW006012

Yes

Yes

No

Yes

Yes

Yes

Yes

Yes

SW006010

Yes

Yes

No

No

Yes

Yes

Yes

No

No

No

Yes

No

No

No

No

Figura 3. Relacin de programas

Como se puede comprobar, el programa que vamos a utilizar es el MPLAB IDE ya


que es el nico con el cual podemos utilizar el kit MPLAB-ICD. La nica diferencia es que
utilizaremos una versin ms antigua, la del MPLAB v4.1 que es la que est instalada en los
ordenadores de los laboratorios de la universidad.
13

Memoria descriptiva

Prcticas con microcontroladores

2.3.2.2. Funcionamiento del MPLAB IDE


Al ejecutar el programa saldr la siguiente pantalla del MPLAB:

Figura 4. Pantalla MPLAB

En la cual se puede ver las diferentes barras de elementos y los diferentes mens. Esto
es como se abrira en el caso de que no se hubiese trabajado anteriormente con l, si no
preguntar si abre los archivos y el proyecto ltimo con el que se estaba trabajando antes de
cerrar por ltima vez.
A nosotros nos interesa como crear un nuevo proyecto. Los pasos a seguir serian ir al
men PROJECT y crear un nuevo proyecto.

Figura 5. Men New Project

14

Memoria descriptiva

Prcticas con microcontroladores

Una vez dado el nombre se abrir la ventana EDIT project donde tenemos que
asignar un nodo al proyecto que ser el archivo .ASM en donde est cdigo del programa a
funcionar.

Figura 6. Ventana Edit project

Por ltimo tenemos que seleccionar el procesador que queremos utilizar e ir a


DEVELOPMENT MODE en donde tenemos que asignar si queremos trabajar como
simulador, que sera simplemente para que funcione el cdigo en el PC simulando el
ordenador al C, o utilizar el MPLAB-ICD Debugger que para ello tenemos que tener el kit
MPLAB-ICD.

Figura 7. Ventana de Development Mode

15

Memoria descriptiva

Prcticas con microcontroladores

Una vez terminada la creacin del proyecto y terminado el cdigo del programa que
queremos probar tenemos que dar al botn de linkiar el programa para crear el archivo que se
tiene que guardar en la memoria de programa del micro.

Para ver
toda la
memoria
RAM

Ejecutar el
programa

Ejecutar
paso a
paso

Para ver el
programa
grabado en
la ROM del
C

Linkar el
programa
para ver si
hay errores

Para ver los


registros
especiales
del C

Figura 8. Barra de herramientas MPLAB

Para ver la memoria de la EEPROM, que lo necesitaremos cuando trabajemos con ella, se
tendra que seleccionar en el men de Windows->EEPROM con lo cual se nos abrira una
ventana donde saldran los valores de la EEPROM.
2.3.3. Explicacin del Kit MPLAB-ICD.
2.3.3.1. Introduccin
Este kit es el sistema a travs del cual comunicamos el PC con el C, a travs de l
conseguimos poder utilizar todas las funciones del MPLAB.
La finalidad de este kit es poder programar un PIC y poder ejecutar el cdigo paso a
paso para probar el funcionamiento del cdigo volcado en el C. Esto es ideal para realizar
nuevos cdigos que estn en un proyecto de una fbrica en el laboratorio de I+D por ejemplo,
o como en nuestro caso, para los laboratorios de clase, ya que el alumno tiene que programar
una y otra vez el cdigo hasta que funcione.
Esta opcin de programar a los C es la ideal por si tienes que reprogramar una y otra
vez el C debido a que tengas que corregir el cdigo debido a que el micro tiene memoria
FLASH.

16

Memoria descriptiva

Prcticas con microcontroladores

Para programar el C una vez el cdigo est correcto se hace de diferentes formas. Si
es una fbrica y tiene que fabricar muchos, los fabrica con el cdigo ya programado con
memoria ROM. Si es un usuario que a lo mejor programa algunos para uso personal lo hace
mediante un programador del tipo T-20, que resulta mucho ms econmico.
2.3.3.2. Caractersticas del MPLAB-ICD Module
Este kit est compuesto de dos partes, una que es el ICD module y la otra es el ICD
Header. El esquema del ICD module es:

Figura 9. MPLAB ICD Module

Esta parte se encarga de comunicarse a travs del puerto serie J2 con el PC y a


travs del conector J3 con el MPLAB Header.

2.3.3.3. Caractersticas del MPLAB-ICD Header


El MPLAB Header sirve para poder conectarlo a un dispositivo de DIP-28 como es el
18F876, o como para un dispositivo DIP-40 como el 18F877. Un esquema de la placa base
sera el siguiente:

17

Memoria descriptiva

Prcticas con microcontroladores

Figura 10. MPLAB ICD Header

2.3.4. Placa base del laboratorio


2.3.4.1.Explicacin placa base del laboratorio
La placa base de la que vamos a hablar ahora es de la que se dipone en laboratorio de
prcticas de la asignatura de Sistemas electrnicos con miro controladores. Dicha placa est
compuesta por un regulador de tensin a 5V, Un conector para una pantalla de LCD y un
conector para un teclado. Que sern explicados en lo siguientes apartados.
2.3.5. Regulador de tensin
Este regulador se coloca en las placas donde tenemos el C para alimentarlo, con el
regulamos la tensin de alimentacin al valor que necesitamos (5V), de tal forma que nos
permite tener una tensin estable para el mejor funcionamiento de nuestro sistema y nos
permite que la fuente de alimentacin de la placa pueda variar entre 8 y 15V
aproximadamente.

18

Memoria descriptiva

Prcticas con microcontroladores

2.3.6. Descripcin Pantalla LCD


2.3.6.1. Introduccin
Un microcontrolador necesita dispositivos para poder comunicarse con el exterior, de
la misma forma que un ordenador necesita un teclado y una pantalla, al Controlador le vamos
a suministrar los teclados de 16 teclas y una pantalla LCD alfanumrica.
La mayora de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro
similar, con lo cual la mayora de estos se programan de forma similar. El tamao de los
caracteres que se muestran son de 5x7 o 5x10 pixels. Todos ellos tienen como mtodo para
escribir los datos a travs de un bus de 8 bits que se conecta al C/P aunque tambin
permiten la conexin a travs de 4 bits, simplemente lo que hacen es dividir los datos a enviar
en dos bloques para enviar los datos.
Hay pantallas de muchos tipos. La forma ms fcil de clasificarlas es por el nmero de
caracteres y por el nmero de lneas (caracteres x lnea) que se pueden introducir. Existen los
siguientes tipos:
8x2
16x1, 16x2, 16x3 y 16x4
20x2 y 20x4
24x2
40x2 y 40x4
2.3.6.2. Que pantalla LCD vamos a utilizar
Para estas prcticas vamos a utilizar las pantallas ya existentes en el laboratorio de
prcticas para abaratar los costes. Son pantallas de 16x2 con retro-alimentacin con 16 pines
de conexin con el C.
2.3.6.3. Funcionamiento de la pantalla LCD
La configuracin de los pins de la pantalla de LCD que vamos a utilizar en las
prcticas es la siguiente:
Asignacin de los pines del JM162A
#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
19

Memoria descriptiva
10
11
12
13
14
15
16

Prcticas con microcontroladores

DB3
DB4
DB5
DB6
DB7
A
K

Bit 3 de dato
Bit 4 de dato
Bit 5 de dato
Bit 6 de dato
Bit 7 (MSB) de dato
Anodo (+) retro-iluminacin
Ctodo (-) retro-iluminacin
Tabla 1. Asignacin de los pins del JM162A

De todos estos pins solamente se van a utilizar 6 de ellos que son los de DB<7:4> para
la comunicacin con el C, no utilizamos los 8 pins para ahorrar salidas en el C. El
inconveniente es que se tarda algo ms en enviar los datos ya que hay que escribir dos veces
en el bus pero la prdida de tiempo es tan pequea que nos sale a cuenta reducir el nmero de
salidas del C.
Los otros dos pins que vamos a utilizar van a ser el RS y RW
Estas pantallas tienen un juego de instrucciones con las cuales podemos ir escribiendo
los datos en la pantalla, los caracteres que queremos escribir es poniendo el cdigo ASCII en
hexadecimal de la letra que queremos poner en el bus de datos, de tal forma que para escribir
una A habra que escribir 40H. El juego de instrucciones de estos teclados es el siguiente:

CODIGO INSTRUCCIN
D D D D D D D
INSTRUCCIN
RS RW B B B B B B B
7 6 5 4 3 2 1
Clear
0
0
0 0 0 0 0 0 0
Display

D
B
0
1

DESCRIPCIN
Escribe 20H en DDRAM y coloca
DDRAM addrees en 00H de AC
Coloca 00H en DDRAM addrees
y vuelve el cursor a la posicin
original
Asigna el movimiento el cursor y si
queremos que el cursor se vea o no
Set Display (D), cursor (C), y
parpadeo del cursor (B) on/off bit
de control
Set cursor moving and display shift
bit de control y la direccin, sin
cambiar la DDRAM data.
Asignar la interface de longitud de
datos (DL:4-bit/8-bit), nmeros de
lneas del display (N:1-lnea/2lneas, Display tipo de fuente(F:0...)

Tiempo
Ejecucin
(fosc =
270KHz)
1.53ms

Return
Home

Entry mode
Set

I/
D

S
H

Display
ON/OFF control

Cursor or
Display Shift

S/ R/
X
C L

Function
Set

D
L

Set CGRAM
Addrees

A
C
5

A
C
4

A
C
3

A
C
2

A
C
1

A
Colocar CGRAM addrees en el
C
contador de direccin
0

39s

Set DDRAM
Addrees

A
C

A
C

A
C

A
C

A
C

A
C

A Set DDRAM addrees en el contador


C de direccin

39s

20

1.53ms
39s
39s

39s

39s

Memoria descriptiva

Read Busy
Flag and
Addrees
Write Data
To RAM
Read Data
From RAM

Prcticas con microcontroladores

B
F

A
C
6

A
C
5

A
C
4

A
C
3

A
C
2

A
C
1

D
7
D
7

D
6
D
6

D
5
D
5

D
4
D
4

D
3
D
3

D
2
D
2

D
1
D
1

0
Whether during internal operation
A
or not can be known by reading BF.
C
The contents of addrees counter can
0
also be read
D Escribir dato en la RAM
0 (DDRAM/CGRAM)
D Leer dato de la RAM
0 (DDRAM/CGRAM)

0s

43s
43s

Tabla 2. Juego instrucciones de la pantalla LCD

2.3.7. Descripcin del teclado


2.3.7.1. Introduccin
El teclado puede ser de dos tipos, 3x4 o 4x4. Aunque nosotros con el de 3x4 para los
teclados del mdulo 1 tenamos bastante, escogemos el teclado de 4x4 ya que es del que se
dispone en el laboratorio y por lo tanto no tendramos que comprar ningn otro teclado.
2.3.7.2. Funcionamiento del teclado
El teclado servir para comunicarnos con el C. La disposicin de las teclas en el
teclado es la siguiente:

Figura 11. Disposicin teclas

En nuetro sistema hay tres teclados y la configuracin de las teclas varia dependiendo
de la utilidad del teclado. La configuracin de dichos teclados no influye en el funcionamiento
del teclado, ya que el C leer que hay una tecla pulsada y dependiendo del teclado que sea
har una cosa u otra. Todo esto se hace por software.

21

Memoria descriptiva

Prcticas con microcontroladores

La configuracin de los diferentes teclados es:

Teclado del monedero

5 CENT

10 CENT 20 CENT CANCELAR

50 CENT

1 EURO

2 EURO

Figura 12. Teclado monedero

Teclado del producto modulo 1


1

ACEPTAR

CANCELAR

Figura 13. Teclado producto mdulo 1

Teclado del producto mdulo 2


1

ENVIAR

RESETEAR

ACEPTAR

CANCELAR

Figura 14. Teclado producto mdulo 2

22

Memoria descriptiva

Prcticas con microcontroladores

El esquema elctrico de estos teclados sera:

4x200O

Figura 15. Esquema elctrico del teclado

Con lo cul, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna, con lo cual dando la fila como entrada y la columna como salida, o viceversa, al
poner un nivel ( 0 o 1) la salida si se pulsa la tecla tendramos que leer el mismo nivel en la
salida.

23

Memoria descriptiva

Descripcin funcional de nuestro sistema

2.4. Descripcin funcional de nuestro sistema


Una vez vista la descripcin de los elementos que se usan para esta prctica, veremos
el funcionamiento general de todo el sistema dando sentido a todos los elementos que
componen los mdulos.
2.4.1. Visin General
El objetivo de este grupo de prcticas es simular una mquina de vending, como ya se
haba mencionado anteriormente. El conjunto de entradas y salidas que componen el sistema
son:

3 teclados.
2 pantallas LCD
Circuito LEDs de cambio
3 pulsadores. 1 para el cambio y 2 para producto.
Display de 7 segmentos
Comunicacin por USART entre los dos mdulos

TECLADO
MONEDERO

TECLADO
PRODUCTO

PRACTICA 1
TECLADO

PANTALLA
LCD

TECLADO
PRODUCTO

PRACTICA 3
PEDIR
PRODUCTO

PRACTICA 2
CAMBIAR
PRECIO

MODULO 1
PRACTICA 4
DAR CAMBIO

LEDs
CAMBIO

PANTALLA
LCD

MODULO 2
PRACTICA 5
COMUNICACIN
USART

PRACTICA 6
COMUNICACIN
USART

PULSADOR PULSADOR LED DAR


CAMBIO
PRODUCTO PRODUCTO

PULSADOR LED DAR


PRODUCTO PRODUCTO

Figura 16. Diagrama de bloques de entradas y salidas

24

DISPLAY

Memoria descriptiva

Descripcin funcional de nuestro sistema

Como se puede ver en el diagrama de bloque de entrada y salida el mdulo 1 se


encarga de todo lo que es el control del dinero, ya que tiene las entradas y las salidas de las
monedas y se encarga de la seleccin del producto. Hay un pulsador de producto y el LED de
entregar el producto que se sera lo que faltara para poder entregar los productos. Esta entrada
y salida se ha puesto para poder realizar una de las prcticas que componen el cdigo de este
mdulo.
Con este mdulo podemos simular el monedero de la mquina para la entrada y salida
del dinero a introducir, revisar y controlar si se ha pagado el producto y dar el cambio si se da
el caso.
El mdulo 2 se hizo para crear alguna prctica para usar la USART del C. Lo que se a
hecho con el mdulo 2 es un sistema para poder cambiar los precios de los productos en
simulacin como si fuese un pequeo aparato en el que se graban los precios y que se
conectase a la mquina de vending y le transfiriese todos los precios de lo productos.
Al mismo tiempo ya que tenamos creado el mdulo, lo hemos aprovechado para que
hiciese el control de productos debido a que el PIC del mdulo 1 estaba saturado y pensando
en posteriores ampliaciones del sistema. La comunicacin entre los dos mdulos para el
control de productos se har tambin por USART. Con lo cual la comunicacin por USART
servir para el producto y para modificar el precio del producto.
Para la comunicacin con la USART lo suyo sera con un sistema RS232 utilizando el
chip MAX232 y un conector del tipo serie. Pero para nuestro sistema hemos pensado conectar
cruzados los pins RX y TX de los dos micros ya que con ello ahorramos dispositivos y lo
nico que perdemos es calidad de transmisin, cosa que para las prcticas no es
imprescindible.
2.4.2. Funcionamiento
2.4.2.1. Funcionamiento general
El funcionamiento de esta simulacin de mquina de vending, es parecido a cualquier
mquina de vending de las que existen en la calle. El sistema est esperando a que se
introduzca una moneda o que se seleccione un producto. Una vez que se selecciona un
producto se revisa si hay suficiente dinero para pagarlo y se revisa si hay producto para ver si
se ha agotado, en el caso de que todo vaya bien, pasara a calcular el cambio, a dar el cambio
y a entregar el producto. En el caso de haber algn error durante el proceso de elegir un
producto saldr un error por la pantalla y se cancelar el proceso.
El mdulo 2 se encarga de modificar los precios de la mquina primero guardando los
datos en este mdulo y por ltimo transmitiendo todos los precios. En este mdulo al mismo
tiempo que se modifican los precios tambin se hace el control sobre los productos, de tal
forma que cuando se tiene que pedir un producto o dar un producto se enva una seal a este
modulo y este tiene gue responder dependiendo de si hay producto o no.

25

Memoria descriptiva

Descripcin funcional de nuestro sistema

2.4.2.2. Funcionamiento Mdulo 1


El mdulo 1 est compuesto por los siguientes elementos de entrada o salida:

El teclado que simula el monedero


El teclado para introducir el nmero del producto
La pantalla LCD
El sistema de LEDs para devolver las monedas
El LED de entregar producto
El interruptor de Cambio
El interruptor de Producto
El conector para la comunicacin con el mdulo 2

Este mdulo como hemos dicho anteriormente se encarga de la seleccin del producto
y de simular el monedero. Para ello disponemos de los dos teclados que mientras no est
realizando otra operacin estar mirando si se ha pulsado una de las teclas de cualquiera de los
dos teclados.
Si se pulsa una tecla del teclado del monedero, el C deber mirar que tecla ha sido la
pulsada y actuar en consecuencia. Si es la tecla de una moneda deber incrementar la cantidad
de dinero que ha sido pagada y mostrarla por la pantalla del LCD y si se pulsa la tecla de
cancelar se tendr que devolver el dinero que haya sido introducido hasta ese momento.
Si la tecla pulsada es del teclado producto deber revisar si es un nmero o la tecla
aceptar o cancelar. Si es un nmero deber procesar la tecla para conseguir el nmero del
producto que el usuario quiere pedir, una vez seleccionado un producto saldr el precio por la
pantalla del LCD, dicho precio est en la EEPROM del C y el micro esperar a que se pulse
la tecla Aceptar o Cancelar para seguir el proceso.
Si es la tecla Cancelar sirve para que el usuario cancele el proceso de la seleccin.
Esto puede servir por si el usuario se equivoca al seleccionar el producto o ve que la cantidad a
pagar es mayor de la que ha introducido.
En el caso de que sea la tecla Aceptar solamente la procesar cuando ya se haya
seleccionado el producto, ya que en cualquier otro caso no hara nada y esperara otra tecla.
Cuando se haya pulsado y el producto ya se haya seleccionado, lo primero que debe hacer el
mdulo es revisar si se ha pagado el producto seleccionado y despus revisar si hay producto,
es decir, que no se ha agotado. En este caso lo haremos a travs de la comunicacin USART
que se le preguntar al otro mdulo si existe el producto., tambin hay otra forma que se
explicar al final.
Si recibimos respuesta positiva del otro mdulo conforme que hay producto,
continuara el proceso calculando el cambio a dar y en el caso de que hubiese que dar cambio
se revisara si existe cambio. Para ello mirara el interruptor de CAMBIO, que dependiendo
de su estado nos dira si hay cambio o no. Este sistema es una forma fcil de controlar si hay
cambio o no y se pens pensando en algn dispositivo que calcula las monedas que quedan o

26

Memoria descriptiva

Descripcin funcional de nuestro sistema

de alguna otra forma y que al final lo que hace es mandar una seal de aviso conforme no hay
cambio, que sera el interruptor que hemos puesto. Esta parte que revisa las monedas que hay
para cambio o el sistema que sea podra realizarse en una prxima revisin del proyecto.
Si hubiese que dar el cambio utilizara el sistema que he diseado para entregar las
monedas, que es un decodificador de 3 bits con LEDs, en el cual cada LED representa una de
las monedas a entregar. El micro debera calcular las monedas a devolver una a una e ir
entregndolas.
Por ltimo debera entregar el producto que como en caso de preguntar si haba
producto existen dos posibilidades, nosotros escogemos el pedir el producto al mdulo 2
mediante la comunicacin USART. La otra posibilidad se explicar al final junto con la
posibilidad de pedir producto.
Una vez pedido el producto, el C se inicializar y se quedar esperando a que se pulse
una nueva tecla.
Al igual que este mdulo pregunta si hay producto o da el producto comunicndose
con el otro mdulo, el otro mdulo puede modificar los precios de este. Lo que hace es volcar
la EEPROM del mdulo 2 en este mdulo, con lo cual cuando recibamos una interrupcin por
recepcin de datos, hay que revisar si es para modificar la EEPROM y en el caso de que as
sea, parar el proceso de dar el producto y no permitir que nadie pueda entrar monedas ni
seleccionar producto mientras se modifican los precios de la EEPROM.
En el caso de que durante el proceso de entregar el producto hubiese algn tipo de
problema del tipo que no existiese el producto seleccionado, no se hubiese pagado, no hubiese
producto o no hubiese cambio, el C saca un mensaje por la pantalla de LCD diciendo el tipo
de error, se cancelara el proceso, se inicializaran los registros y se quedara esperando a que
se pulsase una tecla.
Por ltimo, vamos a explicar la otra opcin que hay para preguntar si hay precio y para
dar producto. Para preguntar si hay precio se podra hacer revisando el estado del interruptor
de producto. Este interruptor esta aqu debido a que en una de las prcticas no se utiliza la
transmisin y lo hace de esta forma para saber si hay producto. Para dar el producto hay un
LED que podemos encender cuando demos el producto. Este LED est aqu por si realizamos
la prctica 4 en la que no usamos comunicacin con el otro mdulo como pasaba en el caso
del interruptor del producto.
2.4.2.3. Funcionamiento Mdulo 2
El mdulo 2 est compuesto por los siguientes elementos de entrada o salida:

El teclado para introducir el nmero del producto


La pantalla LCD
El sistema del DISPLAY para ver el nmero del producto que piden
El LED de entregar producto

27

Memoria descriptiva

Descripcin funcional de nuestro sistema

El interruptor de Producto
El conector para la comunicacin con el mdulo 1

Este mdulo, como ya se ha dicho, se encarga de gestionar los productos y de


guardar los precios para despus enviar los precios al mdulo 1 y modificarlos.
El funcionamiento de este mdulo es que una vez inicializado se pone a testear el
teclado de producto a la espera de que se pulse una tecla o de que se active la interrupcin por
recepcin de datos.
Si se pulsa una tecla del teclado el C deber mirar que tecla ha sido la pulsada y
actuar en consecuencia. Si se pulsa la tecla RESETEAR el programa nos debera pedir la
confirmacin para borrar todos los precios que estn almacenados en la EEPROM.
La tecla CANCELAR sirve para parar el proceso de la modificacin de precio y para
la confirmacin de borrar la memoria. La tecla ACEPTAR sirve para confirmar el cambio
de precio, confirmar el borrar la memoria y para comenzar la comunicacin con el mdulo 1
para cambiar los precios.
La tecla ENVIAR sirve para enviar los precios guardados en la EEPROM al mdulo
1 de tal forma que cuando se pulsa nos pide la confirmacin y comienza a enviar los datos.
Las teclas numricas son para seleccionar el producto al que queremos modificar el
precio y para insertar el nuevo precio.
Para modificar un precio, primero hay que seleccionar el producto y una vez que se ha
seleccionado nos presentar por la pantalla LCD el precio actual que tiene el producto y se
queda a la espera de introducir el nuevo precio. Una vez insertado el nuevo precio se debera
confirmar y entonces modificar de la EEPROM el precio del producto.
Para ver el precio de un producto se puede utilizar el mismo mtodo que el de cambiar
el precio, con la diferencia de que una vez seleccionado el producto y salido el precio, cuando
nos pida el precio nuevo debemos cancelar el proceso con lo cual no se modifica dicho precio.
Para enviar los precios al mdulo 1 hay que pulsar la tecla ENVIAR. Entonces nos
pedira la confirmacin para enviar los datos. Una vez confirmada la operacin comenzara el
proceso de comunicacin.
En cualquier momento se puede recibir una interrupcin por la recepcin de datos
debido a que el otro mdulo puede peguntar si hay un producto o dar la orden de dar un
producto.
En el caso de recibir la pregunta sobre si hay un producto lo que tiene que hacer el C
es parar el proceso de cambiar un precio y no permitir que se pueda introducir ninguna tecla
por el teclado. Despus debera ensear el nmero del producto por el display y revisar si hay

28

Memoria descriptiva

Descripcin funcional de nuestro sistema

producto, lo cual se hace mirando el estado del interruptor del producto. Por ltimo
respondera al mdulo 1 diciendo si hay o no producto.
En el caso de recibir la orden de dar el producto tendra que poner el nmero del
producto en el display como antes y entonces encender el LED de dar producto.
En posteriores revisiones del proyecto estas salidas pueden servir perfectamente para
montar algn tipo de dispositivo, como una serie de multiplexadores, de tal forma que en vez
de leer el interruptor o encender el LED se puedan leer diferentes sensores o algo parecido.

29

Memoria descriptiva

Descripcin circuital

2.5. Descripcin circuital


2.5.1. Introduccin
En este apartado se explican los eslementos electtricos y los conectores que estn en
los modulos en el siguiente diagrama de bloques veremeos los diferentes sistemas que vamos a
utilizar:

MDULO 1

REGULADOR
DE
TENSIN

CONECTOR
PANTALLA LCD

CONECTOR
TECLADO
PRODUCTO

PIC 16f876

CONECTOR
TECLADO
MONEDAS

DECODIFICADOR
74LS138

Figura 17. Diagrama bloques esquema elctrico Mdulo 1

MDULO 2

REGULADOR
DE
TENSIN

CONECTOR
PANTALLA LCD

DECODIFICADOR
DE BCD
A 7 SEGMENTOS
7447
Y DIPLAY

PIC 16f876

CONECTOR
TECLADO
PRODUCTO

Figura 18. Diagrama bloques esquema elctrico Mdulo 2

A contiuaciun se explican todos los bloques de cada mdulo.

30

Memoria descriptiva

Descripcin circuital

2.5.2. Circuito regulador de tensin


El circuito regulador de tensin va en lo dos mdulos. Este circuito sirve, como bien
dice el nombre, para regular la tensin de entrada a 5V para alimentar el PIC y los diferentes
componentes de los mdulos. El sentido de este circuito es para regular y mantener constante
la tensin de 5V independientemente de las variaciones que tengamos en la entrada del
circuito, siempre que estn entre un margen de 8 a 15V aproximadamente.
El LED que est puesto a la salida del regulador LM7805 es simplemente para ver que
el circuito est conectado
Este circuito est compuesto por:

2 condensadores de polister 100nF


1 condensador electroltico 47F
1 resistencia de 1k
1 regulador de tensin LM7805
1 conector de 2 pins para conectar la placa a la fuente de alimentacin
1 LED rojo de 5mm

U1
LM7805CT

J1

Vreg
IN

HDR1X2

LED1

47uF

100nF

C1

C2

OUT

100nF

C3

LED_red

R1
1.0kohm

Figura 19. Regulador de tensin 5V

2.5.2. El microcontrolador
Recordemos las principales caractersticas de un microcontrolador. Un C est
formado principalmente por:
CPU (Unidad Central de Proceso), que es el microprocesador del sistema.
Memoria de programa, que puede ser:
o ROM:
Dispositivo grabado en fbrica
o EPROM: Dispositivo grabable y borrable (Mediante UV)
o EEPROM Dispositivo regrabable in-system con VPP = 12 v
o FLASH: Dispositivo regrabable in-system
Memoria voltil de datos:
o RAM:
Almacenamiento de variables del programa

31

Memoria descriptiva

Descripcin circuital

o SFR:
Special Function Registers, usados para controlar los
perifricos, configuraciones, interrupciones,...
Memoria no voltil de datos:
o EEPROM o FLASH
Puertos de Entrada / Salida
Timers

El PIC que hemos elegido para montar nuestro circuito es el PIC 16F876 y consta de:
Arquitectura Harvard (Memoria de datos y programa separados)
Memoria de datos de 8 bit
Memoria de programa de 14 bit
Lneas E/S de alta corriente
Memoria RAM de 368 Bytes
Memoria de datos EEPROM de 256 Bytes
Memoria FLASH de programa de 14336 Bytes (14bit*8192 word)
3 Puertos de Entrada / salida (1 de 6 bits, 2 de 8 bits)
WatchDog (Temporizador especial que hace un reset peridicamente)
1 Timer de 16 bit
2 Timer de 8 bit
5 conversores A/D de 10 bits
1 Puerto Serie por comunicacin asncrona full-duplex
Posibilidad de interrupcin por el Puerto Serie
Seguidamente, vemos el esquema del patillaje del PIC 16F876

Figura 20. Esquema patillaje del PIC 16F876

Funciones de cada uno de los pins del PIC 16F876

32

Memoria descriptiva

Nombre del Pin

OSC1/CLKIN
OSC2/CLKOUT
MCLR*/Vpp

Descripcin circuital

N
de
Pin
9
10

Tipo
E(4) /S(5)
/P(6)
E
S

ST/CMOS(3)
-

E/P

ST(7)

Tipo de
Buffer

Descripcin

Entrada oscilador de cristal/Entrada de reloj externo


Salida oscilador de cristal. En modo RC, el pin OSC2
es la salida CLKOUT, el cual tiene una de la
frecuencia de OS1 y denota el tiempo de ciclo de
instruccin
Entrada Master Clear (Reset) o entrada de tensin y
programacin. Este pin es un RESET del dispositivo
activo por nivel bajo

PORTA es un Puerto de E/S bidireccional

RA0/AN0
RA1/AN1
RA2/AN2/Vref-

2
3
4

E/S
E/S
E/S

TTL(8)
TTL
TTL

RA3/AN3/Vref+

E/S

TTL

RA4/T0CKI

E/S

ST

RA5/SS*/AN4

E/S

TTL

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC

21
22
23
24
25
26
27

E/S
E/S
E/S
E/S
E/S
E/S
E/S

TTL/ST(1)
TTL
TTL
TTL
TTL
TTL
TTL/ST(2)

RB7/PGD

28

E/S

TTL/ST(2)

RA0 puede tambin ser la entrada analgica 0


RA1 puede tambin ser la entrada analgica 1
RA2 puede tambin ser la entrada analgica 2 o
el nodo negativo de la referencia de tensin
analgica
RA3 puede tambin ser la entrada analgica 3 o
el nodo positivo de la referencia de tensin
analgica
RA4 puede tambin ser la entrada de reloj del
Timer 0. La salida es del tipo colector abierto.
RA5 puede tambin ser la entrada analgica 5 o
el selector de esclavo para puerto serie asncrono
PORTB es un puerto de E/S bidireccional. Puede ser
programado por software para habilitar pull-ups
internos en todas las entradas
RB0 puede tambin ser el pin de interrupcin externo

RB3 puede ser la entrada de baja tensin de


programacin

Pin de interrupcin en cambio de estado


Pin de interrupcin en cambio de estado
Pin de interrupcin en cambio de estado o pin para
programacin In-Circuit_Debugger. Reloj de
programacin serie.
Pin de interrupcin en cambio de estado o pin para la
programacin In-CircuitDebugger. Datos en la
programacin serie.
PORTA en un Puerto E/S bidireccional
RC0 puede tambin ser la salida de oscilador del Timer
1 o la entrada de reloj el Timer 1
RC1 puede tambin ser la entrada del oscilador del
Timer 1 o la entrada de Captura2/salida de
Captura2/salida PWM2

RC0/T1OSO/T1CKI 11

E/S

ST

RC1/T1OSI/CCP2

12

E/S

ST

RC2/CCP1

13

E/S

ST

RC2 puede tambin ser la entrada de Captura1/salida de


Captura1/salida PWM1

RC3/SCK/SCL

14

E/S

ST

RC4/SDI/SDA

15

E/S

ST

RC3 puede tambin ser la entrada de reloj del puerto


serie asncrono para modos SPI y IIC.
RC4 puede tambin ser la entrada de datos SPI (modo
SPI) o el E/S de datos en el modo IIC

RC5/SDO

16

E/S

ST

33

RC5 puede tambin ser la salida de datos SPI (modo


SPI)

Memoria descriptiva

Descripcin circuital

RC6/TX/CK

17

E/S

ST

RC6 puede tambin ser el pin de transmisin en


USART o el reloj asncrono

RC7/RX/DT

18

E/S

ST

8,19
20

P
P

RC7 puede tambin ser el pin de recepcin en USART


o los datos en modo asncrono
Referencia de tierra

Vss
Vdd

Entrada de tensin positiva

Tabla 3. Funciones de los pins en el PIC 16 F876

(1) Este buffer es una entrada Schmitt Trigger cuando la configuramos como interrupcin externa
(2) Este buffer es una entrada Schmitt Trigger cuando la usamos en modo de programacin Serie
(3) Este buffer es una entrada Schmitt Trigger cuando la configuramos en modo oscilador RC y como
entrada CMOS
(4) E = Entrada
(5) S = Salida
(6) P = Power
(7) ST = Entrada Schmitt Trigger
(8) TTL = Entrada TTL

2.5.3. Decodificador 74LS138


Para devolver el cambio o la cantidad de dinero pagada, he pensado en un sistema en el
mdulo 1 que tiene que dar una seal para cada una de las diferentes monedas que tenemos
que devolver. Las monedas para dar el cambio sern 5 (5, 10, 20 y 50 cntimos y la de 1 )
Para no utilizar 5 salidas del C utilizaremos una codificacin para estas monedas, con
lo cual con tres salidas RA<2:0> sera suficiente y a posterior utilizaremos el 74LS138 para
decodificarlas. Las salidas del 74138 atacarn a unos LEDS que corresponden a la moneda a
entregar.
A continuacin ponemos la codificacin que he empleado para las monedas
RA0-RA2
(0,0,0)
(0,0,1)
(0,1,0)
(0,1,1)
(1,0,0)
(1,0,1)
(1,1,0)
(1,1,1)

MONEDA
NO
CONECTADO
5 CENTIMOS
10 CENTIMOS
20 CENTIMOS
50 CENTIMOS
1 EURO
NO
CONECTADO
NO
CONECTADO

Tabla 4. Codificacin monedas

34

Memoria descriptiva

Descripcin circuital

La tabla de la verdad del 74138 es:

Tabla 5. Tabla de la verdad del 74138

El circuito est compuesto por:

Decodificador/demultiplexor de 3 a 8 lneas 74138


5 LEDS verdes de 5mm
Resistencia SIP 1x8 de 1K
El esquema elctrico del circuito es:

LED_green
5 centimos

VDD
RA0

U1
15

Y1

Y2
Y3

~G2A

Y6
Y7

10
9
7

LED_green
50 centimos

~G2B

Y5

LED_green
20 centimos

G1

11

12

13

5V

Y4

LED_green
10 centimos

14

RA3

Y0

RA1

R1

4.7kOhm

74LS138N

LED_green
1 euro

Figura 21. Esquema elctrico del circuito

35

5V

Memoria descriptiva

Descripcin circuital

2.5.4. Decodificador de BCD a 7 segmentos 7447 y display


Esto se encuentra en el mdulo 2. Su funcin es que cuando recibe el mdulo 2 la
orden de dar el producto o cuando pregunta por algn producto, aparte de realizar otras
operaciones debe mostrar por los diplays el nmero del producto sobre el que pregunta o da.

Figura 22. Conexiones y esquema display

La tabla de la verdad del 7447 es:

Tabla 6. Tabla de la verdad del 7447

36

Memoria descriptiva

Descripcin circuital

El circuito del 7447 y del display esta compuesto por:

14 Resistencias de 1k
2 chips decodificadores de BCD a 7 segmentos 7447
2 Displays SA-0511
El esquema del circuito es:

VDD

5V

RA4

RB2

RB1

5VRB3

RB0

RA3

U1

VDD

U2

7
1
2
6

3
5
4

SEVEN_SEG_DISPLAY

ABCDEFG

13
12
11
10
9
15
14

A
OA
B
OB
C
OC
D
OD
OE
LT OF
RBI OG
BI/RBO

74LS47N
ABCDEFG

R8

1.0kohm
1.0kohm

R2

R9

1.0kohm
1.0kohm

R3

R10

1.0kohm
1.0kohm

R4

R11

1.0kohm
1.0kohm

R5

R12

1.0kohm
1.0kohm

R6

R13

1.0kohm
1.0kohm

R7

R14

1.0kohm
1.0kohm

Figura 23. Esquema del circuito

37

13
12
11
10
9
15
14

R1

7
1
2
6

3
5
4

A
OA
B
OB
C
OC
D
OD
OE
LT OF
RBI OG
BI/RBO

U4 SEVEN_SEG_DISPLAY

U3
74LS47N

Memoria descriptiva

Descripcin circuital

2.5.5. El teclado
El teclado es el elemento con el cual entramos datos en el C como hemos dicho antes.
Lo conectamos a travs de un cable paralelo de 10 pins. Hay que tener en cuenta que hay tres
teclados por la tanto las conexiones son diferentes para cada uno.
Sabiendo que el esquema elctrico del teclado es:

4x200
O

Figura 24. Esquema elctrico del teclado

Vamos a explicar las conexiones de los conectores a los C de los mdulos. El teclado
del monedero tiene la siguiente configuracin:

RA3

R1

R2

10kohm

10kohm

J1

RA4

RC0

RC1

RC2

RC3

HDR2X5

Figura 25. Configuracin teclado monedero

38

Memoria descriptiva

Descripcin circuital

El teclado de seleccionar producto del mdulo 1:

RC0

RC1

J1

RC2

RC3

RB0

RB1

RB2

HDR2X5

R3

R1

R2

10kohm

10kohm

10kohm

Figura 26. Teclado seleccin producto mdulo 1

El teclado de seleccionar producto del mdulo 2:

RC0

RC1

J1

RC2

RC3

RA0

RA1

RA2

RA3

HDR2X5

R3

R1

10kohm 10kohm

R2

R4

10kohm 10kohm

Figura 27. Teclado seleccin producto mdulo 2

39

Memoria descriptiva

Descripcin circuital

Como se puede comprobar, los teclados de seleccionar producto de los mdulos son
prcticamente iguales. El del monedero es un poco diferente, ya que por esttica hemos
cambiado las filas por las columnas, cosa que a nivel de hardware no comporta ninguna
dificultad pero a nivel de software hay que tenerlo en cuenta para poder leer correctamente las
filas y las columnas.
2.5.6. Pantalla LCD
Tanto aqu como en el apartado anterior, vamos a explicar las conexiones del C con la
pantalla del LCD. Para ello utilizamos un conector de 16 para cable paralelo. Las conexiones
de la pantalla al conector son las siguientes:

Figura 28. Conexiones pantalla LCD al conector

Tenemos que utilizar dos pantallas de LCD, una para cada mdulo. El
esquema de conexin del mdulo 1 es:
VCC
J1
RB3
RB4

RC0

RC1

RC2

RC3

RIBBON_16H
Figura 29. Esquema conexin mdulo 1

40

Memoria descriptiva

Descripcin circuital

Y el del mdulo 2 es:

VCC
J1
RB4
RB5

RC0

RC1

RC2

RC3

RIBBON_16H
Figura 30. Esquema conexin mdulo 2

Como se puede observar es muy parecido en los dos mdulos. Lo que hay que tener en
cuenta es que como se puede comprobar, los pins DB<3:0> no se utilizan y esto ocurre porque
en vez de enviar los datos en paquetes de 8 bits, los enviamos en paquetes de 4 bits, con lo
cual se ahorra pins de salida del C, aunque perdemos en tiempo de ejecucin ya que hay que
pasar dos veces los datos para poder enviarlos.

41

Memoria descriptiva

Prcticas a realizar

2.6. Prcticas a realizar


2.6.1. Introduccin
En este apartado vamos a poner las prcticas que he diseado para ser realizadas por
los alumnos. Estas prcticas se han intentado que sean lo ms independientes posible del resto,
aunque si al final de las prcticas se intentan unir todas en una sola, hay que tener una serie de
factores para poder unirlas.
A continuacin se exponen los enunciados de las prcticas realizadas. En ellas se
pueden observar los siguientes apartados:

Equipos y materiales: En este apartado se dicen los materiales necesarios para la


prctica a realizar.
Descripcin del funcionamiento: Aqu vamos a dar un resumen de lo que tiene que
hacer la prctica a realizar.
Funcionamiento del teclado: Se hace una explicacin de como va el teclado y la
configuracin del mismo.
Funcionamiento del display: Se hace una breve explicacin del funcionamiento de la
pantalla deLCD.
Bases tericas: Una explicacin ms detallada de lo que tiene que hacer el programa.
Explicacin del esquema elctrico: Una breve explicacin de cmo es el esquema
elctrico.
Resumen de objetivos: Aqu se muestran los objetivos a realizar por el alumno en la
prctica.
Diagrama de flujo: Son los diagramas de flujo de un ejemplo de cmo podra
funcionar la prctica
Otros: En algunas practicas se ha aadido algn otro apartado para as poder explicar
algn tipo de componente que se utiliza en ella.

2.6.2. Enunciados de prcticas

42

2.6.2.1.

1.1

Prctica nm.1
Monedero
Equipos y materiales:

Para realizar la prctica utilizaremos:


Ordenador PC
Software MPLAB
Teclado de 16 teclas
Display SAMSUNG KS0070
Cable plano de 16

10
Cable comunicacin puerto serie
Kit MPLAB-ICD debugger
PIC 16F876
1.2

Descripcin del funcionamiento

En sta prctica tenemos que programar el chip para simular un monedero de una
mquina de autoservicio. Para ello, el microcontrolador debe interpretar una serie de seales
que vienen de un teclado que simular el detector de monedas de la mquina autoservicio, para
ver su funcionamiento leer el apartado 1.3.
Una vez se haya detectado una moneda, se debera incrementar el valor de dicha
moneda en un registro que nos ir diciendo la cantidad de dinero que tenemos introducido.
Este registro lo llamaremos PAGADO y tendr el formato que se explica en el apartado 1.5.
En ste teclado, adems de las teclas que corresponden a las monedas a introducir,
tambin existir una tecla que nos servir para la devolucin de la cantidad introducida, la cul
resetear el registro PAGADO (del que se ha hablado anteriormente) y proceder a la
devolucin del dinero.
Como en toda mquina, habr una cantidad mxima de dinero para insertar. sta
cantidad depender del valor mximo de los precios que fijaremos o de las limitaciones de
hardware o software que tengamos. Si superamos este valor mximo, nos deber devolver la
ltima moneda introducida y no incrementar el valor de lo que llevamos pagado. Para fijar
dicho valor mximo leer el apartado 1.5.
Por ltimo, dispondremos de un display para poder ver la cantidad de dinero que
llevamos introducido. Para ver el funcionamiento del display y el formato con el que tenemos
que escribir los datos leer el apartado 1.4 y 1.5 respectivamente.

43

1.3

Funcionamiento del teclado

Para poder simular el detector de monedas, utilizaremos un teclado en el cual a cada


tecla se le asignar el valor de una moneda. Aparte, en el mismo teclado existir una tecla que
servir para cancelar la cantidad de dinero que llevamos insertado en ese momento y proceder
a su devolucin. La disposicin de las teclas podra ser la siguiente:
5
CNTIMOS

10
CNTIMOS

20
CNTIMOS

CANCELAR

50
CNTIMOS

1 Euro

2 Euros

Tabla 1
El teclado consta de una serie de interruptores conectados de la siguiente manera:
Con lo cul, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna.

4x200O

Figura 1

44

1.4

Funcionamiento del display

Las pantallas de cristal lquido LCD (Liquid Crystal Display) alfanumricas se


clasifican segn el nmero de caracteres y lneas que pueden mostrar. Las configuraciones
ms usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayora
de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuracin y anejo es bastante similar en muchos de ellos. El tamao de los
caracteres que muestran son de 5x7 o 5x10 pxels. Permiten modos de interface de 4-bits u 8
bits a P/C. Por otro lado muchos tambin incorporan retro-iluminacin por diodos led
verde, para facilitar su lectura. Para la conexin de un LCD con un sistema electrnico se
disponen generalmente de 14 pins con la siguiente asignacin de la Tabla 2. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminacin. En el caso de la
JM162A, se aaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2
Tabla 2. Asignacin de los pines del JM162A
#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
10
DB3
Bit 3 de dato
11
DB4
Bit 4 de dato
12
DB5
Bit 5 de dato
13
DB6
Bit 6 de dato
14
DB7
Bit 7 (MSB) de dato
15
A
Anodo (+) retro-iluminacin
16
K
Ctodo (-) retro-iluminacin

Figura 2

45

1.5

Bases tericas

Esta prctica utiliza un detector de monedas. Un detector de monedas tiene varios


sensores que dependiendo de la moneda insertada, envan una seal u otra al
microcontrolador que lleva, el cual se encarga de averiguar el tipo de moneda insertada.
Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro
debe hacer es interpretar las seales de entrada y salida que estn conectadas al teclado, con lo
cual al apretar por ejemplo la tecla de 1 EURO se debera incrementar la cantidad de dinero
que llevamos insertada en 1.
Para memorizar el dinero introducido lo haremos en un registro que llamaremos
PAGADO el cual como todos los registros del micro son de 8 bits, su escala ir de 0 a 255
cntimos. Entonces, para poder superar los 255 cntimos introducidos, como la cantidad de
dinero insertado es siempre mltiple de 5, debido a que almoneda ms pequea ser la de
5centimos, la vamos a guardar en el micro dividindola entre 5, como se explica en el
siguiente ejemplo:
Dinero insertado() Valor en registro PAGADO
2,00
40
12,00
240
0,75
15
0,05
1
1,25
25
12,75
255
Con lo cual podemos guardar en 1 registro 12,75. Aunque existen otros sistemas,
como por ejemplo guardarlo en 2 registros, utilizaremos este sistema para hacer compatible el
registro con el resto de las prcticas.
Si apretamos la tecla CANCELAR el micro debera poner a cero la cantidad de
dinero que llevamos insertada y llamar a una funcin que nos devolvera el dinero
introducido.
En nuestra prctica, se debera detectar si se supera el mximo de dinero permitido
insertado. Dicha cantidad mxima, se fijar a un valor y no nos permitira superar esta
cantidad, al mismo tiempo que llamara a una funcin que nos devolvera la ltima moneda
introducida, una cantidad mxima para esta prctica puede ser simplemente los 12,75 que es
lo mximo que podemos introducir en el registro de PAGADO
Al mismo tiempo que el micro hace las operaciones con el dinero introducido en la
mquina, el micro nos debe sacar por la pantalla del LCD la cantidad de dinero insertada.

46

El formato de presentacin puede ser este:


D

D - Cantidad de dinero insertado en la mquina


PG Es lo que tiene que poner para especificar que es lo pagado
Ejemplo:
0

5V

5V

4.7kohm
RIBBON_16H

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1 VDD
OSC2 VSS1

22pF

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

16F876

2x10K
RIBBON_10H

47

5V

10nF

1.6

Explicacin esquema elctrico

Como se puede ver en el esquema elctrico (Fig.2) utilizaremos RC<3:0> como salidas
para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS
y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del
LCD, ver las caractersticas tcnicas adjuntadas en las prcticas y el apartado 1.4
Funcionamiento del display.
Una posibilidad para controlar el teclado sera RC<3:0> como salida y RA<4:3> como
entrada. El funcionamiento sera que al proporcionarle tensin a una de las salidas de RC, si
pulssemos cualquiera de las dos teclas que estn conectadas a la columna activada, en RA
obtendramos un 1 ya que comunicaramos la columna con la fila. Si pulssemos la misma
tecla y la columna no estuviese activada, en RA obtendramos un 0. Ver apartado 1.3
Funcionamiento del teclado.
1.7

Resumen de objetivos

Tenemos que hacer el cdigo para:


-

Que se reconozcan los pulsadores cuando apretemos las teclas.

Cuando sea una moneda se debera incrementar el registro PAGADO con la


cantidad de la moneda seleccionada.

En el caso de que no sea una moneda


o Que no haga nada si es la tecla E
o Que si se aprieta la tecla F se ponga a 0 la cantidad de dinero insertada y
se llame a una funcin para proceder a la devolucin del dinero, que se
realizar en la prctica de devolucin de dinero.

En el caso de superar una cantidad de dinero ya fijada, que puede ser por ejemplo
la cantidad mxima que se puede almacenar en PAGADO (12,75 ) u otra
cantidad que creemos en otra variable, no incrementar la cantidad de dinero
insertado y llamar a una funcin para devolver la ltima moneda introducida, sta
funcin puede ser la misma que la de devolucin del dinero pasndole la moneda a
devolver

Se tendr que poner en la pantalla del LCD la cantidad de dinero insertada con el
formato explicado anteriormente.

1.8

Objetivos de conocimiento

Aprender control de teclado y pantalla LCD

Conversiones de datos entre diferetnes tipos de numeracin en un microcontrolador

48

1.9

DIAGRAMA DE FLUJO

INICIO

TESTEAR
TECLADO

TECLA
APRETADA?

NO

SI

SI

DEVOLVER
PAGADO

TECLA
CANCELAR?

INICIAR
LCD

NO

SI
TECLA
1,2,3,4,5 o 6?

NO
SE SUPERA
EL MXIMO?

ACTUALIZAR
CANTIDAD
DE DINERO
PAGADO

SI
NO

DEVOLVER
LTIMA
MONEDA
INSERTADA

ESCRIBIR
NUEVA
CANTIDAD
EN LCD

Como se puede ver, esta sera una posible solucin simple para el problema
dado.

49

Prctica nm.2
Modificar precio

2.6.2.2

2.1

Equipos y materiales:

Para realizar la prctica utilizaremos:


Ordenador PC
Software MPLAB
Teclado de 16 teclas
Display SAMSUNG KS0070
Cable plano de 16

10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
2.2

Descripcin del funcionamiento

En sta prctica tenemos un teclado (ver aparatado 2.3), el cul nos sirve para
introducir el nmero del producto (a cada producto le asignaremos un nmero). Una vez
introducido dicho nmero, debera salir el precio actual de ste producto.
A continuacin deberemos introducir el precio del nuevo producto y darle a la tecla
aceptar para que cambie el precio en la E2PROM.
Aparte de poder cambiar el precio, habrn diferentes opciones en el teclado. Una
opcin sera la tecla CANCELAR con la que podremos interrumpir el proceso del cambio de
precio en cualquier momento por si nos hemos equivocado.
Otra opcin del teclado ser la tecla ENVIAR. Servir para poder enviar los datos de
la E PROM a otro chip. ste apartado no lo realizaremos, ya que se har en la prctica enviar
datos USART. En nuestra prctica simplemente mandar a una funcin.
2

La ltima opcin ser la tecla RESETEAR que servir para eliminar todos los precios
de la E2PROM. Esto valdr sobre todo para inicializar la E2PROM y por si hay que cambiar
todos los precios.
Durante todo el proceso se mostrar por la pantalla del display los procesos que vamos
realizando. Para ello leer el funcionamiento y el formato de cmo escribir los datos en el
display en los apartados 2.4 y 2.5 respectivamente.

50

2.3

Funcionamiento del teclado

Para esta prctica utilizaremos un teclado para seleccionar el producto y poner el nuevo
precio. Dicho teclado puede tener la disposicin siguiente:
1

ENVIAR

RESETEAR

ACEPTAR

CANCELAR

Tabla 1
El teclado consta de una serie de interruptores conectados de la siguiente manera:

4x200O
Figura 1
Con lo cul, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna.

51

2.4

Funcionamiento del display

Las pantallas de cristal lquido LCD (Liquid Crystal Display) alfanumricas se


clasifican segn el nmero de caracteres y lneas que pueden mostrar. Las configuraciones
ms usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayora
de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuracin y anejo es bastante similar en muchos de ellos. El tamao de los
caracteres que muestran son de 5x7 o 5x10 pxels. Permiten modos de interface de 4-bits u 8
bits a P/C. Por otro lado muchos tambin incorporan retro-iluminacin por diodos led
verde, para facilitar su lectura. Para la conexin de un LCD con un sistema electrnico se
disponen generalmente de 14 pins con la siguiente asignacin de la Tabla 2. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminacin. En el caso de la
JM162A, se aaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2
Tabla 2. Asignacin de los pines del JM162A
#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
10
DB3
Bit 3 de dato
11
DB4
Bit 4 de dato
12
DB5
Bit 5 de dato
13
DB6
Bit 6 de dato
14
DB7
Bit 7 (MSB) de dato
15
A
Anodo (+) retro-iluminacin
16
K
Ctodo (-) retro-iluminacin

52

2.5

Bases tericas

En esta prctica vamos a cambiar los datos de la E2PROM del microchip. Una
E PROM es una memoria no voltil que puede ser programada electrnicamente. Dentro del
PIC 16F876 existe una E2PROM con capacidad de 256 bytes (H00-hFF).
2

Para nuestra prctica solamente vamos a utilizar 40 valores de esta E2PROM y la


distribucin podra ser por ejemplo:
H00 H09
H10 H19
H20 H29
H30 H39
De esta forma al buscar un precio de un producto podemos pensar en decimal y no
tener que trabajar en hexadecimal. . Otro motivo es que Al introducir el precio lo hacemos en
decimal con lo que nos ahorramos una conversin de decimal a hexadecimal y viceversa.
Ejemplo:
Producto 12 D12 HC
Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro
debe hacer es interpretar las seales de entrada y salida que estn conectadas al teclado, con lo
cual al apretar por ejemplo la tecla 2 se debera almacenar en algn registro que hemos
apretado la tecla 2 para despus procesar lo que se debe hacer con ella.
El micro en esta prctica debera estar esperando a que se pulsase una tecla para
comenzar el proceso. Lo primero que comprobar una vez pulsada una tecla, ser revisar si ya
se ha seleccionado un producto o no. Para seleccionar un producto debemos introducir dos
unidades, ya que como habamos explicado anteriormente, tendremos que trabajar con 40
productos. Con lo cual las decenas del producto deben ser 0, 1, 2 o 3 y por lo tanto si
apretsemos cualquier otro nmero no debera hacer nada el micro ya que sera incorrecto.
En cuanto apretemos el valor de las unidades del producto, que ser la segunda tecla
que tocaremos, ya tendremos seleccionado el producto que queramos y debera sacar por el
display el valor actual del precio guardado en E2PROM de dicho producto y quedarse
testeando el teclado a la espera de que se pulse una nueva tecla para poner el nuevo precio o
cancelar.
Utilizando el mtodo de como se guardan los valores en la E2PROM que hemos
explicado al principio, vamos a insertar el precio nuevo, lo vamos a hacer directamente con el
valor divido entre 5, o sea, que para meter 2,00 pondremos 40 o para meter 0,05 pondremos
1.
Por ultimo, cuando terminemos de introducir el precio nuevo, debemos pulsar la tecla
ACEPTAR, con lo cual saldra el precio real por el display y se cambiara el precio en la

53

E2PROM, se ira al inicio y volveramos a quedar en espera de que se apretase una nueva
tecla.
Si pulsamos la tecla CANCELAR durante el proceso de cambiar el precio, el micro
cancelara el proceso y volvera al inicio del programa, inicializando todos los registros e
inicializando el display.
Si pulsamos la tecla ENVIO, el micro debe llamar a una funcin que puede ser
ENVIAR_EEPROM y que mandar va RS232 la E2PROM de este chip a otro chip. Esta
parte se har en la prctica de envo por USART, con lo cual nosotros solo tenemos que hacer
que vaya a la funcin explicada anteriormente.
En el caso de pulsar la tecla RESETEAR lo que tiene que hacer el micro es poner a 0
todos los valores de los precios, lo cul servir para saber si hay o no producto, ya que si al
leer el precio su valor es 0 eso significar que no existe producto a vender en esa posicin.
Al mismo tiempo que el micro hace las operaciones pertinentes para modificar el
precio, utilizaremos el display para ir viendo lo que vamos haciendo. La presentacin puede
ser de esta forma:
P
N

R
U

O
E

D
C

X
C

A
B

A
B

,
,

A
B

A
B

X El nmero del producto a seleccionar que es de 2 dgitos.


A El precio del producto seleccionado.
C - El precio nuevo que vamos a entrar, este precio ser el real divido entre 5 (* Ver
nota).
B El precio insertado real.
*Para insertar el precio debemos dividir entre 5 el precio que queremos insertar. Como
ejemplo puede ser:
5
15
152

00,25
00,75
07,50

Ejemplo:
P
N

R
U

O
E

D
2

0
0

54

2
1

,
,

3
2

0
5

4x10K

Vpp PGD

RIBBON_10H

5V

RA0 PGC

4.7kohm

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

5V

OSC1 VDD
OSC2VSS1

22pF

RC0

RX

RC1

TX

10nF

RC2 RC5

5V

RC3

RC4

16F876

RIBBON_16H

Fig. 2
2.6

Explicacin esquema elctrico

Como se puede ver en el esquema elctrico (Fig.2) utilizaremos RC<3:0> como salidas
para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<5:4> para controlar RS
y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del
LCD, ver las caractersticas tcnicas adjuntadas en las prcticas.
Una posibilidad para controlar el teclado sera RC<3:0> como salida y RA<3:0> como
entrada. El funcionamiento sera que al proporcionarle tensin a una de las salidas de RC, si
pulssemos cualquiera de las dos teclas que estn conectadas a la columna activada, en RA
obtendramos un 1 ya que comunicaramos la columna con la fila. Si pulssemos la misma
tecla y la columna no estuviese activada, en RA obtendramos un 0.

55

2.7

Resumen objetivos

Tenemos que hacer el cdigo para:


-

Que se reconozcan las teclas cuando las pulsemos


-

Que busque el precio del producto seleccionado.

Que se cambie de E2PROM el precio del producto por el nuevo que hemos
insertado.

Que en el caso de que pulsemos la tecla ENVIAR, nos mande el programa a una
funcin que llamaremos ENVIAR_ EEPROM, que sta ser diseada en la
prctica de comunicacin por USART.

Si pulsamos la tecla RESETEAR deberan ponerse a 0 todos los precios de la


E2PROM

Se tendrn que poner en la pantalla del display los datos a su debido tiempo y con
el formato que se ha explicado anteriormente.

2.8

Objetivos de conocimientos.

Aprender control de teclado y pantalla LCD

Escrbir y leer una EEPROM de un microcontrolador

Converiones entre diferentes tipos de numeracin en un microcontrolador

56

2.9

Diagramas de flujo

INCIO

TESTEAR
TECLADO

TECLA
APRETADA?

NO

SI
PRODUCTO
ELEGIDO=1?

NO

ELEGIR
PRDUCTO

SI
PRECIO
INTRODUCIDO=1?

LA TECLA ES
0,1,2,3,4,5,6,7,8,9?

SI

ESCRIBIR
TECLA EN
DISPLAY

SI

NO

LA TECLA ES
CANCELAR?

INICIAR
REGISTROS
Y ESCRIBIR
CANCEL EN
DISPLAY

SI

NO

SI

ESCRIBIR
TECLA EN
DISPLAY

HACER
CALCULOS

NO
NO

INICIAR
REGISTROS
Y ESCRIBIR
CANCEL EN
DISPLAY

LA TECLA ES
ACEPTAR?

INICIAR
DISPLAY

SI
MODIFICAR
PRECIO EN
EEPROM

HACER
CALCULOS
Y PRECIO
INTRODUCIDO=1

NO

LA TECLA ES
0,1,2,3,4,5,6,7,8,9?

LA TECLA ES
CANCELAR?

SI

ESCRIBIR
PRECIO
EN EEPROM

PRECIO
INTRODUCIDO=0

57

INICIAR
DISPLAY

INICIAR
DISPLAY

ELEGIR
PRDUCTO

LA TECLA ES
0,1,2,3,4,5,6,7,8,9?

NO

SI
DECENAS
INTRODUCIDAS=1?

LA TECLA ES
CANCELAR?

SI

INICIAR
REGISTROS
Y ESCRIBIR
CANCEL EN
DISPLAY

INICIAR
DISPLAY

NO
NO

IR A
FUNCION
ENVIAR
EEPROM

LA TECLA ES
ENVIAR?

SI

ESCRIBIR
TECLA EN
DISPLAY

TECLA > 4?

SI

NO
BUSCAR
PRECIO
PRODUCTO

ESCRIBIR
PRECIO EN
DSPLAY

PRODUCTO
ELEGIDO=1
Y
DECENAS
INTRODUCIDAS=0

ESCRIBIR
TECLA EN
DISPLAY

CALCULAR
LA DECENA
DEL
PRODUCTO

DECENAS
INTRODUCIDAS=1

FIN

Como se puede ver, esta sera una posible solucin simple para el problema dado.

58

Prctica nm.3
Pedir producto

2.6.2.3

3.1

Equipos y materiales:

Para realizar la prctica utilizaremos:


Ordenador PC
Software MPLAB
Teclado de 16 teclas
Display SAMSUNG KS0070
Cable plano de 16

10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
3.2

Descripcin del funcionamiento

En esta prctica programaremos el micro para poder pedir un producto. Se trata de


hacer el programa de tal manera que se pueda unir al resto de prcticas a realizar.
Para empezar, el micro esperar a que se seleccione uno de los productos a travs del
teclado. Ver su funcionamiento en el apartado 3.3.
A continuacin, una vez seleccionado el producto, obtendremos el valor de dicho
producto, que estar almacenado en la E2PROM y se quedar a la espera de que el usuario
cancele o acepte la operacin.
En el caso de que el usuario acepte, deber comprobar en el registro PAGADO si se
ha insertado la cantidad de dinero suficiente para pagar el producto seleccionado y en el caso
de que as sea, se comprobar si hay producto, ya que podra ser que se hubiese agotado.
Una vez comprobado si se ha pagado y si hay producto, procederemos a dar el cambio
del dinero. En esta prctica no realizaremos este proceso, simplemente mandaremos a una
funcin que se realizar en la prctica 4 DAR CAMBIO.
Por ltimo, tendremos que entregar el producto y volver al inicio a esperar a que se
seleccione otro producto y volver a empezar el proceso.
Todo esto se tiene que ir mostrando en el display de la forma que se indica en el
apartado 3.5. El funcionamiento del display se puede ver en el aparatado 3.4.

59

3.3

Funcionamiento del teclado

El teclado servir para seleccionar el producto que queremos, con lo cual deber
dejarnos introducir dos dgitos para seleccionar un producto. Adems, en el mismo teclado
existir la tecla CANCELAR que servir para interrumpir la seleccin del producto y volver
a comenzar el proceso y la tecla ACEPTAR para confirmar que el producto que queremos es
el seleccionado. La disposicin de las teclas podra ser la siguiente:

ACEPTAR

CANCELAR

Tabla 1
El teclado consta de una serie de interruptores conectados de la siguiente manera:
Con lo cul, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna.

Figura 1
4x200O

60

3.4 Funcionamiento del display


Las pantallas de cristal lquido LCD (Liquid Crystal Display) alfanumricas se
clasifican segn el nmero de caracteres y lneas que pueden mostrar. Las configuraciones
ms usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayora
de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuracin y anejo es bastante similar en muchos de ellos. El tamao de los
caracteres que muestran son de 5x7 o 5x10 pxels. Permiten modos de interface de 4-bits u 8
bits a P/C. Por otro lado muchos tambin incorporan retro-iluminacin por diodos led
verde, para facilitar su lectura. Para la conexin de un LCD con un sistema electrnico se
disponen generalmente de 14 pins con la siguiente asignacin de la Tabla 2. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminacin. En el caso de la
JM162A, se aaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignacin de los pines del JM162A


#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
10
DB3
Bit 3 de dato
11
DB4
Bit 4 de dato
12
DB5
Bit 5 de dato
13
DB6
Bit 6 de dato
14
DB7
Bit 7 (MSB) de dato
15
A
Anodo (+) retro-iluminacin
16
K
Ctodo (-) retro-iluminacin

Figura 2

61

3.5 Bases tericas


Como se puede ver en la tabla 1 y en el esquema de la Figura 1, lo que el micro debe
hacer es interpretar las seales de entrada y salida que estn conectadas al teclado, con lo cual
al pulsar por ejemplo la tecla 2 se debera almacenar en algn registro que hemos pulsado
dicha tecla para despus procesar lo que se debe hacer con ella.
Los productos estn almacenados en la E2PROM. De acuerdo con el formato que se ha
comentado en la prctica 2, las posiciones de la E2PROM que se van a usar van a ser las
siguientes:
H00
H10
H20
H30

H09
H19
H29
H39

De esta forma, al buscar un precio de un producto podemos pensar en decimal y no


tener que trabajar en hexadecimal. Ejemplo:
Producto 12 D12 HC
El micro en esta prctica debera estar esperando a que se pulsase una tecla para
comenzar el proceso. Una vez pulsada una tecla, lo primero que har el micro ser comprobar
si ya se haba seleccionado un producto o no. Para seleccionar un producto debemos introducir
dos unidades, ya que como habamos explicado anteriormente, tendremos que trabajar con 40
productos. Con lo cual, las decenas del producto deben ser 0, 1, 2 o 3 y por lo tanto si
pulssemos cualquier otro nmero no debera hacer nada el micro, ya que sera incorrecto.
En cuanto pulsemos el valor de las unidades del producto, que ser la segunda tecla
que tocaremos, ya tendremos seleccionado el producto que queramos y debera sacar por el
display el valor actual del precio guardado en E2PROM de dicho producto y quedarse testando
el teclado a la espera de que se pulse la tecla ACEPTAR para continuar o la tecla
CANCELAR para empezar de nuevo.
En el caso de pulsar la teclaCANCELAR cuando estamos seleccionando el producto,
debe volver al principio a esperar a empezar de nuevo la seleccin del producto.
Una vez elegido el producto, hay que mirar si se ha pagado o no, para ello hay que
comparar el precio del producto con la cantidad que se ha pagado. Para ello, el precio del
producto nos lo da el valor de la E2PROM y la cantidad que se ha pagado vendr dada por un
registro que llamaremos PAGADO que ser modificado en la prctica 1 monedero. Para
poder modificar este registro nosotros utilizaremos el MPLAB en el comando Window>Modify. Donde aparecer una ventana en la cual en Adress escribiremos la direccin o el
nombre del registro PAGADO y podremos variar su valor.

62

Tanto para introducir la cantidad de dinero como para hacer operaciones en el registro
PAGADO, hay que seguir el formato de la prctica 1. Se introduce en el registro PAGADO
la cantidad de dinero insertado dividiendo entre 5 como se explica en el ejemplo siguiente:
Dinero insertado() Valor en registro PAGADO
2,00
40
12,00
240
0,75
15
0,05
1
1,25
25
12,75
255

Con lo cual, podemos guardar en 1 registro 1275 cntimos. Aunque existen otros
sistemas, como por ejemplo guardarlo en 2 registros, nosotros utilizaremos este sistema para
hacer compatible el registro con el resto de las prcticas.
A continuacin, para comprobar si hay producto se tendra que ir a una funcin que nos
debera comunicar con otro micro, el cual llevara el control de los productos. Como la
comunicacin es parte de otra prctica, en este caso, lo que haremos ser revisar el interruptor
colocado en RC5 que dependiendo de si est abierto o cerrado, indicar si hay producto o no.
Si se ha pagado y hay producto, se continua el proceso calculando el cambio. En el
caso de que lo pagado sea exacto, se seguir el proceso de dar producto. En el caso de que se
deba dar cambio, lo calcular y comprobar el interruptor de RC6 que dependiendo de si est
abierto o cerrado, indicar si hay cambio o no. En el caso de que se tenga que dar cambio y
exista cambio, debera ir a la funcin DAR CAMBIO. En esta prctica esta funcin no har
nada ya que DAR CAMBIO se realizar en la prctica 4.
Si todo a sido correcto, queda entregar el producto. Como en el caso de revisar si hay
producto, esto se debera hacer por comunicacin USART con otro micro, en esta prctica
solamente encenderemos el LED de entregar el producto, que est en RB5 . Una vez entregado
el producto, volveramos al inicio a esperar que se introduzca otro producto.
Al mismo tiempo que el micro hace las operaciones explicadas anteriormente, el micro
debe presentar por la pantalla del LCD los diversos aparatados que se han explicado. El
formato de presentacin puede ser el siguiente:

B
A

N Producto seleccionado.
A Precio del producto seleccionado.
B Cantidad de dinero a devolver por el cambio.

63

B
A

,
,

B
A

B
A

C
$

Ejemplo en el caso que PAGADO hubiese tenido el valor correspondiente a 3:

0
0

0
2

,
,

2
7

5
5

C
$

En el caso de que se hubiese cancelado el proceso a causa de que no exista cambio, que
no se haya pagado el producto o no quede, se podra, para mayor claridad de lo que esta
pasando en el programa, escribir mensajes a travs del LCD. Se podra hacer en el espacio
guardado para escribir el cambio a dar. Unos ejemplos de cmo se podra hacer seran los
siguientes:

En el caso de no haberse pagado el producto:

N
0

O
2

P
7

G
5

N
0

O
2

P
7

R
5

O
$

N
0

O
2

C
7

M
5

En el caso de no haber producto:

En el caso de no haber cambio:

64

3x10K

5V

RIBBON_10H

4.7kohm

22pF

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1

VDD

OSC2

VSS1

RC0

ENTREGA PRODUCTO
1.0kohm
5V
5V

10nF

RX

RC1

TX

RC2

RC5

RC3

RC4

RIBBON_16H
16F876
5V
HAY PRODUCTO
HAY CAMBIO

Fig. 2

3.6 Explicacin esquema elctrico


Como se puede ver en el esquema elctrico (Fig.2) utilizaremos RC<3:0> como
salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para
controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la
pantalla del LCD, ver las caractersticas tcnicas adjuntadas en las prcticas y el apartado 3.4
Funcionamiento del display.
Una posibilidad para controlar el teclado sera RC<3:0> como salida y RB<3:0> como
entrada. El funcionamiento sera que al proporcionarle tensin a una de las salidas de RC, si
pulssemos cualquiera de las dos teclas que estn conectadas a la columna activada, en RA
obtendramos un 1 ya que comunicaramos la columna con la fila. Si pulssemos la misma
tecla y la columna no estuviese activada, en RA obtendramos un 0. Ver apartado 3.3
Funcionamiento del teclado.

65

3.7

Resumen de objetivos

Tenemos que hacer el cdigo para conseguir:


-

Que se reconozcan los pulsadores cuando pulsemos las teclas.

Que una vez seleccionado un producto, busque el precio y espere a que se pulse la
tecla ACEPTAR para continuar.

Si pulssemos la tecla CANCELAR durante la seleccin del producto, debera


borrar lo que se ha seleccionado de momento y quedar preparado para empezar de
nuevo.

Una vez seleccionado el producto, hay que revisar si existe suficiente dinero para
pagar el producto.

A continuacin, habr que revisar si hay producto por si se hubiese agotado


utilizando el mtodo del interruptor. Recordar separarlo en una funcin, ya que
despus esta funcin ser modificada al unirlo con otras prcticas.

Si se ha pagado y existe producto, se tiene que calcular el cambio y mandar a una


funcin DAR CAMBIO que se har en otra prctica.

Por ultimo, habr que entregar el producto con el mtodo del LED explicado
anteriormente. Recordar que la funcin de preguntar si hay producto tiene que ir
separada del resto del cdigo.

Se tendrn que poner en la pantalla del display los datos y las causas por las que se
sigue el proceso de pedir producto por no haber cambio, no haber producto, etc...
Todos estos mensajes se deben mostrar en su debido tiempo y con el formato que
se ha explicado en el apartado 4.5.

3.8 Objetivos de conocimientos.


-

Aprender control de teclado y pantalla LCD

Leer una EEPROM de un microcontrolador

Hacer un sisitema de deteccin de errores.

66

3.9 Diagrama de flujo

TESTEAR
TECLADO

INICIO

ELEGIR
PRODUCTO

Producto
elegido=1?

NO

SI
REVISAR SI
EXISTE PRECIO
EN EEPROM

NO

DAR MENSAJE
ERROR NO $

NO

DAR MENSAJE
ERROR
NO PROD

Existe precio?

SI
REVISAR SI SE
HA AGOTADO
PRODUCTO

RC<4>=1?
SI
MOSTRAR EN
LCD PRECIO DEL
PRODUCTO

INICIAR
LCD

Producto eleegido=0

REVISAR SI
INSERTADO SUF.
DINERO

NO

Se ha pagado?

DAR MENSAJE
ERROR
NO PG

SI
MIRAR SI
NECESITA DAR
CAMBIO
SI

NO

REVISAR SI HAY
CAMBIO

RC<5>=0?

Necesita dar
cambio?

SI

NO

DAR PROD
RA<5>=1 Y
MOSTRAR
CAMBIO

DAR CAMBIO

67

DAR MENSAJE
ERROR
NO CM

ELEGIR
PRODUCTO

Tecla = Aceptar
o Cancelar?

SI

SI
Tecla = Cancelar?

CANCELAR EL
PROCESO

NO
NO
SI
Lim_tec=0?

PRODUCTO
ELEGIDO=1

NO
LIM_TEC=
LIM_TEC+1

REVISAR SI SON
LAS DECENAS

SI
Lim_tec=2?

ESCRIBIR EN LCD
PROD Y EL N
DE DECENA

GUARDAR
VALOR DECENA
Y LIM_TEC-1

NO
REVISAR LAS
UNIDADES

Lim_tec=1?

SI

ESCRIBIR EN LCD
EL N DE LA
UNIDAD

PRODUCTO=
DECENA+UNIDAD

NO

TECLA
APRETADA=0

FIN

Como se puede ver, esta sera una posible solucin simple para el problema
dado.

68

Prctica nm.4
Dar cambio

2.6.2.4

4.1

Equipos y materiales:
Para realizar la prctica utilizaremos:
Ordenador PC
Software MPLAB
Teclado de 16 teclas
Display SAMSUNG KS0070
Cable plano de 16

10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876

4.2

Descripcin del funcionamiento

En esta prctica programaremos el micro para poder dar el cambio de dinero. Se


trata de hacer el programa para unirlo al resto de prcticas a realizar.
Para empezar, el micro esperar a que se introduzca una cantidad de dinero a
travs del teclado, ver su funcionamiento en el apartado 4.3.
Una vez seleccionada la cantidad de dinero tenemos que revisar si existe
cambio, ya que puede pasar que no quede. Para ello hay un interruptor de hay
cambio que nos indicar si hay o no.
Por ltimo debera dar el cambio. Para ello, se tendra que ir a una funcin, que
ser Dar el cambio y la utilizaremos para unir al resto de las prcticas, con lo cual hay
que tener en cuenta algunos aspectos que se explican en el apartado 4.5.
La funcin Dar el cambio, lo que tiene que hacer es ir restando a la cantidad
del cambio las fracciones monetarias de las que disponemos y a medida que se va
detectando una moneda se tiene que enviar el cdigo para encender el LED
correspondiente a la moneda a devolver.
Una vez que se ha devuelto todo el dinero, saldramos de la funcin del cambio
y tendramos que volver a esperar a que se introduzca una nueva cantidad de dinero y
seleccionar otro producto.
Todo esto se tiene que ir mostrando en el display de la forma que se indica en el
apartado 4.5. El funcionamiento se puede ver en el aparatado 4.4.

69

4.3

Funcionamiento del teclado

El teclado servir para seleccionar el cambio que se tiene que devolver, con lo cual
deber dejarnos introducir una cantidad numrica, que puede ser de 2, 3 o 4 dgitos. Adems,
en el mismo teclado existir la tecla ACEPTAR para confirmar que es la cantidad de cambio
que queremos que se nos devuelva. La disposicin de las teclas podra ser la siguiente:

ACEPTAR

Tabla 1
El teclado consta de una serie de interruptores conectados de la siguiente manera:
Con lo cul, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna.

4x200O

Figura 1

70

4.4

Funcionamiento del display

Las pantallas de cristal lquido LCD (Liquid Crystal Display) alfanumricas se


clasifican segn el nmero de caracteres y lneas que pueden mostrar. Las configuraciones
ms usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayora
de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuracin y anejo es bastante similar en muchos de ellos. El tamao de los
caracteres que muestran son de 5x7 o 5x10 pxels. Permiten modos de interface de 4-bits u 8
bits a P/C. Por otro lado muchos tambin incorporan retro-iluminacin por diodos led
verde, para facilitar su lectura. Para la conexin de un LCD con un sistema electrnico se
disponen generalmente de 14 pins con la siguiente asignacin de la Tabla 2. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminacin. En el caso de la
JM162A, se aaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2
Tabla 2. Asignacin de los pines del JM162A
#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
10
DB3
Bit 3 de dato
11
DB4
Bit 4 de dato
12
DB5
Bit 5 de dato
13
DB6
Bit 6 de dato
14
DB7
Bit 7 (MSB) de dato
15
A
Anodo (+) retro-iluminacin
16
K
Ctodo (-) retro-iluminacin

Figura 2

71

4.5

Caractersticas del 74LS138N

El 74LS138 es un codificador/demultiplexor invertido y lo vamos a utilizar como un


decodificador para encender los LEDs de las monedas a entregar. La tabla de funcin de este
chip es la siguiente:

E1

E2

H
X
X
L
L
L
L
L
L
L
L

X
H
X
L
L
L
L
L
L
L
L

INPUT
A0
E

A1

A2

Y0

Y1

Y2

Y3

Y4

Y5

Y6

Y7

X
X
L
H
H
H
H
H
H
H
H

X
X
X
L
L
H
H
L
L
H
H

X
X
X
L
L
L
L
H
H
H
H

H
H
H
L
H
H
H
H
H
H
H

H
H
H
H
L
H
H
H
H
H
H

H
H
H
H
H
L
H
H
H
H
H

H
H
H
H
H
H
L
H
H
H
H

H
H
H
H
H
H
H
L
H
H
H

H
H
H
H
H
H
H
H
L
H
H

H
H
H
H
H
H
H
H
H
L
H

H
H
H
H
H
H
H
H
H
H
L

X
X
X
L
H
L
H
L
H
L
H

OUTPUT

Las caractersticas tcnicas de este chip se encuentran al final de la prctica.


4.6

Bases tericas

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro


debe hacer es interpretar las seales de entrada y salida que estn conectadas al teclado, con lo
cual al pulsar por ejemplo la tecla 2 se debera almacenar en algn registro que hemos
pulsado dicha tecla para despus procesar lo que se debe hacer con ella.
El micro en esta prctica debera estar esperando a que se pulsase una tecla para
comenzar el proceso. Para seleccionar la cantidad de dinero que se tiene que dar en el cambio,
se da libertad en el procedimiento con el teclado, lo nico a tener en cuenta es que la cantidad
de dinero del cambio se tiene que guardar en un registro que llamaremos CAMBIO y que
tendr el formato que se explica en la prctica 1. Se introduce en el registro CAMBIO la
cantidad de dinero insertado dividiendo entre 5 como se explica en el ejemplo siguiente:
Dinero insertado Valor en registro CAMBIO
2,00
40
12,00
240
0,75
15
0,05
1
1,25
25
12,75
255

72

Con lo cual podemos guardar en 1 registro 1275 cntimos.


Una vez insertada la cantidad de cambio a dar habra que revisar si hay cambio o no.
Esto se realizar con un interruptor conectado en RC<6> y se puede programar a eleccin del
programador. Podra ser, ON Hay cambio, OFF No hay cambio, o viceversa.
Para dar el cambio hay que crear una funcin que esta ser la que se una al conjunto de
prcticas. Para que funcione bien hay que tener en cuenta el registro CAMBIO explicado
anteriormente y que la funcin tiene que ser transparente para no modificar otros registros que
puedan alterar el funcionamiento de las otras prcticas si las unimos.
Para calcular las monedas a dar, una posibilidad podra ser ir restando la cantidad de
las diferentes monedas hasta que la cantidad de CAMBIO fuese 0, el mtodo para averiguar
las monedas a entregar de cambio se deja a eleccin del usuario, aunque se expone un
diagrama de flujo en el apartado 4.8 de una posible solucin.
Para entregar las monedas, hay un demultiplexador de 3-8 (74LS138N, ver
caractersticas en el apartado 4.5) conectado a RA<2:0> por un lado y a una serie de LEDS
por el otro, con lo cual existe la siguiente codificacin:

RA0-RA2
(0,0,0)
(0,0,1)
(0,1,0)
(0,1,1)
(1,0,0)
(1,0,1)
(1,1,0)
(1,1,1)

MONEDA
NO
CONECTADO
5 CENTIMOS
10 CENTIMOS
20 CENTIMOS
50 CENTIMOS
1 EURO
NO
CONECTADO
NO
CONECTADO

Hay que tener en cuenta que despus de dar una moneda hay que hacer una pausa, ya
que si no, no llegaremos a ver el LED que se enciende y por lo tanto parecer que no devuelve
las monedas.
Una vez entregado el cambio, el micro se queda a la espera de introducir una nueva
cantidad de cambio.
Al mismo tiempo que el micro hace las operaciones explicadas en la mquina, el micro
debe sacar por la pantalla del LCD los diversos aparatados que hemos explicado
anteriormente. El formato de presentacin puede ser el siguiente:

73

S El cambio insertado (se deja a eleccin del programador el formato)


B Cantidad de dinero a devolver por el cambio (registro CAMBIO).

Ejemplo en el caso que CAMBIO hubiese tenido el valor correspondiente a 3:


3

En el caso de que se introduzcan los 3 como se guarda en el registro CAMBIO


300/5 = 60
6

74

5V
1kOhm

RIBBON_10H

4.7kohm

7
Y7
~G2B

~G2A

Y6

74LS138N

10
6

5V

G1

Y5

11

Y4

12

Y3

13

Y2
C

14

Y1
B

5V

10 cent20 cent50 cent

Y0

15

5 cent

3x10K

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1 VDD

5V
5V

10nF

OSC2 VSS1

22pF

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

RIBBON_16H
16F876
5V

Fig. 2
HAY CAMBIO

75

4.7

Explicacin esquema elctrico

Como se puede ver en el esquema elctrico (Fig.2) utilizaremos RC<2:0> como


salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para
controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la
pantalla del LCD, ver las caractersticas tcnicas adjuntadas en las prcticas y el apartado 4.4
Funcionamiento del display.
Una posibilidad para controlar el teclado sera RC<3:0> como salida y RB<2:0> como
entrada. El funcionamiento sera que al proporcionarle tensin a una de las salidas de RC, si
pulssemos cualquiera de las dos teclas que estn conectadas a la columna activada, en RA
obtendramos un 1 ya que comunicaramos la columna con la fila. Si pulssemos la misma
tecla y la columna no estuviese activada, en RA obtendramos un 0. Ver apartado 4.3
Funcionamiento del teclado.
Para dar las monedas del cambio como se puede ver hay que poner el cdigo
correspondiente de las monedas en RA<2:0> para que despus lo decodifique el chip
74LS138N y encienda el LED que corresponde.
4.8

Resumen de objetivos

Tenemos que hacer el cdigo para:


-

Que se reconozcan los pulsadores cuando pulsemos las teclas.

Una vez seleccionada una cantidad de dinero, habr que pulsar la tecla
ACEPTAR para confirmar.

Una vez elegida la cantidad de cambio a devolver, hay que revisar si hay cambio
mirando el interruptor conectado en RC<5>.

A continuacin habr que pasar a la funcin de devolver cambio, que ser la que
tengamos que poder insertar en el resto de prcticas.

A medida de que se vaya calculando el cambio se irn dando las monedas,


encendiendo los LEDs de las monedas a devolver.

Se tendrn que poner en la pantalla del display la cantidad a dar de cambio, tal y
como se explica en el apartado 4.6

4.9

Objetivos de cocnocimientos

Aprender control de teclado y pantalla LCD

Controlar un decodificador con el C para emitr seales.

76

4.10

Diagrama de flujo

DAR CAMBIO

W -> C A M B I O
CAMBIO=
C A M B I O -100

CAMBIO=
CAMBIO -10

DAR SEAL DE
1

DAR SEAL DE
10 Cntimos

SI
CAMBIO>100?

CAMBIO>10 ?
SI

NO
NO
CAMBIO=
CAMBIO -50

DAR SEAL DE
50 Cntimos

MIRAR SI
QUEDA
CAMBIO

SI

SI

CAMBIO>50?

CAMBIO =0?

NO

NO
CAMBIO=
CAMBIO -2 0

DAR SEAL DE
5 Cntimos

FIN

DAR SEAL DE
20 Cntimos

SI
CAMBIO>20?

NO

Como se puede ver, esta sera una posible solucin simple para el problema dado.

77

Prctica nm.5
Comunicacin USART 1

2.6.2.5

5.1

Equipos y materiales

Para realizar la prctica utilizaremos:


Ordenador PC
Software MPLAB
Teclado de 16 teclas
Display SAMSUNG KS0070
Cable plano de 16

10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
Cable para conectar los microcontroladores.
5.2

Descripcin del funcionamiento

En esta prctica, la cul va conjuntamente con la prctica 6, haremos el cdigo


para que dos microcontroladores puedan comunicarse entre s. Se trata de hacer el
programa para unirlo al resto de prcticas a realizar.
Para empezar, deberemos configurar el micro y crear unas funciones para que
sea capaz de detectar cuando se pulsan las teclas del teclado. Esta parte queda a libre
eleccin de diseo, solamente hay que tener en cuenta lo que se explica en el apartado
5.3.
Una vez que detecte las teclas, en esta prctica solamente necesitamos que al
pulsar una tecla, por ejemplo la tecla E, debera de comenzar a transmitir los datos
que hay en la EEPROM de las posiciones que se explican en las bases tericas
(apartado 5.7).
En cualquier momento, este micro puede recibir datos del micro al que est
conectado. Los datos a recibir sern:
-Una peticin para saber si hay un producto, a lo que tendr que averiguar el
micro si dicho producto est disponible.
-Una peticin conforme hay que entregar el producto, a lo que el micro deber
entregarlo.
- Adems de las confirmaciones de los datos que se van transmitiendo, que
simplemente ser un ACEPTAR o CANCELAR.
A medida que se van enviado los datos de la EEPROM se podra sacar por el
display los datos que se van enviando. Ver aparatado 5.5 y 5.6.

78

5.3

Funcionamiento del teclado

El teclado nos servir para dar la orden al micro para que comience a transmitir los
datos de la EEPROM:

Tabla 1
El teclado consta de una serie de interruptores conectados de la siguiente manera:

4x200O
Figura 1
Con lo cul, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la
columna.

79

5.4

Funcionamiento del display

Las pantallas de cristal lquido LCD (Liquid Crystal Display) alfanumricas se


clasifican segn el nmero de caracteres y lneas que pueden mostrar. Las configuraciones
ms usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayora
de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuracin y manejo es bastante similar en muchos de ellos. El tamao de los
caracteres que muestran son de 5x7 o 5x10 pxels. Permiten modos de interface de 4-bits u 8
bits a P/C. Por otro lado muchos tambin incorporan retro-iluminacin por diodos led
verde, para facilitar su lectura. Para la conexin de un LCD con un sistema electrnico se
disponen generalmente de 14 pins con la siguiente asignacin de la Tabla 2. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminacin. En el caso de la
JM162A, se aaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2
Tabla 2. Asignacin de los pines del JM162A
#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
10
DB3
Bit 3 de dato
11
DB4
Bit 4 de dato
12
DB5
Bit 5 de dato
13
DB6
Bit 6 de dato
14
DB7
Bit 7 (MSB) de dato
15
A
Anodo (+) retro-iluminacin
16
K
Ctodo (-) retro-iluminacin

Figura 2

80

5.5

Protocolo de comunicacin

Vamos a enviar datos a travs de la USART del microcontrolador en modo asncrono


donde RC7 es RX y RC6 es TX. Estos pines tienen que estar cruzados con los pines del
microcontrolador con el que nos queremos comunicar.
Para ello hay que crear un protocolo entre los dos microcontroladores que nos servir
para que los Cs se puedan entender entre ellos, ya que si no utilizasen el mismo protocolo
sera imposible comunicarse entre ellos ya que representara como si uno hablase en un idioma
y el otro en otro idioma.
Este protocolo se debera crear ponindose de acuerdo con el compaero que realiza la
prctica 6, que es el que realiza el cdigo del C con el que tenemos que comunicarnos. Los
datos a enviar sern de este tipo:
BITS <7:0>

START

STOP

STOP

Hay que tener en cuenta que es lo que queremos enviar, que ser:
o
o
o
o

1 palabra de inicio
1 palabra de direccin
1 palabra de dato
1 palabra de fin

Aparte, por ejemplo se podran poner unas palabras de control, como puede ser:
o 1 palabra de peticin de dato
o 1 palabra de peticin de direccin
o 1 palabra para decir que hemos terminado de enviar un grupo de
datos (una direccin y un dato).
Un ejemplo de protocolo que funciona puede ser este:
RECIBE

TRANSMITE

0
1
0
1
X
0
0
0
1
1
1
1
0

0
0
1
1
X
0
1
1
0
0
1
1
1

X
X
0
1
X
X
0
1
0
1
1
1
0

CODIGO
X X
X X
0 1
1 0
X X
X X
1 0
0 0
1 1
0 1
1 1
1 0
0 1

81

X
X
1
0
X
X
1
1
0
0
1
0
1

X
X
1
0
X
X
0
1
0
1
1
0
1

X
X
1
0
X
X
1
0
1
0
1
0
1

SIGIFICADO
Preguntar producto
Pedir producto
Cancelar
Aceptar
Dato
Direccin
Peticin direccin
Fin de transmisin
Fin de 1 grupo de datos
Peticin de dato
Inicio
Aceptar
Cancelar

5.6

Decodificador de 4 a 7 segmentos

En la prctica vamos a utilizar el 74LS47N que es un decodificador de 4 a 7


segmentos. Este chip sirve para convertir el cdigo BCD en cdigo de 7 segmentos que es lo
que necesitamos para encender el display de LEDs.
Las conexiones sern como se puede ver en el esquema elctrico del apartado 5.8.
Y la tabla de la verdad del 7447N es:
TABLA DE VERDAD
ENTRADA

SEGMENTOS

A1

B1

C1

D1

5.7

Bases tericas

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro


debe hacer es interpretar las seales de entrada y salida que estn conectadas al teclado, con lo
cual al pulsar la tecla E debera comenzar a enviar los datos de la EEPROM.
Como se necesita modificar los datos de la EEPROM y ya hay la prctica 2 que ya se
encarga de ello. Para facilitar el trabajo en esta prctica, cuando queramos cambiar un valor de
la EEPROM utilizaremos el MENU->UTILIDADES->MODIFY del programa M-PLAB y
cuando salga la pantalla de modificar seleccionaremos la EEPROM y de este modo podremos
leer y escribir datos en la EEPROM.
El micro en esta prctica debera estar esperando a que se pulsase la tecla E para
comenzar, una vez pulsada la tecla E comenzara el proceso de la transmisin. En la
transmisin de la EEPROM solamente hay que transmitir los datos:
de H00 hasta H09
82

de H10 hasta H19


de H20 hasta H29
de H30 hasta H39
Para ello debemos tener un protocolo de comunicacin que est explicado en el
apartado 5.5.
Para la recepcin de datos hay que tener en cuenta, como se puede ver en el protocolo
del apartado 5.5, que aparte de recibir las confirmaciones de los datos que enviamos, que ser
justo despus de haber enviado uno, recibiremos tambin en cualquier momento los que nos
enva el otro C.
Los datos que enva el otro C sern para preguntar si hay un producto, que si es este
caso, lo que tendr que hacer el micro es revisar el estado del interruptor que est conectado en
RC<5> y transmitir al otro micro si hay o no producto, al mismo tiempo que tendremos que
sacar por el display de 7 segmentos el nmero del producto que se pide, colocando los cuatro
bits de menos peso del dato recibido en RB<3:0> y los dos bits siguientes el 5 y 6 ponerlos
en RA<5:4>, que como se puede ver en el esquema elctrico (apartado 5.8) RB<3:0> est
conectado a un decodificador de 4 a 7 segmentos que nos dar las unidades y al mismo tiempo
RA<5:4> tambin estar conectado a otro decodificador de 4 a 7 segmentos que nos dar las
decenas del producto. Ver el apartado 5.6
El otro dato que se puede recibir es la peticin de entregar un producto, que en ese
caso, habr que encender el LED de entregar el producto que esta en RC<4>, al mismo tiempo
sacaremos por el display de 7 segmentos el nmero del producto a entregar de la misma forma
que se ha explicado anteriormente.
Habra que asegurarse de que durante la transmisin de la EEPROM , si se recibiese la
peticin de entregar producto o de preguntar si hay producto no debera hacer caso a los
datos recibidos y seguir con la transmisin de datos.
Cuando est transmitiendo los datos de la EEPROM se debera sacar por pantalla del
LCD la direccin de la EEPROM y el valor de dicha direccin. El formato de presentacin
puede ser el siguiente:

X
I

X
I

N La direccin de la EEPROM que estamos enviando


X El valor de dicha direccin
I OK si todo se ha enviado bien o CANCEL en el caso de que hubiese habido
algn problema

83

SEVEN_SEG_DISPLAY
SEVEN_SEG_DISPLAY

4x10K

RIBBON_10H

13

7
A OA
1
B OB
2

5V
Vpp PGD

5V

D OD

RA0 PGC
3

RA1 RB5

LT OF

A OA
1
B OB
2

OSC2VSS1

TX

10nF

C OC
6
D OD
3

RC2 RC5

RIBBON_16H

15
14

13

OSC1VDD

RC1

74LS47N

Vss RB0

22pF

ABCDEFG

BI/RBO

RA5 RB1

RX

ABCDEFG

10

RBI OG

RA4 RB2

RC0

11

RA3 RB3

4.7kohm

OE

RA2 RB4

5V

C OC
6

12

OE
LT OF

RC3 RC4

12
11
10
9
15
14

RBI OG
4
BI/RBO

16F876

Fig. 2

74LS47N

1.0kohm

LED_red
5V
HDR1X4
HAY PRODUCTO

5.8 Explicacin esquema elctrico


Como se puede ver en el esquema elctrico (Fig.2) utilizaremos RC<3:0> como salidas
para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS
y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del
LCD, ver las caractersticas tcnicas adjuntadas en las prcticas y el apartado 5.4
Funcionamiento del display.
Una posibilidad para controlar el teclado sera RC<3:0> como salida y RA<4:3> como
entrada. El funcionamiento sera que al proporcionarle tensin a una de las salidas de RC, si
pulssemos cualquiera de las dos teclas que estn conectadas a la columna activada, en RA
obtendramos un 1 ya que comunicaramos la columna con la fila. Si pulssemos la misma
tecla y la columna no estuviese activada, en RA obtendramos un 0. Ver apartado 5.3
Funcionamiento del teclado.

84

5.9.

Resumen de objetivos

Tenemos que hacer el cdigo para:


-

Que se reconozcan los pulsadores cuando pulsemos las teclas.

Crear o utilizar el protocolo que hay de ejemplo en el apartado 5.5, quedando de


acuerdo con los compaeros que hacen la prctica 6.

Una vez pulsada una tecla (la E por ejemplo) que comience la transmisin de la
EEPROM con las condiciones explicadas en las bases tericas (apartado 5.7).

En la recepcin de datos hay que distinguir tres casos:


o Cuando se reciben las confirmaciones de los datos que transmitimos.
o Cuando se recibe la pregunta de si hay un producto, a lo que se deber
revisar si hay un producto tal y como se indica en las bases tericas
o Cuando se recibe la peticin de entregar un producto, a lo que se deber
entregar el producto tal y como se explica en las bases tericas.

Se tendrn que poner en la pantalla de LCD los datos que se explican en el


apartado 5.7

5.10. Objetivos de conocimieto


-

Aprender control de teclado y pantalla LCD

Leer una EEPROM de un microcontrolador

Control decodificador de BCD a 7 segmentos

Apreder funcionamiento de USART de un microcontrolador

85

5.11

Diagrama de flujo

INICIO

ESPERAR
TECLA O
RECEPCION

TECLA ENVIO
APRETADA?

NO

ENVIAR
DIRECCION

NO
CONTINUAMOS?

SI
NO
ENVIAR INICIO
TRANSMISION

SI

CONTINUAMOS?
NO
SI
NO

NO

SI
NO

SI

TODO
CORRECTO?

CONTINUAMOS?

NO

SI
ENVIAR
PETICION
DATO

TODO
CORRECTO?

TODO
CORRECTO?

ULTIMA
DIRECCION?

SI
ENVIAR FIN
TRANSMISION

SI
NO

ENVIAR
PETICON
DIRECCION

CONTINUAMOS?

SI
NO
CONTINUAMOS?

SI
NO
TODO
CORRECTO?

NO

TODO
CORRECTO?

SI
SI

ENVIAR
DATO

CANELAR
TRANSMISION

86

INICIO
ITERRUPCION

ES POR
RECEPCION?

SI

NO
SI
ES ACEPTAR?

SE PUIEDE
CONTINUAR Y
ES CORRECTO

NO

SI
ES CANCELAR?

SE PUIEDE
CONTINUAR Y
NO ES
CORRECTO

NO
SI
ES PREGUNTAR
PRODUCTO?

NO

PONER DATO
EN DISPLAY
SEGMENTOS

HAY PRODUCTO?

SI

NO

ES PEDIR
PRODUCTO?

ENVIAR
CANCELAR

SI

ENVIAR
ACEPTAR

SE PUIEDE
CONTINUAR Y
NO ES
CORRECTO

NO

FIN
INTERRUPCION

Como se puede ver, esta sera una posible solucin simple para el problema dado.

87

Prctica nm.6
Comunicacin USART 2

2.6.2.6

6.1

Equipos y materiales

Para realizar la prctica utilizaremos:


Ordenador PC
Software MPLAB
Teclado de 16 teclas
Display SAMSUNG KS0070
Cable plano de 16

10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
Cable para conectar los microcontroladores.
6.2

Descripcin del funcionamiento

En esta prctica haremos el cdigo para que dos microcontroladores puedan


comunicarse entre s. Esta prctica va en conjunto con la prctica 5. Se trata de hacer el
programa para unirlo al resto de prcticas a realizar.
Para empezar, deberemos configurar el micro y crear unas funciones para que sea
capaz de detectar cuando se pulsan las teclas del teclado. Se debe tener en cuenta el apartado
6.3.
Una vez que detecte las teclas, en esta prctica tendremos que poder introducir un
nmero de dos dgitos comprendidos entre el 00 y el 39 y teclas para aceptar o cancelar .
Una vez se ha dado a la tecla aceptar debe comenzar el proceso de comunicacin. Lo
que tiene que hacer este micro en el proceso de comunicacin, es preguntar si hay producto y
en el caso de que halla, debe dar la orden de entregar producto.
En cualquier momento, este micro puede recibir datos del micro al que est conectado.
Los datos a recibir servirn para modificar los datos de la EEPROM.
Se debera sacar por el display el nmero del dato a enviar y la respuesta cuando lo que
hacemos es preguntar si hay producto. Ver apartado 6.6

88

6.3

Funcionamiento del teclado

El teclado nos servir para introducir los dos dgitos del nmero a enviar, para aceptar
cuando queremos enviar el nmero introducido y cancelar para borrar el nmero y empezar de
nuevo:

ACEPTAR

CANCELAR

Tabla 1
El teclado consta de una serie de interruptores conectados de la siguiente manera:

4x200O
Figura 1
Con lo cul, al pulsar una tecla, cerramos el interruptor y comunicamos la fila con la
columna.

89

6.4

Funcionamiento del display

Las pantallas de cristal lquido LCD (Liquid Crystal Display) alfanumricas se


clasifican segn el nmero de caracteres y lneas que pueden mostrar. Las configuraciones
ms usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayora
de los LCDs estn basados en el microcontrolador HITACHI 44780 u otro compatible, de
forma que la configuracin y manejo es bastante similar en muchos de ellos. El tamao de los
caracteres que muestran son de 5x7 o 5x10 pxels. Permiten modos de interface de 4-bits u 8
bits a P/C. Por otro lado muchos tambin incorporan retro-iluminacin por diodos led
verde, para facilitar su lectura. Para la conexin de un LCD con un sistema electrnico se
disponen generalmente de 14 pins con la siguiente asignacin de la Tabla 2. En las pantallas
retro-iluminadas se incluyen los terminales A, K, de los leds de iluminacin. En el caso de la
JM162A, se aaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2
Tabla 2. Asignacin de los pines del JM162A
#PIN
Nombre
Funcin
1
Vss
Masa (0V)
2
Vdd
Alimentacin (+5V)
3
Vee
Contraste (Vss=Vee=Vdd)
4
RS
Seleccin de modo (dato=1/comando=0)
5
R/W
Lectura/escritura de comando (lectura=1/ecritura=0)
6
E
Enable ( Validacin DB<7:0> en flanco 1? 0)
7
DB0
Bit 0 (LSB) de dato
8
DB1
Bit 1 de dato
9
DB2
Bit 2 de dato
10
DB3
Bit 3 de dato
11
DB4
Bit 4 de dato
12
DB5
Bit 5 de dato
13
DB6
Bit 6 de dato
14
DB7
Bit 7 (MSB) de dato
15
A
Anodo (+) retro-iluminacin
16
K
Ctodo (-) retro-iluminacin

Figura 2

90

6.5

Protocolo de comunicacin

Vamos a enviar datos a travs de la USART del microcontrolador en modo asncrono


donde RC7 es RX y RC6 es TX. Estos pines tienen que estar cruzados con los pines del
microcontrolador con el que nos queremos comunicar.
Para ello hay que crear un protocolo entre los dos microcontroladores que nos servir
para que los Cs se puedan entender entre ellos, ya que si no utilizasen el mismo protocolo
sera imposible comunicarse entre ellos, ya que representara como si uno hablase en un
idioma y el otro en otro idioma.
Este protocolo se debera crear ponindose de acuerdo con el compaero que realiza la
prctica 5, que es el que realiza el cdigo del C con el que tenemos que comunicarnos. Los
datos a enviar sern de este tipo:
BITS <7:0>

START

STOP

STOP

Hay que tener en cuenta que es lo que queremos enviar, que ser:
o 1 palabra de peticin de producto
o 1 palabra de peticin de producto
o 1 palabra de cancelar
o 1 palabra de aceptar
En la recepcin de datos hay muchos datos a recibir y habra que implementar bien la
interrupcin para poder cambiar los datos e la EPROM:
o 1 palabra de peticin de dato
o 1 palabra de peticin de direccin
o 1 palabra para decir que hemos terminado de enviar un grupo de
datos (una direccin y un dato).
o 1 palabra de dato
o 1 palabra de direccin
o 1 palabra de inicio
o 1 palabra de fin
o 1 palabra para confirmar que hay producto aceptar
o 1 palabra para confirmar que no hay producto cancelar
Un ejemplo de protocolo que funciona puede ser el que est en la siguiente tabla:

TRANSMITE

RECIBE

0
1
0
1
X

0
0
1
1
X

X
X
0
1
X

CODIGO
X X
X X
0 1
1 0
X X

91

X
X
1
0
X

X
X
1
0
X

X
X
1
0
X

SIGIFICADO
Preguntar producto
Pedir producto
Cancelar
Aceptar
Dato

0
0
0
1
1
1
1
0

6.6

0
1
1
0
0
1
1
1

X
0
1
0
1
1
1
0

X
1
0
1
0
1
1
0

X
0
0
1
1
1
0
1

X
1
1
0
0
1
0
1

X
0
1
0
1
1
0
1

X
1
0
1
0
1
0
1

Direccin
Peticin direccin
Fin de transmisin
Fin de 1 grupo de datos
Peticin de dato
Inicio
Aceptar
Cancelar

Bases tericas

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro


debe hacer es interpretar las seales de entrada y salida que estn conectadas al teclado.
Se debera programar para introducir dos dgitos y una vez terminado apretar el botn
aceptar para empezar el proceso de transmisin.
El proceso consta de dos pasos. Primero se tiene que enviar el dato escrito y una vez se
reciba la contestacin del otro micro, si la respuesta es Aceptar se debera volver a enviar el
nmero. Y en el caso de que sea cancelar pararamos el proceso y empezaramos de nuevo.
Para enviar los datos hay que crear un protocolo de comunicacin. En el apartado 6.5 hay uno
de muestra que puede funcionar en esta prctica, se puede crear uno nuevo o utilizar este, pero
siempre quedando de acuerdo con el compaero que realice la prctica 5 debido a que es l el
que hace el cdigo para el micro que tiene recibir lo que nosotros enviamos.
Para la recepcin de datos hay que tener en cuenta, como se puede ver en el protocolo
del aparatado 6.5, que aparte de recibir la confirmacin de si hay el producto por el que
hemos preguntado, se reciben los datos para modificar los valores de la EEPROM. Para
comenzar el cambio de precios en la EEPROM debemos recibir en primer lugar la seal de
inicio de cambio de EEPROM. Una vez recibida dicha seal habra que asegurarse que el
usuario no puede seleccionar ningn producto por el teclado y si est en proceso de
seleccionarlo tendra que parar la seleccin y volver al inicio de empezar a seleccionar un
producto. Una vez hecho esto debera enviar la confirmacin para continuar el proceso de
cambiar el producto.
A continuacin deberamos ir recibiendo los datos necesarios para poder ir
modificando la EEPROM en el siguiente orden:

Peticin de direccin.
Direccin
Peticin de dato
Dato
Fin de grupo de datos

Si todo se va recibiendo en orden se ira respondiendo Aceptar al otro C en cada


palabra enviada, en el caso de que se reciba algn dato cuando no se esperaba se debera
cancelar el proceso de modificar los precios y enviar al otro C la seal de Cancelar.

92

Se debera sacar por pantalla del LCD el nmero que queremos enviar y la respuesta
que nos da el otro micro:

N
I

N EL valor que estamos enviando


I ACCEPT si seguimos el proceso o CANCEL si no debe seguir el proceso y
empezar el nuevo.

3x10K

5V

4.7kohm

RIBBON_10H

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1

VDD

5V
5V

10nF

OSC2 VSS1
RC0

22pF

RX

RC1

TX

RC2

RC5

RC3

RC4

RIBBON_16H
16F876

Fig. 2
HDR1X4

6.7

Explicacin esquema elctrico

Como se puede ver en el esquema elctrico (Fig.2) utilizaremos RC<3:0> como


salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para
controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la

93

paantalla del LCD, ver las caractersticas tcnicas adjuntadas en las prcticas y el apartado 6.4
Funcionamiento del display.
Una posibilidad para controlar el teclado sera RC<3:0> como salida y RB<2:0> como
entrada. El funcionamiento sera que al proporcionarle tensin a una de las salidas de RC, si
pulssemos cualquiera de las dos teclas que estn conectadas a la columna activada, en RB
obtendramos un 1 ya que comunicaramos la columna con la fila. Si pulssemos la misma
tecla y la columna no estuviese activada, en RB obtendramos un 0. Ver apartado 6.3
Funcionamiento del teclado.

6.8

Resumen de objetivos

Tenemos que hacer el cdigo para:


-

Que se reconozcan los pulsadores cuando pulsemos las teclas.

Crear o utilizar el protocolo que hay de ejemplo en el apartado 6.5, quedando de


acuerdo con los compaeros que hacen la prctica 5.

Una vez seleccionado un nmero de 2 dgitos y pulsada la tecla aceptar comenzar


a transmitir.

Si la respuesta es positiva volver a enviar el nmero y si es negativa cancelar el


proceso y esperar para comenzar de nuevo.

La recepcin de datos ser para cambiar los datos de la EEPROM con lo que a
medida que se reciban las direcciones y los valores se tendrn que ir cambiando
dichos valores.

En el caso de que se reciba la orden de empezar a cambiar los datos de la


EEPROM, que borre el nmero que hallamos seleccionado o que estemos
seleccionando para comenzar de nuevo cuando termine de cambiar los valores de la
EEPROM.

Se tendrn que poner en la pantalla del display los datos que se explican en el
apartado 6.7

6.9.

Objetivos de conocimieto

Aprender control de teclado y pantalla LCD

Escribir en una EEPROM de un microcontrolador

Apreder funcionamiento de USART de un microcontrolador

94

6.10. Diagrama de flujo

INICIO

LEER TECLA

ES
TECLA
ACEPTAR?

NO

ES
TECLA
CANCELAR?

SI

SI

BORRAR
NUMERO
INSERTADO

ENVIAR DATO

SE PUEDE
CONTIMUAR?
NO
SI
NO
SE HA
ACEPTADO?

SI

ENVIAR DATO

95

NO

PROCESAR TECLA
PARA ALMACENAR
AL NUMERO A
ENCIAR

INICIO
ITERRUPCION

ES POR
RECEPCION?

NO

NO

ES
CONFIRMACION
DE PRODUCTO

SI
NO
ESTAMOS EN
MODO PRECIO?

SI

ES INIICO
DE CAMBIAR
EEPROM?

PONER MODO
PRECIO Y
CANCELAR
PROCESO DE
INSERTAR
NUMERO

SI

ESPERAMOS
PETCION
DIRECCION?

SI

MIRAR SI HAY
PRODUCTO O NO
Y ACTUAR EN
CONSECUENCIA

NO

ES FIN DE
CAMBIO DE
EEPROM

ES PETICION
DE DIRECCION?

QUITAR MODO
PRECIO Y
ACTUALIZAR
LOS
REGISTROS

NO
SI

ESPERAMOS
DIRECCION?

SI

SI

GUARDAR
DIRECCION
ENVIADA

ES DIRECCION?

NO
NO

ESPERAMOS
PETICON
DATO?
NO

SI

SI

ES PETICION
DE DATO?

NO

ES DATO,
CAMBIAR EN
LA POSICION
DE MEMORIA
RECIBIDA EL
DATO QU
HABIA POR
ESTE RECIBIDO

ENVIAR
CANCELAR

ENVIAR
ACEPTAR

FIN
INTERRUPCION

Como se puede ver, esta sera una posible solucin simple para el problema dado.

96

Memoria descriptiva

Programa ASM

2.7. Programa ASM


2.7.1. Introduccin
Vamos a explicar las principales funciones que he diseado para realizar las diferentes
prcticas. Estas se han intentado que sean lo ms genricas posibles para no tener que repetir
el mismo cdigo varias veces.
Adems, vamos a explicar algunas cosas importantes del programa que son bsicas en
la programacin, como por ejemplo el registro del dinero pagado o el del precio del producto,
el nmero del producto a elegir y algunas funciones bsicas.
2.7.2. Mdulo1.
2.7.2.1. Visin general.
En este mdulo lo que tiene que hacer el micro es estar leyendo las teclas de las
monedas y de los productos. Mientras no se pulse ninguna tecla, el mdulo no har nada, a no
ser que venga una interrupcin, pero esto se explicar ms adelante.
Una vez pulsada una tecla se tiene que revisar cual de los dos teclados se ha pulsado y
dependiendo del que se halla pulsado, va a la funcin de revisar monedero o revisar tecla
producto. Si es el caso de monedero ira a la funcin revisar monedero.
En el caso de ser una tecla de producto, despus de ir a revisar tecla producto tendr
que mirar si se ha terminado de seleccionar un producto, que esto nos lo indicar la funcin de
revisar tecla producto. En el caso de que no se haya seleccionado vuelve a esperar una nueva
tecla.
En el caso de que s se haya seleccionado un producto, pasamos a revisar si se ha
pagado, que simplemente ser una resta entre el precio pagado y el precio que cuesta el
producto seleccionado y nos indicar si se ha pagado el producto. Si no se ha pagado iremos a
anular proceso seleccin en donde se inicia todo y volvemos a esperar una nueva tecla.
A continuacin si se ha pagado, iremos a revisar si hay producto que igual que
anteriormente, nos indicar si hay producto o no. Esto se har mediante la comunicacin
USART con el otro mdulo que nos responder si hay producto, con lo cual en el caso de que
no halla producto, como en el caso del cambio se ir a la funcin anular proceso seleccin y
volver a esperar una tecla.
Si hubiese producto se pasara a comprobar si hay cambio que lo hara mirando el
estado del interruptor de cambio, que nos indica si hay cambio o no. Si no hay cambio, se ir a
anular proceso de seleccin y en el caso de que halla cambio seguimos el proceso con dar
cambio, que se encargar de dar el cambio del producto si hace falta.

97

Memoria descriptiva

Programa ASM

Por ltimo, se ira a dar el producto e inicializar todos los registros para ir a esperar
un nueva tecla y comenzar de nuevo la seleccin de un producto cuando se vuelva a presionar
una nueva tecla.

INICIO

SE HA APRETADO
ALGUNA TECLA?

NO

SI

ES TECLA
MONEDERO?

NO

ES TECLA DE
PRODUCTO.
REVISAR TECLA
PRODUCTO

SE HA
SELECCIONADO
PRODUCTO?

SI

NO

SI
REVISAR
SI SE HA
PAGADO

REVISAR
MONEDERO.

NO
SE HA PAGADO?

ANULAR
PROD.
SELECC.

SI
M IRAR SI
HAY
PRODUCTO

HAY
PRODUCTO?

NO

SI
CALCULAR
CAMBIO Y
REVIASR SI
HAY
CAMBIO

NO

HAY
CAMBIO?

SI

DAR
CAMBIO

DAR
PRODUCTO

INICIAR
TODOS LOS
REGISTROS

Figura 31. Esquema Mdulo 1

2.7.2.2. Revisar monedero


En esta funcin lo que tiene que hacer el C, simplemente es mirar si es la tecla
cancelar o es una de las monedas. Si es la tecla cancelar se tendra que ir a devolver pagado y
lo nico que tiene que hacer es mirar lo que se ha pagado e ir a la funcin dar cambio, pero
pasando el valor de lo pagado.

98

Memoria descriptiva

Programa ASM

En el caso de que sea una moneda, se tendra que ir a detectar moneda apretada en
donde se revisar la moneda pulsada y tambin se revisara si sumando la cantidad de la
moneda pulsada a lo que llevamos pagado se supera un mximo que fijaremos, en el caso de
que no se supere se incrementar la cantidad de pagado y sacamos la nueva cantidad de
pagado por la pantalla de LCD. En el caso de que se supere el mximo de lo pagado, se tendra
que devolver la ltima moneda insertada y deber pasar el valor de dicha moneda a la funcin
dar cambio.

REVISAR
MONEDERO

SI

DEVOLVER

TECLA
CANCELAR?

INICIAR
LCD

PAGADO

NO

NO
DETECTAR
MONEDA
APRETADA

SE SUPERA
EL MXIMO?

ACTUALIZAR
CANTIDAD
D E D IN E R O
PAGADO

SI

DEVOLVER
LTIMA
MONEDA
INSERTADA

ESCRIBIR
NUEVA
CANTIDAD
EN LCD

FIN

Figura 32. Esquema revisar mondedero

2.7.2.3. Revisar producto


En esta funcin miramos que tecla se haba pulsado y en el caso de que se hubiese
pulsado la tecla cancelar se anula la seleccin que se hubiese hecho y se inicializa el C para
esperar una nueva tecla.
A la tecla Aceptar solamente se le har caso en el caso de que se haya seleccionado
un producto y activar el registroprod_seleccionado.

99

Memoria descriptiva

Programa ASM

En el caso de que sea un producto, mirar si ya se han insertado las decenas del
producto o no, y en el caso de que no se hallan insertado, pasar la tecla pulsada a las decenas
del producto a seleccionar, si ya se haban insertado, el nmero pulsado es de las unidades
con lo cual hara los clculos para seleccionar el producto y mirara el precio del producto
seleccionado y quedara a la espera de una tecla.

REVISAR
TECLA
PRODUCTO

SI
CANCELAR EL
PROCESO

TECLA
CANCELAR?
NO

TECLA
ACEPTAR?

PRODUCTO
SELECCIONADO?

NO

PRODUCTO
ELEGIDO=1

SI

NO

FALTAN
DECENAS?

SI

NO

SI

ESCRIBIR EN LCD
PROD Y EL N
DE DECENA

ES UNIDAD.
ESCRIBIR EN LCD
EL N DE LA
UNIDAD

GUARDAR
VALOR DECENA

PRODUCTO=
DECENA+UNIDAD

BUSCAR PRECIO
DEL PRODUCTO
SELECIONADO

SI
HAY PRECIO?

NO

SACAR MENSAJE
ERROR POR LCD

MOSTRAR PRECIO
POR PANTALLA
LCD

Figura 33. Esquema revisar producto

100

TECLA APRETADA=0

FIN

Memoria descriptiva

Programa ASM

2.7.2.4. Dar cambio


Esta funcin sirve para calcular las monedas a dar por el C para dar el cambio,
devolver el dinero pagado o devolver la ltima moneda pagada en el caso de se haya excedido
el dinero introducido.
Lo que se hace es pasar la cantidad de dinero que queremos devolver a travs de W del
C y a partir de ah vamos haciendo comparaciones con la moneda que queremos devolver de
la de mayor valor a la de menor. En este caso la moneda de mayor valor ser la de 1 y no la
de 2 como a la hora de pagar.
Cuando se detecte que hay que entregar una moneda se deber encender el LED que
corresponde a dicha moneda.

DAR CAMBIO

W -> C A M B I O
CAMBIO=
C A M B I O -1 0 0

CAMBIO=
C A M B I O -1 0

DAR SEAL DE
1

DAR SEAL DE
10 Cntimos

SI
CAMBIO>100?

CAMBIO>10?
SI

NO
NO
CAMBIO=
C A M B I O -5 0

DAR SEAL DE
50 Cntimos

M IRAR SI
QUEDA
CAMBIO

SI

SI

CAMBIO>50?

CAMBIO =0?

NO

NO
CAMBIO=
C A M B I O -2 0

DAR SEAL DE
5 Cntimos

DAR SEAL DE
20 Cntimos

SI
CAMBIO>20?

NO

Figura 34. Esquema dar cambio

101

FIN

Memoria descriptiva

Programa ASM

2.7.2.5. Interrupcin
En la interrupcin, primero hay que diferenciar si estamos esperando datos para
modificar la EEPROM o no. En el caso de que no estemos esperando datos para modificar la
EEPROM, miraremos si es la confirmacin de si hay producto y lo que tiene que hacer es
activar los registros de que ha recibido comunicacin. En el caso de que no hubiese producto
dara una seal de error. Tambin puede pasar que recibamos el inicio de la transmisin de la
EEPROM, con lo cual pondramos el C en modo recepcin, se anulara el producto
seleccionado y se esperara al siguiente dato.
En el caso de estar en el modo precio, iramos esperando a que se fuesen enviando los
datos, comprobando que van llegando en el orden que tocan y cambiando los datos de la
EEPROM de las direcciones que van llegando.

I N T E R R U P C I N

ES POR
RECEPCION?

NO

NO

ES
CONFIRMACION
DE PRODUCTO

SI
NO
ESTAMOS EN
MODO PRECIO?

ES INIICO
DE CAMBIAR
EEPROM?

PONER MODO
PRECIO Y
CANCELAR
PROCESO DE
INSERTAR
NUMERO

SI

SI

ESPERAMOS
PETCION
DIRECCION?

SI

M IRAR SI HAY
PRODUCTO O NO
Y ACTUAR EN
CONSECUENCIA

NO

ES FIN DE
CAMBIO DE
EEPROM

ES PETICION
DE DIRECCION?

QUITAR MODO
PRECIO Y
ACTUALIZAR
LOS
REGISTROS

NO
SI

ESPERAMOS
D IRECCION?

SI

SI

GUARDAR
D IRECCION
ENVIADA

ES DIRECCION?

NO
NO

ESPERAMOS
PETICON
DATO?
NO

SI

SI

ES PETICION
DE DATO?

NO

ES DATO,
CAMBIAR EN
LA POSICION
DE MEMORIA
RECIBIDA EL
DATOQUE
HABIA POR
ESTE RECIBIDO

ENVIAR
CANCELAR

ENVIAR
ACEPTAR

FIN
I N T E R R U P C IO N

Figura 35. Esquema interrupcin Mdulo 1

102

Memoria descriptiva

Programa ASM

2.7.3. Mdulo 2
2.7.3.1. Visin general
En este mdulo lo que se hace es esperar que se pulse una tecla y una vez pulsada se
revisa si es la tela enviar, en el caso de que sea se ira a la funcin enviar producto. Si no es
la tecla enviar, se revisa si es la tecla aceptar que en el caso que se haya introducido un nuevo
precio a un producto lo que tendra que hacer es cambiar el precio en la EEPROM de dicho
producto. Si no se hubiese puesto un nuevo precio no hara nada el C y seguira esperando
una nueva tecla.
Si es una tecla numrica ira a la funcin para seleccionar un producto o para introducir
un nuevo precio.

IN I C I O

TESTEAR
TECLADO

TECLA
APRETADA?

NO

SI

ES LA TECLA
DE ENVIAR?

SI

ENVIAR
PRODUCTO

SI

PRECIO
IN T R O D U C I D O = 1 ?

NO

LA TECLA ES
ACEPTAR?

MODIFICAR
PRECIO EN
EEPROM

NO

NO

LA TECLA ES
CANCELAR?

SI

SI

INICIAR
REGISTROS
Y ESCRIBIR
CANCEL EN
DISPLAY

INICIAR
DISPLAY

NO
SELECCIONAR
PRODUCTO O
PRECIO

Figura 36. Esquema Mdulo 2

103

Memoria descriptiva

Programa ASM

2.7.3.2. Seleccionar producto o precio


En esta funcin miramos primero si ya se haba seleccionado un producto, si no se ha
elegido vamos a la funcin elegir producto. Si ya se haba seleccionado un producto es para
poner el precio nuevo del producto, lo nico que hay que tener en cuenta que la primera vez
que se introduzca un nmero del precio de un producto se tiene que activar el registro de
precio_introducido de tal forma que podamos pulsar la tecla aceptar al terminar.

SELECCIONAR
PRODUCTO O PRECIO

NO
PRODUCTO
ELEGIDO=1?

ELEGIR
PRDUCTO

SI

NO
PRECIO
INTRODUCIDO=1?

ESCRIBIR
TECLA EN
DISPLAY

HACER
CALCULOS
Y PRECIO
INTRODUCIDO=1

ESCRIBIR
TECLA EN
DISPLAY

HACER
CALCULOS

SI

FIN

Figura 37. Esquema seleccionar producto o precio

2.7.3.3. Elegir producto


Habr que seleccionar el producto al cual le queremos cambiar el precio, para ello
igual que en el mdulo 1 primero habr que introducir las decenas y despus las unidades del
producto por eso lo primero que hace es revisar si ya se han insertado las decenas. En el caso

104

Memoria descriptiva

Programa ASM

de que ya se hubiese insertado, el nmero pulsado sera la unidad con lo que tendra que hacer
los procesos para guardar el nmero del producto y activar el registro de producto
seleccionado. En el caso de que no se hubiese insertado las decenas tendra que mirar si la
tecla pulsada no supera el nmero 3 ya que no hay productos por encima del nmero 39. A
continuacin, si no supera el nmero 3 tiene que calcular para pasar el nmero a decena.

ELEGIR
PRODUCTO

DECENAS
IN T R O D U C I D A S = 1 ?

SI

ESCRIBIR
TECLA EN
DISPLAY

BUSCAR PRECIO
PRODUCTO

ESCRIBIR
PRECIO EN
DSPLAY

NO

SI
TECLA >3?

NO

ESCRIBIR
TECLA EN
DISPLAY

CALCULAR LA
DECENA DEL
PRODUCTO

DECENAS
IN T R O D U C I D A S = 1

PRODUCTO ELEGIDO=1
Y
DECENAS
IN T R O D U C I D A S = 0

FIN

Figura 38. Esquema elegir producto

2.7.3.4. Enviar EEPROM


En esta funcin se tienen que enviar los datos para modificar la EEPROM en el otro
mdulo y para ello comienza mandando una peticin para iniciar el proceso de cambio de
EEPROM. Una vez confirmado por el otro mdulo, comienza a enviar por este orden: peticin
de direccin, direccin peticin de dato, dato. Una vez terminado se mira si era la ltima
direccin y si no vuelve a enviarlo todo. Una vez llegada a la ltima direccin se enva fin de
comunicacin.

105

Memoria descriptiva

Programa ASM

ENVIAR
EEPROM
SI

ENVIAR INICIO
TRANSMISION

NO

NO

CONTINUAMOS?

SI

SI
NO

TODO
CORRECTO?

ENVIAR
PETICION
DATO

TODO
CORRECTO?

SI
NO

ENVIAR
PETICON
DIRECCION

CONTINUAMOS?

SI
NO

NO

CONTINUAMOS?

SI

TODO
CORRECTO?

SI

NO

ENVIAR
DATO

TODO
CORRECTO?
SI

NO

ENVIAR
DIRECCION

NO

ULTIMA
DIRECCION?

CONTINUAMOS?
SI
SI
NO
CONTINUAMOS?

ENVIAR FIN
TRANSMISION
NO

TODO
CORRECTO?

SI

FIN

SI
CANELAR
TRANSMISION

Figura 39. Esquema enviar EEPROM

2.7.3.5. Interrupcin
En esta interrupcin recibiremos las confirmaciones para continuar el proceso de
transmitir los datos de la EEPROM. Aparte de esto, tambin recibimos la pregunta por si hay
un producto, que en ese caso tiene que revisar el estado si hay el producto mirando el
interruptor de producto que est en RC<4> y tambin recibe la orden de dar producto, en la
cual tiene que encender el LED de RC<5>. En los dos casos, tiene que encender en el display
de 7 segmentos el nmero del producto enviado por el mdulo 1.

106

Memoria descriptiva

Programa ASM

INICIO
ITERRUPCION

ES POR
RECEPCION?

NO

SI
SI
ES ACEPTAR?

SE PUEDE
CONTINUAR Y
ES CORRECTO

NO

SI
ES CANCELAR?

SE PUEDE
CONTINUAR Y
NO ES
CORRECTO

NO
SI
ES PREGUNTAR
PRODUCTO?

PONER DATO
EN DISPLAY
SEGMENTOS

NO

ENVIAR
CANCELAR

SI

NO

ES PEDIR
PRODUCTO?

NO
HAY PRODUCTO?

SI

PONER DATO
EN DISPLAY
SEGMENTOS Y
ENCENDER
LED DE
ENTREGAR
PRODUCTO

ENVIAR
ACEPTAR

FIN
INTERRUPCION

Figura 40. Esquema interrupcin

2.7.4. Datos de inters


2.7.4.1. Registros de dinero
Para los registros de dinero hay que tener en cuenta que lo haremos en un registro, que
como todos los registros del micro son de 8 bits, su escala ir de 0 a 255 cntimos. Entonces,
para poder superar los 255 cntimos introducidos, como la cantidad de dinero insertado es
siempre mltiple de 5 debido a que la moneda ms pequea ser la de 5 cntimos, vamos a
guardar en el micro las cantidades de dinero dividiendo entre 5 el valor real, como se explica
en el siguiente ejemplo:

107

Memoria descriptiva

Programa ASM

Dinero insertado() Valor en registro PAGADO


2,00
40
12,00
240
0,75
15
0,05
1
1,25
25
12,75
255
Tabla 7. Ejemplo registro de dinero

Con lo cual podemos guardar en 1 registro 1275 cntimos. Aunque existen otros sistemas,
como por ejemplo guardarlo en 2 registros, utilizaremos este sistema para hacer compatible el
registro con el resto de las prcticas.
2.7.4.2. Clasificacin de los productos
Para nuestra prctica solamente vamos a utilizar 40 valores de esta E2PROM y la
distribucin podra ser por ejemplo:
H00
H10
H20
H30

H09
H19
H29
H39

De esta forma al buscar un precio de un producto podemos pensar en decimal y no


tener que trabajar en hexadecimal. Un motivo es que el display de 7 segmentos solamente lo
tenemos configurado para sacar nmeros del 0 al 39. Otro motivo es que al introducir el precio
lo hacemos en decimal con lo que nos ahorramos una conversin de decimal a hexadecimal y
viceversa. Ejemplo:
Producto 12 D12 HC
2.7.4.3. Funcin Escribir_LCD
Esta funcin sirve para todas las instrucciones de la pantalla de LCD que sean menores
de 39seg. Para que funcione se tiene que pasar a travs del registro Letra el cdigo ASCII
de la letra a escribir y poner el bit del RS en el valor que le corresponde, dependiendo de si
queremos escribir o hacer otra cosa con la pantalla de LCD, antes de pasar a la funcin
Escribir_LCD
Esta funcin simplemente coge el registro Letra y le va haciendo las operaciones que
corresponden para pasar el valor a la pantalla de LCD y que esta ejecute la instruccin que se
pasa.

108

Memoria descriptiva

Programa ASM

2.7.4.4. Funcin Clear_display


Es igual que la funcin anterior de Escribir_LCD pero con la diferencia que esta es
para funciones de 1.53mseg que son la de clear display y return home.
2.7.4.5. Funcin EE_escribe
Esta funcin sirve para escribir en la EEPROM del C. El funcionamiento es que
simplemente hay que pasarle la direccin de la EEPROM que queremos escribir a travs del
registro DIREC y pasarle el dato a escribir en la EEPROM a travs del registro DATO.
2.7.4.6. Funcin EE_LEE
Esta funcin sirve para leer los datos de la EEPROM del C. Para leer los datos
solamente hay que pasar la direccin de la EEPROM al registro DIREC y a continuacin
llamar a la funcin. El dato de la EEPROM se guarda en el registro de DATO.

109

Memoria de clculo

3.MEMORIA DE CLCULO.

110

Memoria de clculo

Clculos de los esquemas elctricos

3.1. Clculos de los esquemas elctricos


Para la placa base solamente vamos a calcular las resistencias de los LEDs que vamos
a colocar para las diferentes utilidades. El esquema modelo ser el siguiente ya que la tensin
mxima en el circuito ser de 5V y todos los LEDs estarn conectados entre esos 5V y 0 V
del circuito:

R1
LED1
LED_blue

5V

V1

Figura 41. Esquema elctrico de LED

Para calcular la resistencia tendremos que la cada de tensin en el LED ser de 2V y


como mximo pueden pasar 5mA por el diodo por lo tato:

R1 =

VDD VLED 5V 2V
=
= 600
I
5mA

(1)

Cualquier resistencia superior a esta nos permite que no se pase la intensidad de los
5mA por lo tanto he puesto resistencias de 1K que son las ms comunes y son las que he
encontrado del modelo SIP.

111

Memoria de clculo

Clculos del programa ASM

3.2. Clculos del programa ASM


Los nicos clculos que haremos en el programa sern de los tiempos de espera que se
necesita para hacer funcionar la pantalla de LCD, que como se puede ver en el apartado
2.3.2.3 en la Tabla 2 Juego instrucciones de la pantalla LCD, se necesitan 39s para las
instrucciones de escribir y algunas otras como la de situar el cursor. Para la instruccin de
limpiar pantalla y la de volver al inicio el cursor, se necesita un tiempo de 1,53 ms. Por lo
tanto como hemos realizado una funcin genrica para todas las instrucciones que tienen el
mismo tiempo tenemos:
Utilizamos la funcin del TIMER0 del C en la cual el tiempo de espera ser:
(2)
t ESPERA = 4 TOSC (TMR0) N
En la frmula 2, N es el pre-scaler del registro OPTION-REG 1:N, que en nuestro
caso ser 8 y TOSC es el periodo de oscilacin que es la inversa de la frecuencia de oscilacin
de 4MHz que tenemos en el C.
Con lo cual tenemos:

tESPERA = 4 TOSC (TMR0) N = 4

1
( TMR0) 8 = 8 s (TMR0)
4MHz

(3)

*Funcin ESCRIBIR_LCD para las funciones de 39s:


En este caso con este pre-scaler tenemos:
t ESPERA = 4 TOSC (TMR0) N = 4
(TMR0) =

1
( TMR0) 8 = 8s (TMR0) = 39s
4MHz

39 s
= 4.875 = 5
8 s

(4)

Con lo cual necesitaramos poner como mnimo el TMR0 a 5 que eso es en


hexadecimal con 8 bits el FB, con lo cual el cdigo ser:

t1

movlw 0x02
movwf OPTION_REG
movlw 0xFB
movwf TMR0
btfsc TMR0,7
goto t1
movlw 0x00
movwf OPTION_REG
return

;pre-scaler 1:8
;Timer 0 a -4

;pre-scaler 1:2

112

Memoria de clculo

Clculos del programa ASM

*Funcin CLEAR_DISPLAY para las funciones de 1.53 ms:


En este caso con este pre-scaler tenemos:

tESPERA = 4 TOSC (TMR0) N = 4


(TMR0) =

1
(TMR0) 8 = 8s (TMR0) = 1.53ms
4 MHz

1.53ms
= 191,25 = 192
8s

(5)

Con lo cual necesitaramos poner como mnimo el TMR0 a -192 que eso es en hexadecimal
con 8 bits el 40 con lo cual el cdigo ser:

t1

movlw 0x02
movwf OPTION_REG
movlw 0x40
movwf TMR0
btfsc TMR0,7
goto t1
movlw 0x00
movwf OPTION_REG
return

;pre-scaler 1:8
;Timer 0 a -192

;pre-scaler 1:2

113

Presupuesto

4. PRESUPUESTO

114

Presupuesto

Lista de elementos

4.1. Lista de elementos


En este apartado sacaremos la lista de elementos necesarios para hacer la placa base de
los diferentes mdulos de prcticas.
4.1.1. Lista elementos del mdulo 1

CODIGO
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
1.22
1.23
1.24

DESCRIPCIN
Regleta de conexiones 2 contactos
LED rojo 5mm
LED verde 5mm
Condensador electroltico 47 uF. 25V
Condensador Polister 100 nF 400V. raster
Condensador Polister 22 nF 400V. raster
Condensador Polister 10 nF 400V. raster
Estabilizador de tensin positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Cable paralelo 2x1mm
Diodo rectificador estndar 1,5 Am
Conector macho para CI 2,54mm 4 pines
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Zcalo torneado 28 pines estrecho
Zcalo 16 pines
Placa fotosensible baquelita.1,2 mm 100x160 mm
74LS138N 3-line to 8-line decoder / demultiplexer
Horas de montaje
Resistencia array 8+1 1k ohmios
Tabla 8. Lista elementos mdulo 1

115

CANTIDAD
1
2
5
1
2
1
1
1
6
3
1
1
1
0,40m
1
1
2
1
1
1
1
1
5
1

Presupuesto

Lista de elementos

4.1.2. Lista elementos del mdulo 2

CODIGO
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23

DESCRIPCIN
Regleta de conexiones 2 contactos
LED rojo 5mm
Condensador electroltico 47 uF. 25V
Condensador Polister 100 nF 400V. raster
Condensador Polister 22 nF 400V. raster
Condensador Polister 10 nF 400V. raster
Estabilizador de tensin positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Cable paralelo 2x1mm
Diodo rectificador estndar 1,5 Am
Conector macho para CI 2,54mm 4 pines
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Placa fotosensible baquelita.1,2 mm 100x160 mm
Zcalo torneado 28 pines estrecho
Zcalo 16 pines
74LS47N BCD-to-Seven-Segment
Decoders/Drivers
Horas de montaje
Display nodo comn 13x19 color rojo 3000-8000
mcd
Tabla 9. Lista elementos mdulo 2

116

CANTIDAD
1
2
1
2
1
1
1
16
4
1
1
1
0,40m
1
1
1
1
1
1
2
2
5
2

Presupuesto

Lista de precios unitarios

4.2. Lista de precios unitarios


En este apartado ponemos los precios de cada elemento de cada placa.
4.2.1. Lista de precios unitarios de elementos del mdulo 1

CODIGO
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
1.22
1.23
1.24

DESCRIPCIN
Regleta de conexiones 2 contactos
LED rojo 5mm
LED verde 5mm
Condensador electroltico 47 uF. 25V
Condensador Polister 100 nF 400V. raster
Condensador Polister 22 nF 400V. raster
Condensador Polister 10 nF 400V. raster
Estabilizador de tensin positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Cable paralelo 2x1mm
Diodo rectificador estndar 1,5 Am
Conector macho para CI 2,54mm 4 pines
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Zcalo torneado 28 pines estrecho
Zcalo 16 pines
Placa fotosensible baquelita.1,2 mm 100x160 mm
74LS138N 3-line to 8-line decoder / demultiplexer
Horas de montaje
Resistencia array 8+1 1k ohmios
Tabla 10. Lista precios unitarios elementos mdulo 1

117

PRECIO
0.22
0.09
0.09
0.13
0.19
0.16
0.15
0.29
0.0187
0.0187
0.0187
0.87
0.87
0.60/m
0.057
0.10
0.16
0.28
0.51
0.12
0.32
0.91
15.00 /h
0.18

Presupuesto

Lista de precios unitarios

4.2.2. Lista de precios unitarios de elementos del mdulo 2

CODIGO
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23

DESCRIPCIN
Regleta de conexiones 2 contactos
LED rojo 5mm
Condensador electroltico 47 uF. 25V
Condensador Polister 100 nF 400V. raster
Condensador Polister 22 nF 400V. raster
Condensador Polister 10 nF 400V. raster
Estabilizador de tensin positiva LM7805
Resistencia 1K ohmios 1/4 watio
Resistencia 10K ohmios 1/4 watio
Resistencia 4,7K ohmios 1/4 watio
banana paso 4mm negra
banana paso 4mm roja
Cable paralelo 2x1mm
Diodo rectificador estndar 1,5 Am
Conector macho para CI 2,54mm 4 pines
Conector macho C/I para cable plano 10 hilos 1
metro
Conector macho C/I para cable plano 16 hilos 1
metro
Placa fotosensible baquelita.1,2 mm 100x160 mm
Zcalo torneado 28 pines estrecho
Zcalo 16 pines
74LS47N BCD-to-Seven-Segment Decoders/Drivers
Horas de montaje
Display nodo comn 13x19 color rojo 3000-8000
mcd
Tabla 11. Lista de precios unitarios de elementos del mdulo 2

118

PRECIO
0.22
0.09
0.13
0.19
0.16
0.15
0.29
0.0187
0.0187
0.0187
0.87
0.87
0.60/m
0.057
0.10
0.16
0.28
3.22
0.51
0.12
0.49
15.00 /h
1.51

Presupuesto

Coste total

4.3. Coste total


Aqu unimos las cantidades y los precios unitarios para sacar el precio total de cada
mdulo.
4.3.1. Coste total del mdulo 1

DESCRIPCIN
CANTIDAD PRECIO
CODIGO
1.1
Regleta de conexiones 2 contactos
1
0.22
1.2
LED rojo 5mm
2
0.09
1.3
LED verde 5mm
5
0.09
Condensador electroltico 47 uF.
1.4
25V
1
0.13
Condensador Polister 100 nF 400V.
1.5
raster
2
0.19
Condensador Polister 22 nF 400V.
1.6
raster
1
0.16
Condensador Polister 10 nF 400V.
1.7
raster
1
0.15
Estabilizador de tensin positiva
LM7805
1.8
1
0.29
1.9
Resistencia 1K ohmios 1/4 watio
6
0.0187
1.10 Resistencia 10K ohmios 1/4 watio
3
0.0187
1.11 Resistencia 4,7K ohmios 1/4 watio
1
0.0187
1.12 banana paso 4mm negra
1
0.87
1.13 banana paso 4mm roja
1
0.87
1.14 Cable paralelo 2x1mm
0,40m
0.60/m
1.15 Diodo rectificador estndar 1,5 Am
1
0.057
Conector macho para CI 2,54mm 4
1.16
pines
1
0.10
Conector macho C/I para cable
1.17
2
0.16
plano 10 hilos 1 metro
Conector macho C/I para cable
1
0.28
1.18
plano 16 hilos 1 metro
1.19 Zcalo torneado 28 pines estrecho
1
0.51
1.20 Zcalo 16 pines
1
0.12
Placa fotosensible baquelita.1,2 mm
1.21
1
0.32
100x160 mm
74LS138N 3-line to 8-line decoder /
1.22
1
0.91
demultiplexer
1.23 Horas de montaje
5
15.00 /h
1.24 Resistencia array 8+1 1k ohmios
1
0.18
TOTAL
Tabla 12. Coste total del mdulo 1

119

TOTAL
0.22
0.18
0.45
0.13
0.38
0.16
0.15
0.29
0.11
0.06
0.02
0.87
0.87
0.24
0.06
0.10
0.32
0.28
0.51
0.12
0.32
0.91
75.00
0.18
81.92

Presupuesto

Coste total

4.3.2. Coste total del mdulo 2

DESCRIPCIN
CANTIDAD PRECIO
CODIGO
2.1
Regleta de conexiones 2 contactos
1
0.22
2.2
LED rojo 5mm
2
0.09
2.3
Condensador electroltico 47 uF. 25V
1
0.13
Condensador Polister 100 nF 400V.
raster
2.4
2
0.19
2.5
Condensador Polister 22 nF 400V. raster
1
0.16
2.6
Condensador Polister 10 nF 400V. raster
1
0.15
2.7
Estabilizador de tensin positiva LM7805
1
0.29
2.8
Resistencia 1K ohmios 1/4 watio
16
0.0187
2.9
Resistencia 10K ohmios 1/4 watio
4
0.0187
2.10 Resistencia 4,7K ohmios 1/4 watio
1
0.0187
2.11 banana paso 4mm negra
1
0.87
2.12 banana paso 4mm roja
1
0.87
2.13 Cable paralelo 2x1mm
0,40m
0.60/m
2.14 Diodo rectificador estndar 1,5 Am
1
0.057
2.15 Conector macho para CI 2,54mm 4 pines
1
0.10
Conector macho C/I para cable plano 10
1
0.16
2.16
hilos 1 metro
Conector macho C/I para cable plano 16
1
0.28
2.17
hilos 1 metro
Placa fotosensible baquelita.1,2 mm
1
3.22
2.18
100x160 mm
2.19 Zcalo torneado 28 pines estrecho
1
0.51
2.20 Zcalo 16 pines
2
0.12
74LS47N BCD-to-Seven-Segment
2.21
2
0.49
Decoders/Drivers
2.22 Horas de montaje
5
15.00 /h
Display nodo comn 13x19 color rojo
2.23
2
1.51
3000-8000 mcd
TOTAL
Tabla 13. Coste total del mdulo 2

120

TOTAL
0.22
0.18
0.13
0.38
0.16
0.15
0.29
0.30
0.07
0.02
0.87
0.87
0.24
0.06
0.10
0.16
0.28
3.22
0.51
0.24
0.98
75.00
3.02
87.45

Presupuesto

Resumen del presupuesto

4.4. Resumen del presupuesto


Aqu pongo el precio de lo que costara el total de realizar los mdulos para las
prcticas para los diferentes grupos. Se han pensado 8 unidades del mdulo 1 debido a que hay
4 prcticas en las que se utiliza este mdulo y 4 unidades del mdulo 2, ya que como antes hay
2 prcticas que utilizan este mdulo.
ELEMENTO
MDULO 1
MDULO 2

UNIDADES
8
4

PRECIO
81.92
87.45
TOTAL
IVA 16%
TOTAL CON IVA

TOTAL
655.36
349.80
1,005.19
160.83
1,166.02

Tabla 14. Resumen presupuesto

No incluyo los ordenadores, ni los kits del MPLAB-ICD, teclados y pantallas de LCD, debido
a que ya estn en los laboratorios de pruebas y no es necesario comprar estos elementos ya que
se pueden aprovechar.

121

Planos

5. PLANOS

122

Planos

Esquemas de elementos

En este aparatado se exponen los esquemas elctricos de los elementos que componen
las prcticas. A continuacin los esquemas de cada mdulo con los esquemas de sus
respectivas prcticas y el esquema final de todo el mdulo completo.
5.1 . Esquemas de elementos
Aqu ponemos los esquemas de los elementos independientes de las prcticas que
vamos a realizar.
5.1.1. Esquema Regulador fuente tensin

U1
LM7805CT

J1

LED1

Vreg
IN OUT

HDR1X2

47uF

100nF

C1

C2

LED_red R1
100nF
1.0kohm
C3

Figura 42. Esquema regulador fuente tensin

5.1.2. Esquema del 74LS47


VDD

5V

RA4

RB2

RB1

5V RB3

RB0

RA3

U1

VDD

U2

U3

74LS47N

OA
13

11

12

123

OB

Figura 43. Esquema del 74LS47

R14
1.0kohm

1.0kohm

R7
1.0kohm

R13

1.0kohm

R6
1.0kohm

10

R12

1.0kohm

OC

1.0kohm

R5

R11

1.0kohm

1.0kohm

R4

15

R10

1.0kohm

OD

R9
1.0kohm

R3

R2
1.0kohm

14

1.0kohm

OE

R8

1.0kohm

OF

13

11

12

10

15

14

R1

LT

A B C DE F G

RBI OG

BI/RBO

OA

OB

OC

OD

OE

OF

A B C DE F G

SEVEN_SEG_DISPLAY

74LS47N

SEVEN_SEG_DISPLAY

LT

RBI OG

BI/RBO

U4

Planos

Esquemas de elementos

5.1.3. Esquema del 74LS138

LED_green
5 centimos

VDD
RA0

U1

Y1
Y2
Y3

~G2A

9
7

LED_green
50 centimos

Y7

~G2B

Y6

10

Y5

LED_green
20 centimos

11

G1

12

13

5V

Y4

14

Y0

RA3

LED_green
10 centimos

RA1

R1

15

4.7kOhm

74LS138N

LED_green
1 euro

Figura 44. Esquema del 74LS138

5.1.4. Esquema comunicacin USART

J1
TX
RX

HDR1X4
Figura 45. Esquema comunicacin USART

124

5V

Planos

Esquemas de elementos

5.1.5. Conector teclado


En este apartado se indican las conexiones de los tres teclados que hay en nuestros
mdulos:

5.1.5.1.Teclado producto

RC0

RC1

J1

RC2

RC3

RB0

RB1

RB2

HDR2X5

R3

R1

R2

10kohm

10kohm

10kohm

Figura 46. Teclado producto

5.1.5.2. Teclado monedero

RA3

R1

R2

10kohm

10kohm

J1

RA4

RC0

RC1

RC2

RC3

HDR2X5
Figura 47. Teclado monedero

125

Planos

Esquemas de elementos

5.1.5.3. Teclado precio

RC0

RC1

J1

RC2

RC3

RA0

RA1

RA2

RA3

HDR2X5

R3

R1

R2

R4

10kohm

10kohm

10kohm

10kohm

Figura 48. Teclado precio

5.1.6. Esquema conector pantalla LCD


5.1.6.1. LCD modulo 1
VCC
J1
RB3
RB4

RC0

RC1

RC2

RC3

RIBBON_16H

Figura 49. LCD mdulo 1

5.1.6.2. LCD modulo 2


VCC
J1
RB4
RB5

RC0

RC1

RC2

RC3

RIBBON_16H

Figura 50. LCD mdulo 2

126

Planos

Esquemas Prcticas Modulo 1

5.2 Esquemas Prcticas Mdulo 1


5.2.1. Esquemas Prctica 1
5V

5V

4.7kohm
RIBBON_16H

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1

VDD

OSC2 VSS1

22pF

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

16F876

2x10K
RIBBON_10H

Figura 51. Esquema prctica 1

127

5V

10nF

Planos

Esquemas Prcticas Modulo 1

5.2.2. Esquemas Prctica 3

3x10K

5V

4.7kohm

RIBBON_10H

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

ENTREGA PRODUCTO

OSC1 VDD

1.0kohm
5V
5V

10nF

OSC2 VSS1

22pF

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

RIBBON_16H
16F876
5V
HAY PRODUCTO
HAY CAMBIO

Figura 52. Esquema prctica 3

128

Planos

Esquemas Prcticas Modulo 1

5.2.3. Esquemas Prctica 4


5V
1kOhm

RIBBON_10H

4.7kohm

7
Y7
~G2B

~G2A

Y6

74LS138N

10
6

5V

G1

Y5

11

Y4

12

Y3

13

Y2
C

14

Y1
B

5V

10 cent20 cent50 cent

Y0

15

5 cent

3x10K

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1 VDD

5V
5V

10nF

OSC2 VSS1

22pF

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

RIBBON_16H
16F876
5V

HAY CAMBIO

Figura 53. Esquema prctica 4

129

Planos

Esquemas Prcticas Modulo 1

5.2.4. Esquemas Prctica 6

3x10K

RIBBON_10H

Vpp PGD

5V

RA0 PGC
RA1 RB5
RA2 RB4
RA3 RB3

4.7kohm

5V
5V

RA4 RB2
RA5

RB1

Vss RB0
OSC1VDD

10nF

OSC2VSS1

22pF

RC0

RX

RC1

TX

RC2 RC5
RC3 RC4

RIBBON_16H
16F876

HDR1X4

Figura 54. Esquema prctica 6

130

Planos

Esquemas Prcticas Modulo 1

5.2.5. Esquema general


5V

1kOhm

7
Y7

Y6

~G2B

~G2A

74LS138N

10
6

5V

G1

Y5

11

Y4

12

Y3

13

Y2
C

14

Y1
B

Y0

15

5 cent 10 cent20 cent50 cent 1

3x10K

RIBBON_10H
5V

4.7kohm

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

ENTREGA PRODUCTO

OSC1 VDD

1.0kohm
5V
5V

10nF

OSC2 VSS1

22pF

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

RIBBON_16H
16F876
5V
RIBBON_10H 2x10K

HAY PRODUCTO
HDR1X4
HAY CAMBIO

Figura 55. Esquema general

131

Planos

Esquemas Prcticas Modulo 1

5.2.6. Diseo placa base

Figura 56. Diseo placa base

132

Planos

Esquemas Prctica Mdulo 2

5.3.

Esquemas Prctica Mdulo 2

5.3.1

Esquemas Prctica 2

4x10K

RIBBON_10H

5V

4.7kohm

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1

VDD

5V

OSC2 VSS1

22pF

5V

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

10nF

16F876

RIBBON_16H

Figura 58. Esquema prctica 2

5.3.2. Esquemas Prctica 5 y mdulo 2

SEVEN_SEG_DISPLAY

4x10K

RIBBON_10H

13

7
A

OA

OB

OC

OD

LT

OF

RBI

OG

1
2

5V
5V

4.7kohm
5V

22pF

RIBBON_16H

Vpp

PGD

RA0

PGC

RA1

RB5

RA2

RB4

RA3

RB3

RA4

RB2

RA5

RB1

Vss

RB0

OSC1

VDD

OSC2

VSS1

RC0

RX

RC1

TX

RC2

RC5

RC3

RC4

6
OE

3
5

12
11

A B C DE F G

10
9
15
14

4
BI/RBO

74LS47N
13

7
A

OA

OB

OC

OD

1
2

10nF

6
OE

3
LT

OF

RBI

OG

12
11
10
9
15
14

4
BI/RBO

16F876

1.0kohm

74LS47N
LED_red
5V
HDR1X4

HAY PRODUCTO

Figura 59. Esquema prctica 5 y mdulo 2

133

SEVEN_SEG_DISPLAY

AB CDE FG

Planos

Esquemas Prctica Mdulo 2

5.3.3. Diseo placa base

Figura 60. Diseo placa base

134

ANEXOS

Anexo

Programa ASM de prctica 1

A.

Lista de cdigos de programa

A.1 Mdulo 1
A.1.1. Programa ASM de prctica 1
include "p16f877.inc"

;registros de proposito general


rmoneda
rprecio
tapreta
r1
r2
mas_fil
modetect
rmonaux
pagado
digito

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

0x40
0x42
0x43
0x50
0x51
0x52
0x54
0x58
0x59
0x5b

ret
letra
letraux
lauxil
pausa
cambio
pausa2
aux
aux2

equ
equ
equ
equ
equ
equ
equ
equ
equ

0x60
0x61
0x5a
0x62
0x63
0x34
0x38
0x39
0x3a

;valor de la tecla apretada


;precio producto
;registro para saber si tecla esta apretda
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;moneda a enviar
;reg para calcular las decenas en precio
;reg de la cantidad pagada
;reg aux para el digito a pasar al LCD a traves de
;letra
;para hacer el retardo
;reg para escribir en LCD
;reg aux para escr precios en LCD
;reg auxiliar para escribir moneda
;reg auxiliar para hacer pausa
;el cambio a dar
;otro reg para pausa
;reg auxiliar
;reg auxiliar2

;Rutina principal
org 0x00
Inicio
call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD
call conf_tec
;vamos a rutina para dar vlaores a las teclas
call conf_mic
;vamos a rutina para configurar el micro
buckle
nop
call ver_moneda
btfsc tapreta,1
;mira si hay una tecla apretada y si no es asi mira
call detectmoneda ;la ocion del teclado si no va a volver a mirar el
goto buckle
;LCD
;rutina para iniciar el LCD
iniciar_LCD
banksel TRISA
movlw 0xF0
movwf TRISC
;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0x07
movwf TRISB
;RB<0:2> entradas RC<3:7> salidas

Anexo

Programa ASM de prctica 1


movlw 0x18
movwf TRISA
;RA<0:2> SALIDAS RA <3:4> entradas
movlw 0x83
;ponemos el pre-escaler a 1:16
movwf OPTION_REG
banksel PORTA
clrf PORTA
;ponemos la instruccin FUCTION SET
call RS0
call E1
movlw 0x02
movwf PORTC
call E0
call retardo
movlw 0x2F
movwf letra
call escribir_LCD
call retardo
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo
call RS1
return
;fin de la inicializacin del LCD

;asignamos cada valor del teclado a un registro


conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xc
;tecla f
movwf 0x23
movlw 4
;tecla 4
movwf 0x24
movlw 5
;tecla 5
movwf 0x25
movlw 6
;tecla 6
movwf 0x26
movlw 0xd
;tecla e
movwf 0x27
movlw 7
;tecla 7
movwf 0x28
movlw 8
;tecla 8
movwf 0x29
movlw 9
;tecla 9
movwf 0x2a
movlw 0xe
;tecla d

II

Anexo

Programa ASM de prctica 1


movwf 0x2b
movlw 0xa
movwf 0x2c
movlw 0
movwf 0x2d
movlw 0xb
movwf 0x2e
movlw 0xf
movwf 0x2f
return

;tecla a
;tecla 0
;tecla b
;tecla c

;Configuracion del micro


conf_mic
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x7
movwf ADCON1
;salidas digitales
movlw 0x87
movwf OPTION_REG ;preescaler a 256
banksel PORTC
; banco 0
clrf r1
clrf r2
clrf pagado
clrf tapreta
;inicializa el valor del reg. de
clrf rmoneda
;inicializa el valor del reg. de
clrf rprecio
;inicializamos el valor del reg.
call mens_inicio ;sacamos por pantalla el mens.
return

valor de tecla
la tecla apretada
de precio
de inicio

;vamos dando un '1' a las columnas para ir comprobando si la tecla esta


apretada
ver_moneda
movlw 0x1
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q estamos en la columna 1
call rev_fila
;vamos a mirar las filas una por una
movlw 0x2
movwf PORTC
movlw 0x04
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila
;volvemos a mirar filas
movlw 0x4
movwf PORTC
movlw 0x08
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila
;volvemos a mirar filas
movlw 0x8
movwf PORTC
movlw D'12'
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila
;volvemos a mirar filas
return
;volvemos al principio
rev_fila

III

Anexo

Programa ASM de prctica 1


clrf r2
movlw 0x08
movwf mas_fil
btfsc PORTA,3

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call ret_tecl_moneda
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw
movwf
movwf
btfsc

0x10
r2
mas_fil
PORTA,4

;ponemos el valor 4 para saber q es la fila 2


;volvemos a guardar mascara
;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call ret_tecl_moneda
return
;en esta rutina hacemos un pequeo retardo para los rebotes
;buckle para saber que tecla del monedro est apretada.
ret_tecl_moneda
movlw 0x0F
movwf ret
;actualizamos el registro para el retardo
buck_re2
decfsz ret,f
goto buck_re2
movf PORTA,w
andwf mas_fil,w
btfsc STATUS,Z
return

;se va decrementando ret hasta q volvemos a


; comprobar el PORTC
;hace una and
;resultado es
;esta pulsada
; STATUS esta
;asi seguimos

entre la mascara guardada y W si el


diferente de 0 es q la tecla
para mirarlo si el flag Z del
a 0 es q la tecla se pulso si no es
con el programa

;aqui calculamos la tecla apretada en el monedero


most_num2
clrw
addwf r1,w ;sumamos los valores de r1 y r2 para saber la tetcla
addwf r2,f ; apretada
rrf r2,f
;rotamos 2 veces el valor de r2 para que nos coincida
rrf r2,w
; el valor de r2 con el numero del registro de tecla
addlw 0x20 ; guardado
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rmoneda
;guardamos el resultado de la tecla
bsf tapreta,1
;poenmos a '1' el registro de tapreta para saber ;si
hay tecla apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec2 movf PORTA,w
andwf mas_fil,w
;volvemos a utilizar la mascara para saber si la
btfss STATUS,Z
;tecla sigue apretada hasta q el flag Z no este
goto sol_tec
;acticado no saldra del buckle
return
;-----------------------------------------------------------------------;rutina para detectar moneda
detectmoneda

IV

Anexo

Programa ASM de prctica 1


movf rmoneda,w
btfsc rmoneda,3
goto mirarsiopcion
movf rmoneda,w
movwf modetect
call detect_moneda
return

Dev_pagado
movf pagado,w
call dev_dinero
clrf pagado
call mens_inicio
clrf tapreta
return

;pasamos la cantidad de dinero pagada al W


;para que la funcion dev_dinero devuelva
;dicho dinero y ponemos a 0 la cantidad
; pagada

detect_moneda
btfsc modetect,2
goto detec_50_100_200
btfsc modetect,1
goto detec_10y20
movf modetect,w
goto fin_detect

;si la tecla es menor de 8 saltamos


;si la tecla es mayor de 8 vamos a ver si
;es la tecla de cancelar
;pasamos la moneda detectada al registro y
;vamos a detectarla

;si la tecla es < de


;si la tecla es > de
;200 cent
;si la tecla es < de
;si la tecla es > de
;cent
;aqui ya sabemos que

4 saltamos
4 es la moneda 50 100 o
2 saltamos
2 es la moneda 10 o 20
es la moneda de 5 cent

detec_10y20
btfsc modetect,0
goto detect_20
movlw D'2'
goto fin_detect

;diferenciamos entre la moneda de 10 y 20 cent si


;es la la tecla 2 es la moneda de 10 y por lo
;tanto en pagado habr que incrementar el valor
;de '2'

detect_20
movlw D'4'
goto fin_detect

;aqui sabemos que es la moneda de 20 cent y habr


;que incrementar en '4' el valor de pagado

detec_50_100_200
btfsc modetect,1
goto detec_200
btfsc modetect,0
goto detec_100
movlw D'10'
goto fin_detect

;diferenciamos entre las monedas de 50 100 y 200


; centimos

;si es la tecla 4 llegar hasta aqui y sabremos


;que es la moneda de 50 cent por lo tanto
;incrementamos en '10' pagado

detec_200
movlw D'40'
goto fin_detect

;aqui sabemos que es la moneda de 200 cent y


;habr que incrementar en '40' el valor de pagado

detec_100
movlw D'20'
goto fin_detect

;aqui sabemos que es la moneda de 100 cent y


;habr que incrementar en '20' el valor de pagado

fin_detect

;a esta funcin las anteriores le pasan por el W el


;valor a incrementar el registro pagado
movwf aux
;lo que vamos a aadir se pone en aux por si hemos
addwf pagado
;metido ms monedas de la cuenta

Anexo

Programa ASM de prctica 1


btfsc STATUS,C
goto exceso_de_dinero
;en el caso de haber pasado el tope se ir
call RS0
;a esta funcin
movlw 0x2
;pasamos este valor para hacer un return home en
movwf letra
;el LCD
call clear_display
movf pagado,w
;iniciamos registros
clrf digito
clrf tapreta
call pasar_a_LCD ;y escribimos lo pagado en la pantalla de LCD
call escribir_PG ;despues del valor de lo pagado escribimos PG en
return
; el LCD

exceso_de_dinero
movf aux,w
;en el caso de exceso de dinero devovlemos la moneda
subwf pagado,f ;insertada y restamos la ultima moneda al registro
call dev_dinero ;pagado
clrf tapreta
;inciamos registro de tecla apretada para esperar la
return
; proxima tecla
mirarsiopcion
;Aqui revisamos si es cancelar y devolver lo pagado
btfss rmoneda,0
call Dev_pagado
;Aqui se ha cancelado y se devolveria lo pagado
fin

clrf tapreta
clrf rmoneda
return

;iniciamos registros

;-------------------------------------------------------------pasar_a_LCD
movwf letraux
clrf digito
b_millares
;para saber si hay ms de 10 euros metidos
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
addwf letraux

;este es solo en caso q sea + de 10 euros

millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito

b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C

;calculo las centenas de lo que he metido

VI

Anexo

Programa ASM de prctica 1


goto centenas
movlw 1
addwf digito
goto b_centenas

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito
b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;--------------------------------------------------------------------dev_dinero ;esta rutina ser la que tenga que hacer el de la practica 4
nop
;en esta prctica no har nada
return
;-----------------------------------------------------------------------mens_inicio
movlw 0x1
;limpiamos la pantalla
movwf letra
call clear_display
movf pagado,w
;pasamos el valor de lo pagado al W para que la
call pasar_a_LCD ; funcin pasar_a_LCD nos saque lo pagado por el
call escribir_PG ; LCDescribimos PG despus
return
escribir_PG
movlw 0x50
movwf letra

;letra P

VII

Anexo

Programa ASM de prctica 1


call escribir_LCD
movlw 0x47
;letra G
movwf letra
call escribir_LCD
return

clear_display
;funcin para las instruciones de 1,53ms de la
banksel TRISB
;pantalla de LCD
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
t0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return
escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0
t1
btfsc TMR0,7
goto t1
return
E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,4
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,4
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,3

VIII

Anexo

Programa ASM de prctica 1


return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,3
return

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01
;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return
;-------------------------------------------------------------------------retardo
;funciones para retardos este sera cortito
movlw 0xFF
movwf pausa
retm
decfsz pausa
goto retm
return
retardo_largo
;funcn para un retardo un poco ms largo que el anterior
movlw 0xFF
movwf pausa2
ret_l1
movlw 0xFF
movwf pausa
ret_l2
banksel TRISB
banksel PORTB
decfsz pausa
goto ret_l2
decfsz pausa2
goto ret_l1
return
end

IX

Anexo

Programa ASM de prctica 3

A.1.2. Programa ASM de prctica 3

include "p16f877.inc"
;registros de proposito general
rmoneda
tapreta
rprecio
r1
r2
mas_fil
lim_tec

equ
equ
equ
equ
equ
equ
equ

0x40
0x41
0x42
0x50
0x51
0x52
0x55

num_prod
rmonaux
pagado
digito

equ
equ
equ
equ

0x56
0x58
0x59
0x5b

ret
equ 0x60
letra
equ 0x61
letraux
equ 0x5a
lauxil
equ 0x62
pausa
equ 0x63
DATO
equ 0x30
DIREC
equ 0x31
err_prod
equ 0x32
contador
equ 0x33
prod_elegido equ 0x36
decenas
equ 0x37
pausa2
equ 0x38
aux
equ 0x39
aux2
equ 0x3a
esp_prec
equ 0x3b
producto
equ 0x3c

;valor de la tecla apretada


;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;reg. para saber q tiene q detectar 2 teclas en
;producto
;registro del numero del producto
;reg para calcular las decenas en precio
;reg de la cantidad pagada
;reg aux para el digito a pasar al LCD a traves de
;letra
;para hacer el retardo
;reg para escribir en LCD
;reg aux para escr precios en LCD
;reg auxiliar para escribir moneda
;reg auxiliar para hacer pausa al dar moneda
;dato de eprom
;direcion eprom
;si el producto existe o hay cambio
;contador para escribir '#' si no hay precio
;para saber si se ha elegido el producto
;guardamos las decenas de los productos
;otro reg para pausa
;reg auxiliar
;reg auxiliar2
;para mover el cursor en le precio
;donde guardamos el numero del producto

;Rutina principal
org 0x00
Inicio
call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD
call conf_tec
;vamos a rutina para dar vlaores a las teclas
call conf_mic
;vamos a rutina para configurar el micro
buckle
nop
call ver_moneda
btfss tapreta,0
goto buckle
call pedir_prod
goto buckle

;se mira si se a apretado una tela de producto

;va al aparatado de elegir producto

;rutina para iniciar el LCD


iniciar_LCD
banksel TRISA

Anexo

Programa ASM de prctica 3


movlw 0xF0
movwf TRISC
;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0x07
movwf TRISB
;RB<0:2> entradas RC<3:7> salidas
movlw 0x18
movwf TRISA
;RA<0:2> SALIDAS RA <3:4> entradas
movlw 0x83
;ponemos el pre-escaler a 1:16
movwf OPTION_REG
banksel PORTA
clrf PORTA
;ponemos la instruccin FUCTION SET
call RS0
call E1
movlw 0x02
movwf PORTC
call E0
call retardo
movlw 0x2F
movwf letra
call escribir_LCD
call retardo
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo
call RS1
return
;fin de la inicializacin del LCD

;asignamos cada valor del teclado a un registro


conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xc
;tecla f
movwf 0x23
movlw 4
;tecla 4
movwf 0x24
movlw 5
;tecla 5
movwf 0x25
movlw 6
;tecla 6
movwf 0x26
movlw 0xd
;tecla e
movwf 0x27
movlw 7
;tecla 7
movwf 0x28
movlw 8
;tecla 8

XI

Anexo

Programa ASM de prctica 3


movwf 0x29
movlw 9
movwf 0x2a
movlw 0xe
movwf 0x2b
movlw 0xa
movwf 0x2c
movlw 0
movwf 0x2d
movlw 0xb
movwf 0x2e
movlw 0xf
movwf 0x2f
return

;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c

;Configuracion del micro


conf_mic
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x7
movwf ADCON1
;salidas digitales
movlw 0x87
movwf OPTION_REG ;preescaler a 256
banksel PORTC
; banco 0
clrf r1
;iicializamos registros
clrf r2
clrf tapreta
clrf rprecio
clrf num_prod
clrf rmoneda
clrf decenas
clrf prod_elegido
bsf lim_tec,0
clrf err_prod
banksel EECON1
;esto es para configurar la EEPROM
bcf EECON1,EEPGD ;ponemos en modo ecritura de datos
banksel PORTB
;volvemos al primer banco
call mens_inicio
call op_a_producto ;para iniciar registros en modo pedir producto
return
;vamos dando un '1' a las columnas para ir comprobando si la tecla esta
;apretada
ver_moneda
movlw 0x1
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q estamos en la columna 1
call rev_fila
;vamos a mirar las filas una por una
movlw 0x2
movwf PORTC
movlw 0x04
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila
;volvemos a mirar filas
movlw 0x4
movwf PORTC
movlw 0x08

XII

Anexo

Programa ASM de prctica 3


movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila
;volvemos a mirar filas
movlw 0x8
movwf PORTC
movlw D'12'
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila
;volvemos a mirar filas
return
;volvemos al prinicipio

rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTB,0

;si hay tecla apretada salta para ir mas rapido

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTB,1

;ponemos el valor 4 para saber q es la fila 2

;volvemos a guardar mascara


;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x02
;guardamos el valor 8 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTB,2
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return

;en esta rutina hacemos un pequeo retardo para los rebotes


ret_tcl_producto
movlw 0x0F
movwf ret
;actualizamos el registro para el retardo

buck_re
decfsz ret,f
goto buck_re
movf PORTB,w
andwf mas_fil,w

;se va decrementando ret hasta q volvemos a


;comprobar el PORTB
;hacemos una and entre la mascara guardada y W
;si el resultado es diferente de 0 es q la tecla
;esta pulsada

XIII

Anexo

Programa ASM de prctica 3


btfsc STATUS,Z
return

;para mirarlo si el flag Z del STATUS esta a 0 es q


;la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada


most_num
clrw
addwf r1,w
;sumamos r1 y r2 para despues saber el valor de
addwf r2,w
;la tecla apretada
addlw 0x20
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rmoneda
;guardamos el resultado de la tecla
bsf tapreta,0
;se pone a '1' tapreta para saber que hay tecla
;apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec
movf PORTB,w
andwf mas_fil,w
btfss STATUS,Z
goto sol_tec
return

;volvemos a utilizar la mascara para saber si la


; tecla sigue apretada hasta q el flag Z no este
; acticado no saldra del buckle

;-------------------------------------------------------------pasar_a_LCD
movwf letraux
clrf digito
b_millares
;para saber si hay ms de 10 euros metidos
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
;este es solo en caso q sea + de 10 euros
addwf letraux
millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C
goto centenas
movlw 1
addwf digito
goto b_centenas

;calculo las centenas de lo que he metido

XIV

Anexo

Programa ASM de prctica 3

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito
b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;-------------------------------------------------------------------------;rutina para elegir producto
pedir_prod
call elegir_prod
;vamos a elegir el producto y cuando volvemos
btfss prod_elegido,0
;si se a terminado de elegir continuamos si no
return
;esperamos otra tecla
rev_prod
btfsc err_prod,0
goto esc_err_prec
call det_si_prod
btfsc err_prod,1
goto no_dar
call RS0
movlw 2
movwf letra
call escribir_LCD
call RS1
call det_si_cambio
bcf STATUS,Z
movlw 0xF

;miramos que no hayamos cogido un producto que


;no tiene precio si es as vamos mostrar el error
;revismos si hay producto si no lo hay iremos a
;mostrar el error y no dar
;ponemos el display en 1 linea

;mirarmos si hay que dar cambio y si hay cambio

XV

Anexo

Programa ASM de prctica 3

andwf err_prod
btfss STATUS,Z
goto no_dar
;si a avido algn problema vamos a no dar producto
call retardo_largo
call dar_producto ;todo correcto damos el producto y hacemos pausas
call retardo_largo
call retardo_largo
call retardo_largo
call retardo_largo
clrf pagado
call mens_inicio ;inicializamos LCD y registros y esperamos nueva
movlw 0x1
;seleccion de producto
subwf lim_tec
call iniciar_regs
call op_a_producto
return
;-----------------fin del cuerpo de pedir producto-----------------------comprobar_precio
;rutina para comprobar si se ha pagado prod
movf DATO,w
btfsc STATUS,Z
goto no_precio
movf DATO,w
call pasar_a_LCD
movlw 0x24
;ponemos E despues de precio
movwf letra
call escribir_LCD
return
no_precio
;por si no hay precio
bsf err_prod,0
call escribir_ERROR
return
esc_err_prec
;rutina para salir por error en el precio
call retardo_largo
call no_dar
;vamos a o dar el producto e inicializamos
clrf tapreta
;registros
clrf err_prod
clrf decenas
call mens_inicio
return
det_si_cambio
;para ver si hay que dar cambio y si se ha pagado
bcf STATUS,C
;el producto
bcf STATUS,Z
movf DATO,w
subwf pagado,w
btfss STATUS,C
goto sin_dinero
;esto es en el caso de haberse pagado el producto
btfss STATUS,Z
call detect_cambio
return
sin_dinero
;si no se ha pagado producto pasamos el error a err_prod
bsf err_prod,2
return

XVI

Anexo

Programa ASM de prctica 3

no_dar
;funcin donde se procesan los errores y son se da el
call no_pagado
;producto por que a avido algn fallo s inicializan
clrf decenas
;los registros para comenzanzar de nuevo
clrf err_prod
clrf tapreta
movlw 0x10
movwf aux
buck_ret
call retardo_largo
decfsz aux
goto buck_ret
call mens_inicio
nop
return
detect_cambio
;para detectar cambio miramos el interruptor que hay en
btfsc PORTC,5 ;RB5 (0 no prod, 1 si prod) y guardaremos en err_prod si
bsf err_prod,3
;no hay prod.
return
dar_producto
;son las funciones que tiene que hacer para dar producto
call dar_cambio
call entregar_producto
call retardo_largo
return
;------------------------------------------------------------------------entregar_producto ;rutina para dar el producto tendria que ser por
bsf PORTB,5 ; comunicacin pero en esta practica no se hace
call retardo_largo
; comunicacin y solo habr que encender el
call retardo_largo
; LED de RB5 de dar producto
call retardo_largo
bcf PORTB,5
return
det_si_prod
;rutina para preguntar si hay producto tendria que ser por
btfsc PORTB,4
;comunicacion pero como antes solamente miraremos
bsf err_prod,1
;el estado del interruptor que hay en RB4 (0 si
bcf err_prod,1
; prod,1 no prod) y guardaremos en err_prod si hay
return
; fallo

;-------------------------------------------------------------------------;tratamiento de errores en el proceso


no_pagado
call retardo_largo
call RS0
movlw 0x88
;situamos ursor en la posicion 8 de la 1 linea
movwf letra
call escribir_LCD
call RS1
movlw 0x4E
;N
movwf letra
call escribir_LCD
movlw 0x4f
;O
movwf letra
call escribir_LCD

XVII

Anexo

Programa ASM de prctica 3


movlw 0x20
;space
movwf letra
call escribir_LCD
btfsc err_prod,0
goto err_x_precio
btfsc err_prod,1
goto err_x_gastado
btfsc err_prod,3
goto err_x_cambio
call escribir_PG ;escribir PG en el caso de no haber pagado el
;producto

fin_no_pagado
clrf err_prod
call op_a_producto
return
err_x_precio
movlw 0x24
movwf letra
call escribir_LCD
goto fin_no_pagado
err_x_gastado
call escribir_PROD
goto fin_no_pagado

;escribir '$' en el caso de existir precio

;en el caso de que el producto se haya gastado

err_x_cambio
call escribir_CM
;error xq no hay cambio.
goto fin_no_pagado
;-------------------------------------------------------------------------dar_cambio ;esta rutina nos da las monedas a devovler solo hay que pasarle
nop
;por el W la cantidad de dinero a devovler se hara en otra
return ; practica.
;-------------------------------------------------------------------------elegir_prod
movlw 0x3
;revisamos si tenemos q poner las unidades o las decenas
andwf lim_tec,w
;si no es el caso solo se puede apretar la tecla
btfsc STATUS,Z
; aceptar o cancelar
goto correcto?
movf rmoneda,w
;miramos si no es la tecla acpetar o cancelar
btfss rmoneda,3
;si no lo es revisamos la tecla del numero
goto revisar_tecla
andlw 0x6
;miramos si es la tecla 9
btfsc STATUS,Z
goto revisar_tecla
movf rmoneda,w
btfsc rmoneda,2
return
btfsc rmoneda,0
goto correcto?
;en el caso que sea la tecla aceptar o cancelar
return
revisar_tecla
btfsc lim_tec,1
goto enviar_decena

XVIII

Anexo

Programa ASM de prctica 3

call RS0
movlw 0xc6
;ponemos cursor en espacio 6 de la 2 linea del
display
movwf letra
call escribir_LCD
call RS1
movf rmoneda,w
;escribimos el valor de las unidad del producto a
addlw 0x30
; elegir
movwf letra
call escribir_LCD
call RS0
movlw 0xca
;ponemos el cursor en el espacio 10 de la 2 linea
movwf letra
call escribir_LCD
call RS1
movf decenas,w
addwf rmoneda,w
;aqui guardamos la direcion del producto
movwf DIREC
call EE_LEE
call comprobar_precio
;revisamos precio y o escribimos
clrf tapreta
clrf lim_tec
return
enviar_decena
call RS0
;ponemos el display en 2 linea
movlw 0xC0
movwf letra
call escribir_LCD
call RS1
call escribir_PROD
movlw 0x20
;espacio en blanco
movwf letra
call escribir_LCD
movf rmoneda,w
;escibimos la decena del dislay
movwf num_prod
addlw 0x30
movwf letra
call escribir_LCD
buc_decenas
;bucle para calcular las decenas
movlw 0
addwf rmoneda
btfsc STATUS,Z
;revisamos si es la tecla 0
goto escribe_0
movlw 0x10
;sumamos 10 para convertir a decenas
addwf decenas
movlw 0x1
subwf rmoneda
btfss STATUS,Z
goto buc_decenas
subwf lim_tec
clrf tapreta
return

XIX

Anexo

Programa ASM de prctica 3

escribe_0
clrf tapreta ;ponemos a 0 el registro tecla apretada para sig. tecla
movlw 1
subwf lim_tec ;quitamos 1 al limite de tecla para saber q la
return
; siguiente es las unidades
correcto?
;para saber si se aprieta la tecla de cacelar o aceptar
btfss rmoneda,3
goto fin_correcto?
btfss rmoneda,0
goto aceptado
goto cancelado
aceptado
bsf prod_elegido,0 ;ponemos a 1 el registro de prod_elelgido para
goto fin_correcto? ;que al salir de seleccionar producto sepa que ya
;ha sido seleccionado
cancelado
clrf decenas
;si es tecla cancelar se inician registros y LCD
call op_a_producto ;y se comienza de nuevo
call mens_inicio
goto fin_correcto?
fin_correcto?
clrf tapreta ;aqu solamente ponemos a 0 el registro que nos dice
return
;si hay una tecla apretada.
;-------------------------------------------------------------------------op_a_producto
;esto es para iniciar registros
movlw 0x2
movwf lim_tec
clrf err_prod
clrf prod_elegido
clrf tapreta
return
iniciar_regs
;otra funcion para iniciar regisros
clrf num_prod
clrf decenas
clrf tapreta
return
;-------------------------------------------------------------------------mens_inicio
;para escribir mensaje de inicio solamente
movlw 0x1
;limpiaremos ala panatalla de LCD
movwf letra
call clear_display
return
escribir_PG
movlw 0x50
;letra P
movwf letra
call escribir_LCD
movlw 0x47
;letra G
movwf letra
call escribir_LCD
return

XX

Anexo

Programa ASM de prctica 3

escribir_PROD
movlw 0x50
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x44
movwf letra
call escribir_LCD
return

;letra P

;letra R

;letra O

;letra D

escribir_CM
movlw 0x43
;letra C
movwf letra
call escribir_LCD
movlw 0x4d
;letra M
movwf letra
call escribir_LCD
return
escribir_NUE
movlw 0x4e
;letra N
movwf letra
call escribir_LCD
movlw 0x55
;letra U
movwf letra
call escribir_LCD
movlw 0x45
;letra E
movwf letra
call escribir_LCD
return
escribir_ERROR
movlw 0x45
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD

;letra E

;letra R

;letra R

;letra O

;letra R

clear_display

;funcin para las instruciones de 1,53ms de la pantalla de


;LCD
banksel TRISB

XXI

Anexo

t0

Programa ASM de prctica 3


movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return

escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0
t1
btfsc TMR0,7
goto t1
return
E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,4
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,4
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,3
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,3
return

limpiar_LCD
call RS0
movlw 0x02

;funcin para dejar la pantalla sin nada


;aqui hariamos un RETURN HOME

XXII

Anexo

Programa ASM de prctica 3


movwf letra
call clear_display
movlw 0x01 ;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return

;-------------------------------------------------------------------------;funciones de la EEPROM
EE_ESCRIBE
;con esta escvribimos un valor pasado por el W
movf DATO,w
;en la Direccion psada por el registro DIREC
banksel EEDATA
movwf EEDATA
banksel 0
movf DIREC,w
banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
bcf EECON1,WREN
EE_WAIT btfsc EECON1,WR
goto EE_WAIT
banksel DATO
return
EE_LEE
;leemos el valor de la EEPROM que este en el
Registro
movf DIREC,w
;DIREC que le hemos pasado
banksel EEDATA
movwf EEADR
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movf EEDATA,w
banksel DATO
movwf DATO
;devolvemos el valor leido por el registro DATO
return
;-------------------------------------------------------------------------retardo
;funciones varias de retardos para diferntes pausas
movlw 0xFF
movwf pausa
retm
decfsz pausa
goto retm
return
retardo_largo
movlw 0xFF
movwf pausa2
retm1 movlw 0xFF

XXIII

Anexo

Programa ASM de prctica 3


movwf pausa

retm2
banksel TRISB
banksel PORTB
decfsz pausa
goto retm2
decfsz pausa2
goto retm1
return
end

XXIV

Anexo

Programa ASM de prctica 4

A.1.3. Programa ASM de prctica 4


include "p16f877.inc"
;registros de proposito general
rmoneda
tapreta
rprecio
r1
r2
mas_fil
modetect
pagado
digito
ret
letra
letraux
lauxil
pausa
cambio
maux
pausa2
aux
aux2

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

0x40
0x41
0x42
0x50
0x51
0x52
0x54
0x59
0x5b
0x60
0x61
0x5a
0x62
0x63
0x34
0x35
0x38
0x39
0x3a

;valor de la tecla apretada


;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;moneda a enviar
;reg. para guardar el dinero que e va introduciendo
;reg aux para el digito a pasar al LCD
;para hacer el retardo
;reg para escribir en LCD
;reg aux para escr precios en LCD
;reg auxiliar para escribir moneda
;reg auxiliar para hacer pausa al dar moneda
;el cambio a dar
;para encender los bits de la moneda a dar.
;otro reg para pausa
;reg auxiliar
;reg auxiliar2

;Rutina principal
org 0x00
Inicio
call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD
call conf_tec
;vamos a rutina para dar vlaores a las teclas
call conf_mic
;vamos a rutina para configurar el micro
buckle
nop
call ver_moneda
;miramos el teclado
btfsc tapreta,0
call leer_dinero ;va al aparatado de elegir producto
goto buckle

;rutina para iniciar el


iniciar_LCD
banksel TRISA
movlw 0xF0
movwf TRISC
movlw 0x07
movwf TRISB
movlw 0x18
movwf TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
clrf PORTA
call RS0
call E1

LCD

;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX


;RB<0:2> entradas RC<3:7> salidas
;RA<0:2> SALIDAS RA <3:4> entradas
;ponemos el pre-escaler a 1:16

;ponemos la instruccin FUCTION SET

XXV

Anexo

Programa ASM de prctica 4


movlw 0x02
movwf PORTC
call E0
call retardo
movlw 0x2F
movwf letra
call escribir_LCD
call retardo
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo
call RS1
return
;fin de la inicializacin del LCD

;asignamos cada valor del teclado a un registro


conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xc
;tecla f
movwf 0x23
movlw 4
;tecla 4
movwf 0x24
movlw 5
;tecla 5
movwf 0x25
movlw 6
;tecla 6
movwf 0x26
movlw 0xd
;tecla e
movwf 0x27
movlw 7
;tecla 7
movwf 0x28
movlw 8
;tecla 8
movwf 0x29
movlw 9
;tecla 9
movwf 0x2a
movlw 0xe
;tecla d
movwf 0x2b
movlw 0xa
;tecla a
movwf 0x2c
movlw 0
;tecla 0
movwf 0x2d
movlw 0xb
;tecla b
movwf 0x2e
movlw 0xf
;tecla c

XXVI

Anexo

Programa ASM de prctica 4


movwf 0x2f
return

;Configuracion del micro


conf_mic
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x7
movwf ADCON1
;salidas digitales
movlw 0x87
movwf OPTION_REG ;preescaler a 256
banksel PORTC
; banco 0
clrf r1
clrf r2
clrf tapreta
;inicializa el valor del registro de valor de tecla
banksel PORTB
;volvemos al primer banco
call mens_inicio
return
;vamos dando un '1' a las columnas para ir comprobando si la tecla esta
;apretada
ver_moneda
movlw 0x1
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q estamos en la columna 1
call rev_fila ;vamos a mirar las filas una por una
movlw 0x2
movwf PORTC
movlw 0x04
movwf r1
call rev_fila

;guardamos 1 en r1 para saber q estamos en la columna 2


;volvemos a mirar filas

movlw 0x4
movwf PORTC
movlw 0x08
movwf r1
call rev_fila

;guardamos 1 en r1 para saber q estamos en la columna 2


;volvemos a mirar filas

movlw 0x8
movwf PORTC
movlw D'12'
movwf r1
call rev_fila
return

;guardamos 1 en r1 para saber q estamos en la columna 2


;volvemos a mirar filas
;volvemos al prinicipio

rev_fila
btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTB,0

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return

XXVII

Anexo

Programa ASM de prctica 4

movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTB,1

;ponemos el valor 4 para saber q es la fila 2

;volvemos a guardar mascara


;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x02
;guardamos el valor 8 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTB,2
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
;en esta rutina hacemos un pequeo retardo para los rebotes
ret_tcl_producto
movlw 0x0F
movwf ret
;actualizamos el registro para el retardo
buck_re decfsz ret,f
goto buck_re
movf PORTB,w
andwf mas_fil,w

btfsc STATUS,Z
return

;se va decrementando ret hasta q volvemos a


;comprobar el PORTB

;hacemos una and entre la mascara guardada y W


;si el resultado es diferente de 0 es q la tecla
;esta pulsada
;para mirarlo si el flag Z del STATUS esta a 0 es q
; la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada


most_num
clrw
addwf r1,w
;sumamos r1 y r2 para despues saber el valor de
addwf r2,w
;la tecla apretada
addlw 0x20
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rmoneda
;guardamos el resultado de la tecla
bsf tapreta,0
;ponemos a '1' tapreta para saber que hay tecla
;apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec
movf PORTB,w
andwf mas_fil,w
btfss STATUS,Z
goto sol_tec
return

;volvemos a utilizar la mascara para saber si la


; tecla sigue apretada hasta q el flag Z no este
; acticado no saldra del buckle

XXVIII

Anexo

Programa ASM de prctica 4

;-------------------------------------------------------------------------leer_dinero
;como hemos dicho en el enunciado de la prctica damos
nop
;libertad de que el alumno escoga la forma de procesar las
movf rmoneda,w ;teclas para elegir el producto solo tiene que tener en
clrf tapreta
;cuenta que si la tecla es 'aceptar' tiene
xorlw 0xa
;que dar el cambio de lo que se ha insertado.
btfsc STATUS,Z
goto dar_cambio
return
;-------------------------------------------------------------pasar_a_LCD
movwf letraux
clrf digito
b_millares
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
addwf letraux

;este es solo en caso q sea + de 10 euros

millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C
goto centenas
movlw 1
addwf digito
goto b_centenas

;calculo las centenas de lo que he metido

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito

XXIX

Anexo

Programa ASM de prctica 4

b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;-------------------------------------------------------------------------dar_cambio
movf pagado,w
;aqui hemos supuesto que el registro donde se
;guardar la cantida dinero ser 'pagado' con lo
;cual pasamos esa cantidad al W y la funcion
;dev_dinero hace el resto
;--------------------------------------------------------------------dev_dinero ;esta rutina nos da las monedas a devovler por RA solo hay que
movwf cambio
; pasarle por el W la cantidad de dinero a devolver.
call retardo_largo
call RS0
movlw 0x89
;ponemos el cursor en el espacio 9 de la 1 linea
movwf letra
call escribir_LCD
call RS1
call escribir_CM ;escribimos CM antes de la cantidad
movf cambio,w
call pasar_a_LCD ;esribimos la cantidad a devolver
call retardo_largo
movf cambio,w
btfsc STATUS,Z
return
movwf letraux
bcf STATUS,C
euro1
movlw B'000101'
;ponemos codigo a pasar al decodificador este codigo
movwf maux
;es le de 1 euro
movlw D'20'
;revisamos que la cantidad supere 20
subwf letraux,f
btfss STATUS,C
goto cent50
;si no lo supera vamos a revisar la moneda de 50 cent.
call dar_moneda ;si lo supera vamos a dar la moneda y volvemos a mirar

XXX

Anexo

Programa ASM de prctica 4


goto euro1

;si sigue superando 20 para dar otra moneda.

cent50
bcf STATUS,C ;como en la anterior se pne el cdigo moneda de 50 cent.
movlw B'000100'
movwf maux
;se suma 20 que es lo restado antes para quedarnos con
movlw D'20'
;el cambio que tenemos realmente
addwf letraux,f
buc50
movlw D'10'
;y empoezamos como antes a restar 10 hasta que nos salga
subwf letraux,f ;negativo que pasara a revisar la moneda de 20 cent.
btfss STATUS,C
goto cent20
call dar_moneda
goto buc50
cent20
bcf STATUS,C
movlw B'000011'
movwf maux
movlw D'10'
addwf letraux,f
buc20
movlw D'4'
subwf letraux,f
btfss STATUS,C
goto cent10
call dar_moneda
goto buc20
cent10
bcf STATUS,C
movlw B'000010'
movwf maux
movlw D'4'
addwf letraux,f
buc10
movlw D'2'
subwf letraux,f
btfss STATUS,C
goto cent5
call dar_moneda
goto buc10
cent5
bcf STATUS,C
movlw B'000001'
movwf maux
movlw '2'
addwf letraux,f
btfsc letraux,0
call dar_moneda

;pasamos el cdigo de la moneda de 20 cent. Y


; sumamos 10 para tener el cambio real a dar.

;restamos 4 hasta que no nos salga negativo que


;pasaria a revisar la moneda de 10 cent.

;pasamos el cdigo de la moneda de 10 cent.


;y sumamos 4 para volver al valor real

;restamos 2 hasta que quede negativo y pasariamos a


;la moneda de 5 cent.

;pasamos el cdigo de la moneda de 5 cent. y sumamos


;2 al valor que teniamos

;si el valor que tenemos del cambio es 0 no damos


;moneda si es 1 tedremos que dar una moneda de 5
;cent.

return
dar_moneda
movf maux,w
movwf PORTA

;esta funcin si detecta las anteriores que hay que


;dar una moneda le pasan por maux el vlor de la
;moneda a dar y pasa el valor al decodificador para

XXXI

Anexo

Programa ASM de prctica 4


banksel TRISA
;que se encienda el LED correspndiente
movlw 0x87
movwf OPTION_REG
banksel PORTA
call retardo_largo
;aqu hacemos pausas para ver el LED encendido
call retardo_largo
movlw B'111000'
;volvemos a dejar el decodificador para que no
andwf PORTA
;encienda ningun LED
call retardo_largo
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return

;-------------------------------------------------------------------------mens_inicio
movlw 0x1
movwf letra
call clear_display
return
escribir_PG
movlw 0x50
;letra P
movwf letra
call escribir_LCD
movlw 0x47
;letra G
movwf letra
call escribir_LCD
return
escribir_CM
movlw 0x43
;letra C
movwf letra
call escribir_LCD
movlw 0x4d
;letra M
movwf letra
call escribir_LCD
return

clear_display

;funcin para las instruciones de 1,53ms de la pantalla de


;LCD
banksel TRISB
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0

XXXII

Anexo
t0

Programa ASM de prctica 4


btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return

escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0
t1
btfsc TMR0,7
goto t1
return
E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,4
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,4
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,3
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,3
return

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01 ;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return
;-------------------------------------------------------------------------retardo
;funciones para las diferentes pausas durante el programa
movlw 0xFF
movwf pausa
retm
decfsz pausa

XXXIII

Anexo

Programa ASM de prctica 4


goto retm
return

retardo_largo
movlw 0xFF
movwf pausa2
ret_l1
movlw 0xFF
movwf pausa
ret_l2
banksel TRISB
banksel PORTB
decfsz pausa
goto ret_l2
decfsz pausa2
goto ret_l1
return
end

XXXIV

Anexo

Programa ASM de prctica 6

A.1.4. Programa ASM de prctica 6


include "p16f877.inc"
;etiquetas
ACEPTAR
equ 0x4F
;por si cancelas algun paso
CANCELAR
equ 0x0F
;para aceptar el precio.
INICIO
equ 0xFF
;para iniciar envio
FIN
equ 0x66
;para acabar envio
EDATO
equ 0xAA
;para decir que envio dato
EDIREC
equ 0x55
;para decir que envio direccion
CANC_PRO
equ 0x0F
;para cancelar pedir producto
;registros de proposito general
rmoneda
tapreta
rprecio
r1
r2
mas_fil
lim_tec

equ 0x40
equ 0x41
equ 0x42
equ 0x50
equ 0x51
equ 0x52
equ 0x55

;valor de la tecla apretada


;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;reg para saber q tiene q detectar 2 teclas en
;producto
ret
equ 0x60
;para hacer el retardo
letra
equ 0x61
;reg para escribir en LCD
letraux
equ 0x5a
;reg aux para escr precios en LCD
lauxil
equ 0x62
;reg auxiliar para escribir moneda
pausa
equ 0x63
;reg auxiliar para hacer pausa al dar moneda
DATO
equ 0x30
;dato de eprom
DIREC
equ 0x31
;direcion eprom
err_prod
equ 0x32
;si el producto no existe o hay cambio
prod_elegido equ 0x36
;para saber si se ha elegido el producto
T_escrita
equ 0x37
;decenas del producto seleccionado
dato_recibido equ 0x3b ;para saber si se ha recibido el dato por RX.
pausa2
equ 0x38
;otro reg para pausa
aux
equ 0x39
;reg auxiliar
aux2
equ 0x3a
;reg auxiliar2
producto
equ 0x3c
;donde guardamos el numero del producto
modo_precio equ 0x3d
;para saber si estamos en modo cambio de precio
aux_int
equ 0x3e
;reg auxiliar para interrupcion
esp_DATO
equ 0x5c
;reg para esperar Dato
esp_DIREC
equ 0x5d
;reg para esperar Direccion
;Rutina principal
org 0x0
clrf INTCON
goto inicio
org 0x4
goto INTERRUPT
org 0x5
Inicio
call iniciar_LCD
call conf_tec
call conf_mic

;deshabilitamos interrupciones para iniciar micro

;cuando se produzca una interrupcin vendr aqui


;comienza el programa aqui
;vamos a rutina para iniciar la pantalla LCD
;vamos a rutina para dar vlaores a las teclas
;vamos a rutina para configurar el micro

XXXV

Anexo
buckle
nop
call ver_moneda
btfsc tapreta,0
call pedir_prod
goto buckle

Programa ASM de prctica 6

;revisa tecla apretada


;va al aparatado de elegir producto

;rutina para iniciar el LCD


iniciar_LCD
banksel TRISA
movlw 0xF0
movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0x07
movwf TRISB ;RB<0:2> entradas RC<3:7> salidas
movlw 0x18
movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas
movlw 0x83
;1:16
movwf OPTION_REG
banksel PORTA
clrf PORTA
;ponemos la instruccin FUCTION SET
call RS0
call E1
movlw 0x02
movwf PORTC
call E0
call retardo
movlw 0x2F
movwf letra
call escribir_LCD
call retardo
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo
call RS1
return
;fin de la inicializacin del LCD
;asignamos cada valor del teclado a un registro
conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xc
;tecla f
movwf 0x23

XXXVI

Anexo

Programa ASM de prctica 6


movlw 4
movwf 0x24
movlw 5
movwf 0x25
movlw 6
movwf 0x26
movlw 0xd
movwf 0x27
movlw 7
movwf 0x28
movlw 8
movwf 0x29
movlw 9
movwf 0x2a
movlw 0xe
movwf 0x2b
movlw 0xa
movwf 0x2c
movlw 0
movwf 0x2d
movlw 0xb
movwf 0x2e
movlw 0xf
movwf 0x2f
return

;tecla 4
;tecla 5
;tecla 6
;tecla e
;tecla 7
;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c

;Configuracion del micro


conf_mic
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x7
movwf ADCON1
;salidas digitales
movlw 0x87
movwf OPTION_REG ;preescaler a 256
bsf PIE1,RCIE
;interupccion RX habilitada
bcf PIE1,TXIE
;interupccion TX deshabilitada
movlw 0x24
movwf TXSTA
;TX tx9=1 txen=1 brgh=1
movlw D'27'
;SPBRG=27 que es donde tiene menos error
movwf SPBRG
banksel PORTC
; banco 0
movlw 0x90
movwf RCSTA
;RC spen=1 rx9=1 CREN=1
movlw 0xc0
iorwf INTCON,F
;acitvamos interrupciones
clrf r1
clrf r2
clrf tapreta
;inicializa el valor del registro de valor de tecla
clrf rmoneda
;inicializa el valor del reg de detecion de tecla
;apretada
clrf rprecio
;inicializamos el valor del registro de precio
clrf T_escrita
clrf modo_precio
clrf dato_recibido ;inicializa el reg. De dato recibido
clrf prod_elegido
bsf lim_tec,1
movlw 1
movwf esp_DIREC

XXXVII

Anexo

Programa ASM de prctica 6


movwf esp_DATO
banksel EECON1
;esto es para configurar la EEPROM
bcf EECON1,EEPGD ;ponemos en modo ecritura de datos
banksel PORTB
;volvemos al primer banco
call mens_inicio
return

;vamos dando un '1' a las columnas para ir comprobando si la tecla esta


;apretada
ver_moneda
movlw 0x1
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q estamos en la columna 1
call rev_fila ;vamos a mirar las filas una por una
movlw 0x2
movwf PORTC
movlw 0x04
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
movlw 0x4
movwf PORTC
movlw 0x08
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
movlw 0x8
movwf PORTC
movlw D'12'
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
return
;volvemos al prinicipio
rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTB,0

;si hay tecla apretada salta para ir mas rapido

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTB,1

;ponemos el valor 4 para saber q es la fila 2

;volvemos a guardar mascara


;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return

XXXVIII

Anexo

Programa ASM de prctica 6


movlw 0x02
;guardamos el valor 8 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTB,2
call ret_tcl_producto
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return

;en esta rutina hacemos un pequeo retardo para los rebotes


ret_tcl_producto
movlw 0x0F
movwf ret
;actualizamos el registro para el retardo
buck_re
decfsz ret,f
goto buck_re
movf PORTB,w
andwf mas_fil,w

btfsc STATUS,Z
return

;se va decrementando ret hasta q volvemos a


;comprobar el PORTB
;hacemos una and entre la mascara guardada y W
;si el resultado es diferente de 0 es q la tecla
;esta pulsada
;para mirarlo si el flag Z del STATUS esta a 0 es q
;la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada


most_num
clrw
addwf r1,w
;sumamos r1 y r2 para despues saber el valor de
addwf r2,w
;la tecla apretada
addlw 0x20
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rmoneda
;guardamos el resultado de la tecla
bsf tapreta,0
;poenmos a '1' el bit 0 de tapreta para saber que
;hay 1 tecla apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec movf PORTB,w
andwf mas_fil,w
;volvemos a utilizar la mascara para saber si la
btfss STATUS,Z
; tecla sigue apretada hasta q el flag Z no este a 1
goto sol_tec
; no saldra del buckle
return
;-------------------------------------------------------------------------;rutina para elegir producto
pedir_prod
call elegir_prod
;vamos a elegir el producto y cuando volvemos
btfss prod_elegido,0
;si se a terminado de elegir continuamos si no
return
;esperamos otra tecla
rev_prod
call det_si_prod
btfsc err_prod,1
goto no_dar
call retardo_largo
call dar_producto

;miramos si se hay producto


;si hay error se cancela proceso
;si todo va bien hacemos pausas y damos el
;producto

XXXIX

Anexo

Programa ASM de prctica 6


call retardo_largo
call retardo_largo
call retardo_largo
call mens_inicio
movlw 0x1
subwf lim_tec
clrf dato_recibido
return

;volvemos a poner el mensaje de inicio

no_dar
;si no hay producto iniciamos registros y pantalla
clrf rmoneda
;LCD y esperamos nueva seleccin de producto
call mens_inicio
call ini_reg
return
dar_producto
;si hay el producto entregamos el procuto
call entregar_producto ;y espera nueva seleccin de producto
call retardo_largo
call ini_reg
return
ini_reg
clrf lim_tec
bsf lim_tec,1
clrf T_escrita
clrf tapreta
return

;para iniciar los registros para una nueva seleccin

;-------------------------------------------------------------------------elegir_prod
movlw 0x3
;revisamos si tenemos q poner las unidades o las decenas
andwf lim_tec,w
;si no es el caso solo se puede apretar la tecla
btfsc STATUS,Z
;aceptar o cancelar
goto correcto?
movf rmoneda,w
;miramos si no es la tecla acpetar o cancelar
btfss rmoneda,3
;si no lo es revisamos la tecla del numero
goto revisar_tecla
andlw 0x6
;miramos si es la tecla 9
btfsc STATUS,Z
goto revisar_tecla
movf rmoneda,w
btfsc rmoneda,2
return
btfsc rmoneda,0
goto correcto?
return
revisar_tecla
;aqui revisamos la tecla si la tecla es un numero
btfsc lim_tec,1
;miramos si ya se ha seleccionado la decena
goto enviar_decena
;del producto si no va a hacerlo
call RS0
movlw 0x01 ;poemos cursor en espacio 2 de la 1 linea del display
movwf letra
call escribir_LCD
call RS1
movf rmoneda,w
;escribimos el valor de las unidad del producto
addlw 0x30

XL

Anexo

Programa ASM de prctica 6


movwf letra
call escribir_LCD
call RS0
movlw 0xc9 ;ponemos el cursor en el espacio 9 de la 2 linea
movwf letra
call escribir_LCD
call RS1
movf T_escrita,w
addwf rmoneda,w
;aqui guardamos la direcion del producto
movwf DIREC
call EE_LEE
;buscamos precio del producto
clrf tapreta
clrf lim_tec
return

enviar_decena
call RS0
;ponemos el display en 1 linea
movlw 0x00
movwf letra
call escribir_LCD
call RS1
movf rmoneda,w
;escibimos la decena del dislay
addlw 0x30
movwf letra
call escribir_LCD
buc_decenas
;bucle para calcular las decenas
movlw 0
addwf rmoneda
btfsc STATUS,Z
;revisamos si es la tecla 0
goto escribe_0
movlw 0x10
;sumamos 10 para convertir a decenas
addwf T_escrita
movlw 0x1
subwf rmoneda
btfss STATUS,Z
goto buc_decenas
subwf lim_tec
clrf tapreta
return
escribe_0
clrf tapreta
movlw 1
subwf lim_tec
return

;pone a 0 el reg. tecla apretada para sig. tecla


;quitamos 1 al limite de tecla para saber q la
; siguiente es las unidades

correcto?
;para saber si se aprieta la tecla de cacelar o aceptar
btfss rmoneda,3
;revisa si es tecla aceptar o cancelar de lo
goto fin_correcto? ;si no lo es pasa de la tecla apretada
btfss rmoneda,0
goto aceptado
goto cancelado
aceptado
bsf prod_elegido,0
goto fin_correcto?

;activa el registro de prodcuto elelgido


;para que continue el proceso al salir de

XLI

Anexo

Programa ASM de prctica 6


;de elegir producto

cancelado
clrf
call
call
goto

T_escrita
mens_inicio
ini_reg
fin_correcto?

fin_correcto?
clrf tapreta
return

;inicializa registros para empezar nueva


;seleccion

;limpiamos registro de tecla apretada para poder


;apretar una nueva tecla

;------------------------------------------------------------------------;Comunicacin RS232 para comprobrar producto y dar producto.


entregar_producto
;rutina para dar el producto
movf DIREC,w
addlw 0x80
;ponemos el codigo para queel otro micro sepa que
;queremos pedir que entrege el producto
movwf TXREG
;enviamos direccion del producto seleccionado
call esp_envio
;espermaos confirmacin
clrf dato_recibido
return
esp_envio
banksel TXSTA
espenv
btfss TXSTA,TRMT
goto espenv
banksel 0
return

;para ver si se ha enviado el dato

;una vez que se desactive TRMT es que se ha enviado


;la direccion

det_si_prod
;rutina para preguntar si hay producto
clrf dato_recibido
movf DIREC,w
movwf TXREG
;enviamos dato
call esp_envio
;esperamos a que se haya enviado el dato
espRX2
;esperamos recibir confirmacion del otro
btfss dato_recibido,0
;micro para saber si hay o no producto
goto espRX2
clrf dato_recibido
return

;-------------------------------------------------------------------------mens_inicio
movlw 0x1
movwf letra
call clear_display
return
escribir_ERROR
movlw 0x45
;letra E
movwf letra
call escribir_LCD
movlw 0x52
;letra R
movwf letra
call escribir_LCD
movlw 0x52
;letra R

XLII

Anexo

Programa ASM de prctica 6


movwf letra
call escribir_LCD
movlw 0x4f
;letra O
movwf letra
call escribir_LCD
movlw 0x52
;letra R
movwf letra
call escribir_LCD

clear_display

t0

;funcin para las instruciones de 1,53ms de la pantalla de


;LCD
banksel TRISB
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return

escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0
t1
btfsc TMR0,7
goto t1
return
E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,4
return

E1

;funcin para poner la entrada E del LCD a '1'

XLIII

Anexo

Programa ASM de prctica 6


bsf PORTB,4
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,3
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,3
return

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01 ;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return
;-------------------------------------------------------------------------;funciones de la EEPROM
EE_ESCRIBE
;con esta escvribimos un valor pasado por el W
movf DATO,w
;en la Direccion psada por el registro DIREC
banksel EEDATA
movwf EEDATA
banksel 0
movf DIREC,w
banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
bcf EECON1,WREN
EE_WAIT btfsc EECON1,WR
goto EE_WAIT
banksel DATO
return
EE_LEE
Registro
movf DIREC,w
banksel EEDATA
movwf EEADR
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movf EEDATA,w
banksel DATO
movwf DATO
return

;leemos el valor de la EEPROM que este en el


;DIREC que le hemos pasado

;devolvemos el valor leido por el registro DATO

XLIV

Anexo

Programa ASM de prctica 6

;-------------------------------------------------------------------------INTERRUPT
;rutina de interrupcion para recibir datos
banksel 0x0
nop
L1
btfss PIR1,RCIF
;miramos si la interupcion es por recepcion
goto L2
btfss RCSTA,2
;si lo es miramos queno haya error de framing
goto ER1
bsf err_prod,1
;si lo hay leemos RCREG par quitar error activamos
movf RCREG,F
;el registro de error
movlw CANCELAR
;y enviamos CANCELAR al otro micro
movwf TXREG
goto L1
ER1

btfss RCSTA,1
;miramos si ha y errror de overfow
goto revisar_enviado
bsf err_prod,1
;si lo hay ponemos a 0 CREN y despues a 1 para
bcf RCSTA,4
;quitar el error
bsf RCSTA,4
bsf dato_recibido,0
goto L1

revisar_enviado
;aqu llemos el datorecibido y lo pasamos a regisro
movf RCREG,w
;auxiliar
movwf aux_int
btfss modo_precio,0
;si no estamos en modo precio vamos es q
goto rec_conf_producto ;recibimos confirmacion de producto o inicio
btfsc esp_DIREC,0
;de cambio de EEPROM
goto pet_DIREC
;si estamos en modo precio es que esperamos
btfsc esp_DIREC,1
;alguno de los aparados para cambiar el precio
goto rec_DIREC
;de la EEPROM y mira haber cual espera para ir
btfsc esp_DATO,0
;alli
goto pet_DATO
goto rec_DATO
rec_conf_producto
;aqui miramos si
movf aux_int,w
;o que se inicia
xorlw INICIO
btfss STATUS,Z
goto int_ped_prod
goto ini_int_EEPROM
;-----------------------------int_ped_prod
;confirmacin de
movf aux_int,w
xorlw ACEPTAR
btfsc STATUS,Z
goto correcto
FALLO
;si no hay
bsf err_prod,1
bsf dato_recibido,0
goto L1
correcto
;si lo hay
clrf err_prod
bsf dato_recibido,0
goto L1

XLV

es la confirmacion de producto
el cambio de la EEPROM

pedir producto

proucto hace esto

hace esto otro

Anexo

Programa ASM de prctica 6

;------------------------------pet_DIREC
;funcion que espera la peticion de direcion
movf aux_int,w
;comprueba que sea la peticion de direccion
xorlw EDIREC
;si lo es envia codigo de aceptar si no lo
btfss STATUS,Z
;es va a revisar si es el fin del ambio de la
goto fin_cambio_EEPROM ; EEPROM
movlw 2
;se pone a esperar la direccion
movwf esp_DIREC
movlw ACEPTAR
movwf TXREG
call esp_envio
;espera a que el dato haya sido enviado
goto L1

rec_DIREC
movf aux_int,w
xorlw 0xC0
btfsc STATUS,Z
goto fallo_tx
movf aux_int,w
movwf DIREC
clrf esp_DIREC
bsf esp_DATO,0
movlw ACEPTAR
movwf TXREG
call esp_envio
goto L1

pet_DATO
movf aux_int,w
xorlw EDATO
btfss STATUS,Z
goto fallo_tx
movlw 2
movwf esp_DATO
movlw ACEPTAR
movwf TXREG
call esp_envio
goto L1
rec_DATO
movf aux_int,w
movwf DATO
bsf esp_DIREC,0
clrf esp_DATO
call EE_ESCRIBE
movlw ACEPTAR
movwf TXREG
call esp_envio
goto L1
fallo_tx
movlw CANCELAR
movwf TXREG
call esp_envio

;funcion que espera la direcion


;comprueva que pueda ser direccion si no
;va a fallo de transmision

;si lo es guarda la direcion y se queda a


;esperar peticion de dato y envia el codigo
;de aceptar

;espera a que el dato haya sido enviado

;espera la peticion de dato compruevaque lo


;recibido es petidion de dato si no lo es va
;a fallo de transmisin
;si lo es se pone a esperar dato y se queda
;a esperar el dato y envia codigo aceptar

;espera a que el dato haya sido enviado

;Aqu recibe el dato n comprueba que este bien


;porque no se puede lo que hace es con el dato
;recibido y la direccion recibida cambia el
;dato de la direccion de la EEPROM y se queda
;a la espera de una nueva peticion de
;direccion y envia el codigo de aceptar

;espera a que el dato haya sido enviado

;ene l caso de fallo de transmision


;manda el codigo de cancelar
;espera a que el dato haya sido enviado

XLVI

Anexo

Programa ASM de prctica 6


goto L1

ini_int_EEPROM
;en el caso de haber recibido inicio de transmision
movlw 0xF
;ponemos a '1' todos los errores para q salga de las
movwf err_prod
;rutinas x si esta en medio de pedir producto
clrf tapreta
;eliminamos si habia una tecla apretada
bsf modo_precio,0
;esto es para saber que estamos en modo
;cambiar precio
movlw ACEPTAR
;enviamos como respuesta 'F0'
movwf TXREG
call esp_envio
goto L1
fin_cambio_EEPROM
clrf modo_precio ;ponemos a 0 para saber que ya no se esta
clrf esp_DIREC
;cambiando la EEPROM e inicia todos los
clrf esp_DATO
;los registros para continuar el proceso
bsf esp_DIREC,0
bsf esp_DATO,0
clrf err_prod
goto L1
L2
retfie
;-------------------------------------------------------------------------retardo
;funciones de diferentes retardos que se utilizan
movlw 0xFF ;durante la ejecucion del programa
movwf pausa
retm
decfsz pausa
goto retm
return
retardo_largo
movlw 0xFF
movwf pausa2
ret_l1
movlw 0xFF
movwf pausa
ret_l2
banksel TRISB
banksel PORTB
decfsz pausa
goto ret_l2
decfsz pausa2
goto ret_l1
return
end

XLVII

Anexo

Programa ASM de Mdulo 1 completo

A.1.5. Programa ASM del Mdulo 1 completo


include "p16f877.inc"
;etiquetas
ACEPTAR
equ 0xF0
;por si cancelas algun paso
CANCELAR
equ 0xFF
;para aceptar el precio.
INICIO
equ 0xFF
;para iniciar envio
FIN
equ 0x66
;para acabar envio
EDATO
equ 0xAA
;para decir que envio dato
EDIREC
equ 0x55
;para decir que envio direccion
CANC_PRO
equ 0x0F
;para cancelar pedir producto
;registros de proposito general
rmoneda
tapreta
rprecio
r1
r2
mas_fil
modetect
lim_tec

equ
equ
equ
equ
equ
equ
equ
equ

0x40
0x41
0x42
0x50
0x51
0x52
0x54
0x55

;valor de la tecla apretada


;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;moneda a enviar
;registro para saber q tiene q detectar 2 teclas en
;producto
num_prod
equ 0x56
;registro del numero del producto
rmonaux
equ 0x58
;reg para calcular las decenas en precio
pagado
equ 0x59
;reg de la cantidad pagada
digito
equ 0x5b
;reg aux para el digito a pasar al LCD
ret
equ 0x60
;para hacer el retardo
letra
equ 0x61
;reg para escribir en LCD
letraux
equ 0x5a
;reg aux para escr precios en LCD
lauxil
equ 0x62
;reg auxiliar para escribir moneda
pausa
equ 0x63
;reg auxiliar para hacer pausa al dar moneda
DATO
equ 0x30
;dato de eprom
DIREC
equ 0x31
;direcion eprom
err_prod
equ 0x32
;si el producto existe o hay cambio
contador
equ 0x33
;contador para escribir '#' si no hay precio
cambio
equ 0x34
;el cambio a dar
maux
equ 0x35
;para encender los bits de la moneda a dar.
prod_elegido equ 0x36
;para saber si se ha elegido el producto
decenas
equ 0x37
;guardamos las decenas de los productos
dato_recibido equ 0x3b ;para saber si se ha recibido el dato por RX.
pausa2
equ 0x38
;otro reg para pausa
aux
equ 0x39
;reg auxiliar
aux2
equ 0x3a
;reg auxiliar2
esp_prec
equ 0x3b
;para mover el cursor en le precio
producto
equ 0x3c
;donde guardamos el numero del producto
modo_precio equ 0x3d
;para saber si estamos en modo cambio de precio
aux_int
equ 0x3e
;reg auxiliar para interrupcion
esp_DATO
equ 0x5c
;reg para esperar Dato
esp_DIREC
equ 0x5d
;reg para esperar Direccion
;Rutina principal
org 0x0
clrf INTCON
goto inicio
org 0x4
goto INTERRUPT

;deshabilitamos interrupciones para iniciar micro

;cuando se produzca una interrupcin vendr aqui

XLVIII

Anexo
org 0x5
Inicio
call iniciar_LCD
call conf_tec
call conf_mic

buckle
nop
call ver_moneda
btfsc tapreta,1
call detectmoneda
btfss tapreta,0
goto buckle
call pedir_prod
goto buckle

Programa ASM de Mdulo 1 completo


;comienza el programa aqui
;vamos a rutina para iniciar la pantalla LCD
;vamos a rutina para dar vlaores a las teclas
;vamos a rutina para configurar el micro

;mira si hay una tecla apretada y si no es asi mira


;la ocion del teclado si no va a volver a mirar el
;LCD
;va al aparatado de elegir producto

;rutina para iniciar el LCD


iniciar_LCD
banksel TRISA
movlw 0xF0
movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0x07
movwf TRISB ;RB<0:2> entradas RC<3:7> salidas
movlw 0x18
movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas
movlw 0x83
;pre-escaler a 1:16
movwf OPTION_REG
banksel PORTA
clrf PORTA
;ponemos la instruccin FUCTION SET
call RS0
call E1
movlw 0x02
movwf PORTC
call E0
call retardo
movlw 0x2F
movwf letra
call escribir_LCD
call retardo
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo
call RS1
return
;fin de la inicializacin del LCD
;asignamos cada valor del teclado a un registro

XLIX

Anexo
conf_tec
movlw 1
movwf 0x20
movlw 2
movwf 0x21
movlw 3
movwf 0x22
movlw 0xc
movwf 0x23
movlw 4
movwf 0x24
movlw 5
movwf 0x25
movlw 6
movwf 0x26
movlw 0xd
movwf 0x27
movlw 7
movwf 0x28
movlw 8
movwf 0x29
movlw 9
movwf 0x2a
movlw 0xe
movwf 0x2b
movlw 0xa
movwf 0x2c
movlw 0
movwf 0x2d
movlw 0xb
movwf 0x2e
movlw 0xf
movwf 0x2f
return

Programa ASM de Mdulo 1 completo

;tecla 1
;tecla 2
;tecla 3
;tecla f
;tecla 4
;tecla 5
;tecla 6
;tecla e
;tecla 7
;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c

;Configuracion del micro


conf_mic
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x7
movwf ADCON1
;salidas digitales
movlw 0x87
movwf OPTION_REG ;preescaler a 1:256
bsf PIE1,RCIE
;interupccion RX habilitada
bcf PIE1,TXIE
;interupccion TX deshabilitada
movlw 0x24
movwf TXSTA
;TX tx9=1 txen=1 brgh=1
movlw D'27'
;SPBRG=27 que es donde tiene menos error
movwf SPBRG
banksel PORTC
; banco 0
movlw 0x90
movwf RCSTA
;RC spen=1 rx9=1 CREN=1
movlw 0xc0
iorwf INTCON,F
;activamos interrupciones
clrf r1
clrf r2
clrf tapreta
;inicializa el valor del registro de valor de tecla

Anexo

Programa ASM de Mdulo 1 completo


clrf rmoneda

;inicializa el valor del reg de detecion de tecla


;apretada
;inicializamos el valor del registro de precio

clrf rprecio
clrf num_prod
clrf decenas
clrf modo_precio
clrf dato_recibido ;inicializa el reg. De dato recibido
clrf prod_elegido
bsf lim_tec,0
clrf err_prod
movlw 1
movwf esp_DIREC
movwf esp_DATO
banksel EECON1
;esto es para configurar la EEPROM
bcf EECON1,EEPGD ;ponemos en modo ecritura de datos
banksel PORTB
;volvemos al primer banco
call mens_inicio
call op_a_producto ;para iniciar registros en modo pedir producto
return

;vamos dando un '1' a las columnas para ir comprobando si la tecla esta


;apretada
ver_moneda
movlw 0x1
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q esta encolumna 1
call rev_fila ;vamos a mirar las filas una por una
movlw 0x2
movwf PORTC
movlw 0x04
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
movlw 0x4
movwf PORTC
movlw 0x08
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
movlw 0x8
movwf PORTC
movlw D'12'
movwf r1
;guardamos 1 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
return
;volvemos al prinicipio
rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTB,0

;si hay tecla apretada salta para ir mas rapido

;ponemos 0 para saber que es la fila 1


;guardamos mascara para comprobar despues
;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos

call retardo_prod

LI

Anexo

Programa ASM de Mdulo 1 completo


btfsc tapreta,0
return
movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTB,1

;si hay tecla apretada salta para ir mas rapido

;ponemos el valor 4 para saber q es la fila 2


;volvemos a guardar mascara
;comprobamos bit 1 para saber
;si la tecla de la fila esta activada

call retardo_prod
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x02
;guardamos el valor 8 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTB,2
call retardo_prod
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
clrf r2
movlw 0x08
movwf mas_fil
btfsc PORTA,3

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call ret_tecl_moneda
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw
movwf
movwf
btfsc

0x10
r2
mas_fil
PORTA,4

;ponemos el valor 4 para saber q es la fila 2


;volvemos a guardar mascara
;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call ret_tecl_moneda
return
;en esta rutina hacemos un pequeo retardo para los rebotes
retardo_prod
movlw 0x0F
movwf ret
buck_re decfsz ret,f
comprobar el PORTB
goto buck_re
movf PORTB,w
andwf mas_fil,w

btfsc STATUS,Z
return

;actualizamos el registro para el retardo


;se va decrementando ret hasta q volvemos a

;hacemos una and entre la mascara guardada y W


;si el resultado es diferente de 0 es q la tecla
;esta pulsada
;para mirarlo si el flag Z del STATUS esta a 0 es q
;la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada

LII

Anexo

Programa ASM de Mdulo 1 completo

most_num
clrw
addwf r1,w
addwf r2,w
addlw 0x20
movwf FSR
movf INDF,w
movwf rmoneda
bsf tapreta,0

;sumamos r1 y r2 para despues saber el valor de


;la tecla apretada
;movemos el valor a FSR para acceso indirecto
;guardamos el resultado de la tecla
;poenmos a '1' el bit 0 de tapreta para saber que
;hay 1 tecla apretada

;buckle para saber si la tecla deja de ser apretada


sol_tec movf PORTB,w
andwf mas_fil,w
btfss STATUS,Z
goto sol_tec
return

;volvemos a utilizar la mascara para saber si la


; tecla sigue apretada hasta q el flag Z no este a 1
; no saldra del buckle

;buckle para saber que tecla del monedro est apretada.


ret_tecl_moneda
movlw 0x0F
movwf ret
;actualizamos el registro para el retardo
buck_
decfsz ret,f
goto buck_re2
movf PORTA,w
andwf mas_fil,w
btfsc STATUS,Z
return

;se va decrementando ret hasta q volvemos a


; comprobar el PORTC
;hace una and
;resultado es
;esta pulsada
; STATUS esta
;asi seguimos

entre la mascara guardada y W si el


diferente de 0 es q la tecla
para mirarlo si el flag Z del
a 0 es q la tecla se pulso si no es
con el programa

;aqui calculamos la tecla apretada en el monedero


most_num2
addwf r1,w ;sumamos los valores de r1 y r2 para saber la tetcla
addwf r2,f ; apretada
rrf r2,f
;rotamos 2 veces el valor de r2 para que nos coincida
rrf r2,w
; el valor de r2 con el numero del registro de tecla
addlw 0x20 ; guardado
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rmoneda
;guardamos el resultado de la tecla
bsf tapreta,1
;poenmos a '1' el registro de tapreta para saber ;si
hay tecla apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec2
movf PORTA,w
andwf mas_fil,w
btfss STATUS,Z
goto sol_tec
return

;volvemos a utilizar la mascara para saber si la


;tecla sigue apretada hasta q el flag Z no este
;acticado no saldra del buckle

;--------------------------------------------------------------------------

LIII

Anexo

Programa ASM de Mdulo 1 completo

;rutina para detectar moneda


detectmoneda
movf rmoneda,w
btfsc rmoneda,3
goto mirarsiopcion
movf rmoneda,w
movwf modetect
call detect_moneda
return
Dev_pagado
movf pagado,w
call dev_dinero
clrf pagado
call mens_inicio
clrf tapreta
return

;pasamos la cantidad de dinero pagada al W


;para que la funcion dev_dinero devuelva
;dicho dinero y ponemos a 0 la cantidad
; pagada

detect_moneda
btfsc modetect,2
goto detec_50_100_200
btfsc modetect,1
goto detec_10y20
movf modetect,w
goto fin_detect

;si la tecla es menor de 8 saltamos


;si la tecla es mayor de 8 vamos a ver si
;es la tecla de cancelar
;pasamos la moneda detectada al registro y
;vamos a detectarla

;si la tecla es < de


;si la tecla es > de
;200 cent
;si la tecla es < de
;si la tecla es > de
;cent
;aqui ya sabemos que

4 saltamos
4 es la moneda 50 100 o
2 saltamos
2 es la moneda 10 o 20
es la moneda de 5 cent

detec_10y20
btfsc modetect,0
goto detect_20
movlw D'2'
goto fin_detect

;diferenciamos entre la moneda de 10 y 20 cent si


;es la la tecla 2 es la moneda de 10 y por lo
;tanto en pagado habr que incrementar el valor
;de '2'

detect_20
movlw D'4'
goto fin_detect

;aqui sabemos que es la moneda de 20 cent y habr


;que incrementar en '4' el valor de pagado

detec_50_100_200
btfsc modetect,1
goto detec_200
btfsc modetect,0
goto detec_100
movlw D'10'
goto fin_detect

;diferenciamos entre las monedas de 50 100 y 200


; centimos

;si es la tecla 4 llegar hasta aqui y sabremos


;que es la moneda de 50 cent por lo tanto
;incrementamos en '10' pagado

detec_200
movlw D'40'
goto fin_detect

;aqui sabemos que es la moneda de 200 cent y


;habr que incrementar en '40' el valor de pagado

detec_100
movlw D'20'
goto fin_detect

;aqui sabemos que es la moneda de 100 cent y


;habr que incrementar en '20' el valor de pagado

fin_detect

;a esta funcin las anteriores le pasan por el W el


;valor a incrementar el registro pagado

LIV

Anexo

Programa ASM de Mdulo 1 completo


movwf aux
;lo que vamos a aadir se pone en aux por si hemos
addwf pagado
;metido ms monedas de la cuenta
btfsc STATUS,C
goto exceso_de_dinero
;en el caso de haber pasado el tope se ir
call RS0
;a esta funcin
movlw 0x2
;pasamos este valor para hacer un return home en
movwf letra
;el LCD
call clear_display
movf pagado,w
;iniciamos registros
clrf digito
clrf tapreta
call pasar_a_LCD ;y escribimos lo pagado en la pantalla de LCD
call escribir_PG ;despues del valor de lo pagado escribimos PG en
return
; el LCD

exceso_de_dinero
movf aux,w
subwf pagado,f
call dev_dinero
clrf tapreta
return

;en el caso de exceso de dinero devovlemos la moneda


;insertada y restamos la ultima moneda al registro
;pagado
;inciamos registro de tecla apretada para esperar la
; proxima tecla

mirarsiopcion
;Aqui revisamos si es cancelar y devolver lo pagado
btfss rmoneda,0
call Dev_pagado
;Aqui se ha cancelado y se devolveria lo pagado
fin

clrf tapreta
;iniciamos registros
clrf rmoneda
return
;-------------------------------------------------------------pasar_a_LCD
movwf letraux
clrf digito
b_millares
;para saber si hay ms de 10 euros metidos
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
addwf letraux

;este es solo en caso q sea + de 10 euros

millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito

b_centenas
movlw D'20'
subwf letraux

;calculo las centenas de lo que he metido

LV

Anexo

Programa ASM de Mdulo 1 completo


btfss STATUS,C
goto centenas
movlw 1
addwf digito
goto b_centenas

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito
b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;-------------------------------------------------------------------------;rutina para elegir producto
pedir_prod
call elegir_prod
;vamos a elegir el producto y cuando volvemos
btfss prod_elegido,0
;si se a terminado de elegir continuamos si no
return
;esperamos otra tecla
rev_prod
btfsc err_prod,0
goto esc_err_prec
call det_si_prod
btfsc err_prod,1
goto no_dar
call RS0
movlw 2
movwf letra

;reviamos si hay algun error en el producto


;si es asisalimos por error
;de lo contrario miramossi hay producto
;vovlemosa revisar sihay error
;si lo hay salimos y no damos producto
;ponemos el display en 1 linea

LVI

Anexo

Programa ASM de Mdulo 1 completo

call escribir_LCD
call RS1
call det_si_cambio
;revisa si se necesita cambio y si se ha
bcf STATUS,Z
;pagado
movlw 0xF
andwf err_prod
;si no hay errores continua si no no da el
btfss STATUS,Z
;producto
goto no_dar
call retardo_largo
;hacemos esperas antesy damos el producto
call dar_producto
call retardo_largo
call retardo_largo
call retardo_largo
clrf pagado
;iniciamos LCD y registros para esperar nuevo
call mens_inicio
;producto
movlw 0x1
subwf lim_tec
call iniciar_regs
call op_a_producto
clrf dato_recibido
return
;-----------------fin del cuerpo de pedir producto-----------------------comprobar_precio
;rutina para comprobar si se ha pagado prod
movf DATO,w
btfsc STATUS,Z
goto no_precio
movf DATO,w
call pasar_a_LCD
movlw 0x24
;ponemos E despues de precio
movwf letra
call escribir_LCD
return
no_precio
;por si no hay precio
bsf err_prod,0
call escribir_ERROR
return
esc_err_prec
;rutina para salir por error en el precio
call retardo_largo
call no_dar
;vamos a o dar el producto e inicializamos
clrf tapreta
;registros
clrf err_prod
clrf decenas
call mens_inicio
return
det_si_cambio
;para ver si hay que dar cambio y si se ha pagado
bcf STATUS,C
;el producto
bcf STATUS,Z
movf DATO,w
subwf pagado,w
btfss STATUS,C
goto sin_dinero
;esto es en el caso de haberse pagado el producto
btfss STATUS,Z
call detect_cambio
return

LVII

Anexo

Programa ASM de Mdulo 1 completo

sin_dinero
;si no se ha pagado producto pasamos el error a err_prod
bsf err_prod,2
return
no_dar
;funcin donde se procesan los errores y son se da el
call no_pagado
;producto por que a avido algn fallo s inicializan
clrf decenas
;los registros para comenzanzar de nuevo
clrf err_prod
clrf tapreta
movlw 0x10
movwf aux
buck_ret
call retardo_largo
decfsz aux
goto buck_ret
call mens_inicio
nop
return
detect_cambio
;para detectar cambio miramos el interruptor que hay en
btfsc PORTC,5 ;RB5 (0 no prod, 1 si prod) y guardaremos en err_prod si
bsf err_prod,3
;no hay prod.
return
dar_producto
;son las funciones que tiene que hacer para dar producto
call dar_cambio
call entregar_producto
call retardo_largo
return
;------------------------------------------------------------------------;Comunicacin RS232 para comprobrar producto y dar producto.
entregar_producto
;rutina para dar el producto
movf DIREC,w
addlw 0x80
;ponemos el codigo para queel otro micro sepa que
;queremos pedir que entrege el producto
movwf TXREG
;enviamos direccion del producto seleccionado
call esp_envio
;espermaos confirmacin
clrf dato_recibido
return
esp_envio
banksel TXSTA
espenv
btfss TXSTA,TRMT
goto espenv
banksel 0
return

;para ver si se ha enviado el dato

;una vez que se desactive TRMT es que se ha enviado


;la direccion

det_si_prod
;rutina para preguntar si hay producto
clrf dato_recibido
movf DIREC,w
movwf TXREG
;enviamos dato
call esp_envio
;esperamos a que se haya enviado el dato
espRX2
btfss dato_recibido,0

;esperamos recibir confirmacion del otro


;micro para saber si hay o no producto

LVIII

Anexo

Programa ASM de Mdulo 1 completo


goto espRX2
clrf dato_recibido
return

allo_envio
;rutina por no recibir nada
bsf err_prod,1
clrf dato_recibido
return
;-------------------------------------------------------------------------;tratamiento de errores en el proceso
no_pagado
call retardo_largo
call RS0
movlw 0x88
;situamos ursor en la posicion 8 de la 1 linea
movwf letra
call escribir_LCD
call RS1
movlw 0x4E
;N
movwf letra
call escribir_LCD
movlw 0x4f
;O
movwf letra
call escribir_LCD
movlw 0x20
;space
movwf letra
call escribir_LCD
btfsc err_prod,0 ;si es error por n tener precio
goto err_x_precio
btfsc err_prod,1 ;si no hay producto
goto err_x_gastado
btfsc err_prod,3 ;si no hay cambio
goto err_x_cambio
call escribir_PG ;escribir PG en el caso de no haber pagado el
;producto
fin_no_pagado
;iniciar registros antes de sperar otra tecla
clrf err_prod
call op_a_producto
return
err_x_precio
movlw 0x24
;escribir '$' en el caso de existir precio
movwf letra
call escribir_LCD
goto fin_no_pagado
err_x_gastado
call escribir_PROD
goto fin_no_pagado

;en el caso de que el producto se haya gastado

err_x_cambio
call escribir_CM
goto fin_no_pagado

;error xq no hay cambio.

;-------------------------------------------------------------------------dar_cambio

LIX

Anexo

Programa ASM de Mdulo 1 completo


movf DATO,w
subwf pagado,w

;aqu para calvular el cambio solamente restamos


;a lo pagado el precio del producto y dejamos el
;valor en W

;--------------------------------------------------------------------dev_dinero ;esta rutina nos da las monedas a devovler por RA solo hay que
movwf cambio
; pasarle por el W la cantidad de dinero a devolver.
call retardo_largo
call RS0
movlw 0x89
;ponemos el cursor en el espacio 9 de la 1 linea
movwf letra
call escribir_LCD
call RS1
call escribir_CM ;escribimos CM antes de la cantidad
movf cambio,w
call pasar_a_LCD ;esribimos la cantidad a devolver
call retardo_largo
movf cambio,w
btfsc STATUS,Z
return
movwf letraux
bcf STATUS,C
euro1
movlw B'000101'
;ponemos codigo a pasar al decodificador este codigo
movwf maux
;es le de 1 euro
movlw D'20'
;revisamos que la cantidad supere 20
subwf letraux,f
btfss STATUS,C
goto cent50
;si no lo supera vamos a revisar la moneda de 50 cent.
call dar_moneda ;si lo supera vamos a dar la moneda y volvemos a mirar
goto euro1
;si sigue superando 20 para dar otra moneda.
cent50
bcf STATUS,C ;como en la anterior se pne el cdigo moneda de 50 cent.
movlw B'000100'
movwf maux
;se suma 20 que es lo restado antes para quedarnos con
movlw D'20'
;el cambio que tenemos realmente
addwf letraux,f
buc50
movlw D'10'
;y empoezamos como antes a restar 10 hasta que nos salga
subwf letraux,f ;negativo que pasara a revisar la moneda de 20 cent.
btfss STATUS,C
goto cent20
call dar_moneda
goto buc50
cent20
bcf STATUS,C
movlw B'000011'
movwf maux
movlw D'10'
addwf letraux,f
buc20
movlw D'4'
subwf letraux,f
btfss STATUS,C

;pasamos el cdigo de la moneda de 20 cent. Y


; sumamos 10 para tener el cambio real a dar.

;restamos 4 hasta que no nos salga negativo que


;pasaria a revisar la moneda de 10 cent.

LX

Anexo

Programa ASM de Mdulo 1 completo


goto cent10
call dar_moneda
goto buc20

cent10
bcf STATUS,C
movlw B'000010'
movwf maux
movlw D'4'
addwf letraux,f
buc10
movlw D'2'
subwf letraux,f
btfss STATUS,C
goto cent5
call dar_moneda
goto buc10
cent5
bcf STATUS,C
movlw B'000001'
movwf maux
movlw '2'
addwf letraux,f
btfsc letraux,0
call dar_moneda

;pasamos el cdigo de la moneda de 10 cent.


;y sumamos 4 para volver al valor real

;restamos 2 hasta que quede negativo y pasariamos a


;la moneda de 5 cent.

;pasamos el cdigo de la moneda de 5 cent. y sumamos


;2 al valor que teniamos

;si el valor que tenemos del cambio es 0 no damos


;moneda si es 1 tedremos que dar una moneda de 5
;cent.

return
dar_moneda
;esta funcin si detecta las anteriores que hay que
movf maux,w
;dar una moneda le pasan por maux el vlor de la
movwf PORTA
;moneda a dar y pasa el valor al decodificador para
banksel TRISA
;que se encienda el LED correspndiente
movlw 0x87
movwf OPTION_REG
banksel PORTA
call retardo_largo
;aqu hacemos pausas para ver el LED encendido
call retardo_largo
movlw B'111000'
;volvemos a dejar el decodificador para que no
andwf PORTA
;encienda ningun LED
call retardo_largo
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return
retardo_largo
movlw 0xFF
movwf pausa2
retm1 movlw 0xFF
movwf pausa
retm2
banksel TRISB
banksel PORTB
decfsz pausa
goto retm2
decfsz pausa2

;retardo para poder ver el LED encendido

LXI

Anexo

Programa ASM de Mdulo 1 completo

goto retm1
return
;-------------------------------------------------------------------------elegir_prod
movlw 0x3
;revisamos si tenemos q poner las unidades o las decenas
andwf lim_tec,w
;si no es el caso solo se puede apretar la tecla
btfsc STATUS,Z
; aceptar o cancelar
goto correcto?
movf rmoneda,w
;miramos si no es la tecla acpetar o cancelar
btfss rmoneda,3
;si no lo es revisamos la tecla del numero
goto revisar_tecla
andlw 0x6
;miramos si es la tecla 9
btfsc STATUS,Z
goto revisar_tecla
movf rmoneda,w
btfsc rmoneda,2
return
btfsc rmoneda,0
goto correcto?
;en el caso que sea la tecla aceptar o cancelar
return
revisar_tecla
btfsc lim_tec,1
goto enviar_decena
call RS0
movlw 0xc6
;ponemos cursor en espacio 6 de la 2 linea del display
movwf letra
call escribir_LCD
call RS1
movf rmoneda,w ;escribimos el valor de las unidad del producto a
addlw 0x30
;elegir
movwf letra
call escribir_LCD
call RS0
movlw 0xca
;ponemos el cursor en el espacio 10 de la 2 linea
movwf letra
call escribir_LCD
call RS1
movf decenas,w
addwf rmoneda,w ;aqui guardamos la direcion del producto
movwf DIREC
call EE_LEE
call comprobar_precio
;revisamos precio y o escribimos
clrf tapreta
clrf lim_tec
return
enviar_decena
clrf tapreta
btfsc rmoneda,2
;cancelo si la tecla es mayor de 4
return
btfsc rmoneda,3
;cancelo si la tecla es 8 o 9
return
call RS0
;ponemos el display en 2 linea
movlw 0xC0
movwf letra
call escribir_LCD

LXII

Anexo

Programa ASM de Mdulo 1 completo


call RS1
call escribir_PROD
movlw 0x20
movwf letra
call escribir_LCD
movf rmoneda,w
movwf num_prod
addlw 0x30
movwf letra
call escribir_LCD

;espacio en blanco

;escibimos la decena del dislay

buc_decenas
;bucle para calcular las decenas
movlw 0
addwf rmoneda
btfsc STATUS,Z
;revisamos si es la tecla 0
goto escribe_0
movlw 0x10
;sumamos 10 para convertir a decenas
addwf decenas
movlw 0x1
subwf rmoneda
btfss STATUS,Z
goto buc_decenas
subwf lim_tec
clrf tapreta
return
escribe_0
clrf tapreta ;ponemos a 0 el registro tecla apretada para sig. tecla
movlw 1
subwf lim_tec ;quitamos 1 al limite de tecla para saber q la
return
; siguiente es las unidades
correcto?
;para saber si se aprieta la tecla de cacelar o aceptar
btfss rmoneda,3
goto fin_correcto?
btfss rmoneda,0
goto aceptado
goto cancelado
aceptado
btfss err_prod,0

;si hay error por q no tiene precio no deja activar


;el registro prod_elegido
bsf prod_elegido,0 ;ponemos a 1 el registro de prod_elelgido para
goto fin_correcto? ;que al salir de seleccionar producto sepa que ya
;ha sido seleccionado

cancelado
clrf
call
call
goto

decenas
;si es tecla cancelar se inician registros y LCD
op_a_producto ;y se comienza de nuevo
mens_inicio
fin_correcto?

fin_correcto?
clrf tapreta ;aqu solamente ponemos a 0 el registro que nos dice
return
;si hay una tecla apretada.
;-------------------------------------------------------------------------op_a_producto
;para iniciar registros

LXIII

Anexo

Programa ASM de Mdulo 1 completo


movlw 0x2
movwf lim_tec
clrf err_prod
clrf prod_elegido
clrf tapreta
return

iniciar_regs
;para iniciar registros
clrf num_prod
clrf decenas
clrf tapreta
return
;-------------------------------------------------------------------------mens_inicio
;mensaje de inicio a escribir en LCD
movlw 0x1
movwf letra
call clear_display
movf pagado,w
call pasar_a_LCD
call escribir_PG
return
escribir_PG
movlw 0x50
;letra P
movwf letra
call escribir_LCD
movlw 0x47
;letra G
movwf letra
call escribir_LCD
return
escribir_PROD
movlw 0x50
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x44
movwf letra
call escribir_LCD
return

;letra P

;letra R

;letra O

;letra D

escribir_CM
movlw 0x43
;letra C
movwf letra
call escribir_LCD
movlw 0x4d
;letra M
movwf letra
call escribir_LCD
return
escribir_NUE
movlw 0x4e

;letra N

LXIV

Anexo

Programa ASM de Mdulo 1 completo


movwf letra
call escribir_LCD
movlw 0x55
;letra U
movwf letra
call escribir_LCD
movlw 0x45
;letra E
movwf letra
call escribir_LCD
return

escribir_ERROR
movlw 0x45
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD

;letra E

;letra R

;letra R

;letra O

;letra R

clear_display

t0

;funcin para las instruciones de 1,53ms de la pantalla de


;LCD
banksel TRISB
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return

escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0

LXV

Anexo

t1

Programa ASM de Mdulo 1 completo


movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0
btfsc TMR0,7
goto t1
return

E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,4
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,4
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,3
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,3
return

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01 ;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return
;-------------------------------------------------------------------------;EEPROM
;funciones de la EEPROM
EE_ESCRIBE
;con esta escvribimos un valor pasado por el W
movf DATO,w
;en la Direccion psada por el registro DIREC
banksel EEDATA
movwf EEDATA
banksel 0
movf DIREC,w
banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR

LXVI

Anexo

Programa ASM de Mdulo 1 completo

bsf INTCON,GIE
bcf EECON1,WREN
EE_WAIT btfsc EECON1,WR
goto EE_WAIT
banksel DATO
return
EE_LEE
;leemos el valor de la EEPROM que este en el
movf DIREC,w
;Registro DIREC que le hemos pasado
banksel EEDATA
movwf EEADR
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movf EEDATA,w
banksel DATO
movwf DATO
;devolvemos el valor leido por el registro DATO
return
;-------------------------------------------------------------------------INTERRUPT
;rutina de interrupcion para recibir datos
banksel 0x0
nop
L1
btfss PIR1,RCIF
;miramos si la interupcion es por recepcion
goto L2
btfss RCSTA,2
;si lo es miramos queno haya error de framing
goto ER1
bsf err_prod,1
;si lo hay leemos RCREG par quitar error activamos
movf RCREG,F
;el registro de error
movlw CANCELAR
;y enviamos CANCELAR al otro micro
movwf TXREG
goto L1
ER1

btfss RCSTA,1
;miramos si ha y errror de overfow
goto revisar_enviado
bsf err_prod,1
;si lo hay ponemos a 0 CREN y despues a 1 para
bcf RCSTA,4
;quitar el error
bsf RCSTA,4
bsf dato_recibido,0
goto L1

revisar_enviado
;aqu llemos el datorecibido y lo pasamos a regisro
movf RCREG,w
;auxiliar
movwf aux_int
btfss modo_precio,0
;si no estamos en modo precio vamos es q
goto rec_conf_producto ;recibimos confirmacion de producto o inicio
btfsc esp_DIREC,0
;de cambio de EEPROM
goto pet_DIREC
;si estamos en modo precio es que esperamos
btfsc esp_DIREC,1
;alguno de los aparados para cambiar el precio
goto rec_DIREC
;de la EEPROM y mira haber cual espera para ir
btfsc esp_DATO,0
;alli
goto pet_DATO
goto rec_DATO
rec_conf_producto
movf aux_int,w
xorlw INICIO
btfss STATUS,Z

;aqui miramos si es la confirmacion de producto


;o que se inicia el cambio de la EEPROM

LXVII

Anexo

Programa ASM de Mdulo 1 completo


goto int_ped_prod
goto ini_int_EEPROM

;-----------------------------int_ped_prod
;confirmacin de pedir producto
movf aux_int,w
xorlw ACEPTAR
btfsc STATUS,Z
goto correcto
FALLO
;si no hay proucto hace esto
bsf err_prod,1
bsf dato_recibido,0
goto L1
correcto
;si lo hay hace esto otro
clrf err_prod
bsf dato_recibido,0
goto L1
;------------------------------pet_DIREC
;funcion que espera la peticion de direcion
movf aux_int,w
;comprueba que sea la peticion de direccion
xorlw EDIREC
;si lo es envia codigo de aceptar si no lo
btfss STATUS,Z
;es va a revisar si es el fin del ambio de la
goto fin_cambio_EEPROM ; EEPROM
movlw 2
;se pone a esperar la direccion
movwf esp_DIREC
movlw ACEPTAR
movwf TXREG
call esp_envio
;espera a que el dato haya sido enviado
goto L1

rec_DIREC
movf aux_int,w
xorlw 0xC0
btfsc STATUS,Z
goto fallo_tx
movf aux_int,w
movwf DIREC
clrf esp_DIREC
bsf esp_DATO,0
movlw ACEPTAR
movwf TXREG
call esp_envio
goto L1

pet_DATO
movf aux_int,w
xorlw EDATO
btfss STATUS,Z
goto fallo_tx
movlw 2
movwf esp_DATO
movlw ACEPTAR
movwf TXREG

;funcion que espera la direcion


;comprueva que pueda ser direccion si no
;va a fallo de transmision

;si lo es guarda la direcion y se queda a


;esperar peticion de dato y envia el codigo
;de aceptar

;espera a que el dato haya sido enviado

;espera la peticion de dato compruevaque lo


;recibido es petidion de dato si no lo es va
;a fallo de transmisin
;si lo es se pone a esperar dato y se queda
;a esperar el dato y envia codigo aceptar

LXVIII

Anexo

Programa ASM de Mdulo 1 completo


call esp_envio
goto L1

rec_DATO
movf aux_int,w
movwf DATO
bsf esp_DIREC,0
clrf esp_DATO
call EE_ESCRIBE
movlw ACEPTAR
movwf TXREG
call esp_envio
goto L1
fallo_tx
movlw CANCELAR
movwf TXREG
call esp_envio
goto L1

;espera a que el dato haya sido enviado

;Aqu recibe el dato n comprueba que este bien


;porque no se puede lo que hace es con el dato
;recibido y la direccion recibida cambia el
;dato de la direccion de la EEPROM y se queda
;a la espera de una nueva peticion de
;direccion y envia el codigo de aceptar

;espera a que el dato haya sido enviado

;ene l caso de fallo de transmision


;manda el codigo de cancelar
;espera a que el dato haya sido enviado

ini_int_EEPROM
;en el caso de haber recibido inicio de transmision
movlw 0xF
;ponemos a '1' todos los errores para q salga de las
movwf err_prod
;rutinas x si esta en medio de pedir producto
clrf tapreta
;eliminamos si habia una tecla apretada
bsf modo_precio,0
;esto es para saber que estamos en modo
;cambiar precio
movlw ACEPTAR
;enviamos como respuesta 'F0'
movwf TXREG
call esp_envio
goto L1
fin_cambio_EEPROM
clrf modo_precio ;ponemos a 0 para saber que ya no se esta
clrf esp_DIREC
;cambiando la EEPROM e inicia todos los
clrf esp_DATO
;los registros para continuar el proceso
bsf esp_DIREC,0
bsf esp_DATO,0
clrf err_prod
goto L1
L2

retfie

Retardo
;pequeo retardo para el inciar el LCD
movlw 0x80
movwf TMR0
b_r
btfsc TMR0,7
goto b_r
return
end

LXIX

Anexo

Programa ASM prctica 2

A.2 Mdulo 2
A.2.1. Programa ASM de prctica 2
#include "p16f877.inc"
;registros de proposito general
DATO
DIREC
modo_envio
decena
pausa2
aux
aux1
rtecla
tapreta
rprecio
r1
r2
mas_fil
ret1
ret2
ret3
lim_tec

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

0x30
0x31
0x33
0x35
0x36
0x37
0x38
0x40
0x41
0x42
0x43
0x44
0x45
0x51
0x52
0x53
0x54

;dato de eprom
;direcion eprom
;para pasar a modo de envio de la EEPROM
;para guardar las decenas del producto selec.
;otro reg para pausa
;reg auxiliar
;reg auxiliar
;valor de la tecla apretada
;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;registro para retardo
;registro para retardo
;registro para retardo
;registro para saber q tiene q detectar 2 teclas en
;producto
num_prod
equ 0x55
;registro producto seleccionado
rmonaux
equ 0x56
;reg para calcular las decenas en precio
pagado
equ 0x57
;reg de la cantidad pagada
digito
equ 0x58
;reg aux para el digito a pasar al LCD
ret
equ 0x59
;para hacer el retardo
letra
equ 0x5a
;reg para escribir en LCD
letraux
equ 0x5b
;reg aux para escr precios en LCD
lauxil
equ 0x5c
;reg auxiliar para escribir tecla
esp_prec
equ 0x5d
;para saber si hemos insertado el producto
prod_elegido equ 0x5e
;reg para elegir el producto
precio_actual equ 0x5f ;donde guardamos el precio introducido
borrar_memoria equ 0x46 ;para saber si queremos borrar a memoria o no.
org 0x0
inicio
call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD
call conf_tec
;vamos a rutina para dar vlaores a las teclas
call conf_mic
;vamos a rutina para configurar el micro
buckle
nop
call ver_tecla
btfsc tapreta,0
call mod_precio
goto buckle

;mira si hay una tecla apretada y si no es asi


;vuelve a revisar el teclado

;rutina para iniciar el LCD


iniciar_LCD
banksel TRISA
movlw 0xe0

LXX

Anexo

Programa ASM prctica 2


movwf TRISC
;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0xc0
movwf TRISB
;RB<0:2> entradas RC<3:7> salidas
movlw 0x0f
movwf TRISA
;RA SALIDAS
movlw 0x03
;pre-escaler a 1:16
movwf OPTION_REG
banksel PORTA
movf PORTA,W
;ponemos la instruccin FUCTION SET
andlw 0XF
movwf PORTA
call RS0
call E1
movlw 0x02
movwf PORTC
call retardo_ini
call E0
movlw 0x2F
movwf letra
call escribir_LCD
call retardo_ini
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo_ini
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo_ini
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo_ini
call RS1
return
;fin de la inicializacin del LCD

;asignamos cada valor del teclado a un registro


conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xf
;tecla f
movwf 0x23
movlw 4
;tecla 4
movwf 0x24
movlw 5
;tecla 5
movwf 0x25
movlw 6
;tecla 6
movwf 0x26
movlw 0xe
;tecla e
movwf 0x27
movlw 7
;tecla 7
movwf 0x28

LXXI

Anexo

Programa ASM prctica 2


movlw 8
movwf 0x29
movlw 9
movwf 0x2a
movlw 0xd
movwf 0x2b
movlw 0xa
movwf 0x2c
movlw 0
movwf 0x2d
movlw 0xb
movwf 0x2e
movlw 0xc
movwf 0x2f
return

;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c

;Configuracion del micro


iniciar_mic
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x07
movwf ADCON1
;salidas digitales de RA
movwf OPTION_REG
banksel PORTC
; banco 0
clrf PORTB
bcf PORTC,4
clrf r1
clrf r2
clrf tapreta
;inicializa el valor del reg. de valor de tecla
clrf rtecla
;inicializa el valor del reg. de tecla apretada
clrf rprecio
;inicializamos el valor del registro de precio
clrf num_prod
clrf decena
clrf borrar_memoria
clrf lim_tec
bsf lim_tec,1
;iniciamos lim_tec a 2
clrf esp_prec
bsf modo_envio,0
clrf prod_elegido
banksel EECON1
;esto es para configurar la EEPROM
bcf EECON1,EEPGD ;ponemos en modo ecritura de datos
banksel PORTB
;volvemos al primer banco
call mens_inicio
return
;-------------------------------------------------------------------------ver_tecla
movlw 0x01
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q estamos en la columna 1
call rev_fila ;vamos a mirar las filas una por una
movlw 0x02
movwf PORTC
movlw 0x04
movwf r1
;guardamos 4 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas

LXXII

Anexo

Programa ASM prctica 2


movlw 0x04
movwf PORTC
movlw 0x08
movwf r1
;guardamos 8 en r1 para saber q estamos en la columna 3
call rev_fila ;volvemos a mirar filas
movlw 0x08
movwf PORTC
movlw D'12'
movwf r1
;guardamos 12 en r1 para saber q estamos en la columna 4
call rev_fila ;volvemos a mirar filas
return
;volvemos al prinicipio

rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTA,0

;si hay tecla apretada salta para ir mas rapido

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTA,1

;ponemos el valor 1 para saber q es la fila 2

;volvemos a guardar mascara


;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x02
;guardamos el valor 2 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTA,2
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x03
;guardamos el valor 2 para la fila 3
movwf r2
movlw 0x08
movwf mas_fil
btfsc PORTA,3
call confimar_tecla
return
confimar_tecla
call ret_corto
movlw 0x0F

LXXIII

Anexo

Programa ASM prctica 2

andwf PORTA,w
xorwf mas_fil,w

btfss STATUS,Z
return

;hacemos una xor entre la mascara guardada y W


;si el resultado es diferente de 1 es q la tecla
;esta pulsada
;para mirarlo si el flag Z del STATUS esta a 0 es q
;la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada


most_num
clrw
addwf r1,w
;sumamos r1 y r2 para despues saber el valor de
addwf r2,w
;la tecla apretada
addlw 0x20
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rtecla
;guardamos el resultado de la tecla
bsf tapreta,0
;poenmos a '1' el bit 0 de tapreta para saber que
;hay 1 tecla apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec movlw 0x0f
andwf PORTA,w
andwf mas_fil,w
;volvemos a utilizar la mascara para saber si la
tecla sigue apretada
btfss STATUS,Z
;hasta q el flag Z no este a 1 no saldra del buckle
goto sol_tec
return
;-------------------------------------------------------------------------;rutina para modificar precio
mod_precio
clrf tapreta
;se mira si se ha elegido producto si no vamos
btfss prod_elegido,0
;a elergirlo si yas eha elegido revisamos la
goto elegir_prod
;tecla apretda
el_precio
btfss esp_prec,0
goto siguiente
btfss rtecla,3
goto primera_letra
movlw 0x06
andwf rtecla,w
btfsc STATUS,Z
goto primera_letra
clrf tapreta
btfsc rtecla,2
return
btfss rtecla,0
return
goto cancelar
primera_letra
call RS0
movlw 0xc0
movwf letra

;si es el primer numero del precio salta


;de lo contrario va a siguiente
;miramos si es una tecla entre 0-7

;miramos si es la tecla 8 o 9

;vamos mirando que sea la tecla Cancelar


;por si se cancela el proceso

;ponemos el cursor en la 2 linea

LXXIV

Anexo

Programa ASM prctica 2


call escribir_LCD
call RS1
call escribir_NUE
bcf esp_prec,0
clrf decena
clrf num_prod

;escribimos NUE antes del precio


;ponemos a 0 esp_prec para poder apretar
;la tecla cancelar

siguiente

;es igual que el precio pero con la posibilidad de la tecla


;ACEPTAR
movf rtecla,w
btfss rtecla,3
;no saltamos si es tecla 0,1,2,3,4,5,6 o 7
goto rev_precio
andlw 0x6
btfsc STATUS,Z
;no saltamos si es tecla 8 o 9
goto rev_precio
btfsc rtecla,2
;no saltamos si es tecla C,D,E o F
goto err_tecla
btfss rtecla,0
;no saltamos si es tecla A
goto aceptar
goto cancelar
;tiene q ser la tecla B

err_tecla
clrf tapreta
return

;ene l caso de que haya pulsado una tecla


;que no tocaba se limpia el regisrtro de tecla
;apretada y se vuelve a esperar otra

cancelar
;aqui inicializamos los registros para empezar
clrf DIREC
;de nuevo
movlw 0x02
movwf lim_tec
call iniciar_regs
bsf esp_prec,0
bsf modo_envio,0
clrf prod_elegido
call escribir_CANCEL
call retardo
call mens_inicio
return
aceptar
;en esta funcin pasamos el valor del precio
movf precio_actual,w
movwf DATO
;en la direccin guardada y se va a la funcin
movlw 0x02
;de escibir en la eeprom
movwf lim_tec
call EE_ESCRIBE
call iniciar_regs
call RS0
;ponemos cursor en pos 8 de 2 linea de LCD
movlw 0xc9
movwf letra
call escribir_LCD
call RS1
movf DATO,w
;escribimos en LCd el precio insertado en EEPROM
call pasar_a_LCD
call retardo
call mens_inicio ;vamos a inicializar la panatalla LCD y se inician
bsf esp_prec,0
;los registros para empezar de nuevo
bsf modo_envio,0
clrf prod_elegido

LXXV

Anexo

Programa ASM prctica 2

return
iniciar_regs
clrf num_prod
clrf decena
clrf tapreta
return
rev_precio
movf rtecla,w
addlw 0x30
movwf letra
movf decena,w
addwf rtecla,w
movwf rtecla
btfsc STATUS,Z
goto f_rev_precio
movwf aux
clrf decena

;esto es para seleccionar el precio


;lo unico que hacemos es leer la tecla
;escribirla en el LCD

;revisamos si es 0

buc_rev_precio
;aqu que es la continuacion multiplica el valor
movlw d'10'
;del precio por 10 para la siguiente teca que se
addwf decena
;apriete
decf aux,f
btfss STATUS,Z
goto buc_rev_precio
f_rev_precio
movf rtecla,w
movwf precio_actual
call escribir_LCD
clrf tapreta
movlw 0x02
movwf lim_tec
return

;finalizamos actualizando los precios


;para la siguiente tecla

;-------------------------------------------------------------------------elegir_prod
btfsc borrar_memoria,0
goto mirar_si_borro
movf rtecla,w
;miramos si no es la tecla acpetar o cancelar
btfss rtecla,3
;si no lo es revisamos la tecla del numero
goto revisar_tecla
andlw 0x6
;miramos si es la tecla 8 o 9
btfsc STATUS,Z
goto revisar_tecla
movf rtecla,w
btfsc rtecla,2
goto mirar_si_envio
btfsc rtecla,0
;si es la tecla B se cancela el proceso
goto cancelar
return
mirar_si_envio
btfss modo_envio,0
return
btfss rtecla,1
return

;esto para ver si es la tecla envir


;o borrar la memoria

LXXVI

Anexo

Programa ASM prctica 2


btfss rtecla,0
goto enviar_RS2
goto ini_reset_memory

mirar_si_borro
;si se ha seleccionado borrar la memoria
btfss rtecla,3
;solo podemos apretar la tecla aceptar y
return
;cancelar
btfsc rtecla,2
return
btfss rtecla,1
return
btfsc rtecla,0
goto fin_borrar_memoria
;tecla cancelar
goto reset_memory
;tecla aceptar
revisar_tecla
;si es una tecla numerica primero se revisa si
btfsc lim_tec,1
;se han insertado las decenas del producto
goto enviar_decena
movf rtecla,w
;en el caso que si, se escribe la unidad del
addlw 0x30
;producto
movwf letra
call escribir_LCD
call RS0
movlw 0x89
;ponemos el cursor en el espacio 10 de la 2 linea
movwf letra
call escribir_LCD
call RS1
movf decena,w
addwf rtecla,w
;sumams las decenas del producto a la unidad
movwf DIREC
;y guardamos en DIREC que nos servir para buscar
clrf tapreta
;el precio en la EEPROM se inicializan los
clrf lim_tec
;registros
bsf prod_elegido,0
call EE_LEE
;se busca precio en EEPROM
movf DATO,w
call pasar_a_LCD ;se escribi precio en EEPROM
bsf esp_prec,0
return
enviar_decena
clrf tapreta
btfsc rtecla,2
;si la tecla es mayor de 4 cancelamos
return
btfsc rtecla,3
;si la tecla es 8 o 9 cancelamos
return
call RS1
bcf modo_envio,0
movf rtecla,w
;escibimos la decena del dislay
movwf num_prod
addlw 0x30
movwf letra
call escribir_LCD
buc_decenas
movf rtecla,w
btfsc STATUS,Z
goto escribe_0

;bucle para calcular las decenas


;revisamos si es la tecla 0

LXXVII

Anexo

Programa ASM prctica 2


movlw 0x10
;sumamos 10 para convertir a decenas
addwf decena
movlw 0x1
subwf rtecla
btfss STATUS,Z
goto buc_decenas
bcf lim_tec,1
clrf tapreta
return

escribe_0
clrf tapreta
movlw 1
subwf lim_tec

;ponemos a 0 el registro tecla apretada


;para sig. tecla
;quitamos 1 al limite de tecla para saber q la
;siguiente es las unidades

return
;-------------------------------------------------------------------------enviar_RS2
nop
;esto es para enviar losdatos de la EEPROM pero
return
;no se va a hacer en esta practica
;-------------------------------------------------------------------------;Para poner a cero la memoria EEPROM
ini_reset_memory
call limpiar_LCD
call escribir_borrar_memoria
bsf borrar_memoria,0
return
fin_borrar_memoria
call mens_inicio
bcf borrar_memoria,0
return
reset_memory
clrf DIREC
arriba
clrf DATO
;aqu pnemos a 0 todos los valores de
call EE_ESCRIBE
;la EEPROM entre los valores 00 y 39
call RS0
movlw 0xc0
movwf letra
call escribir_LCD
call RS1
movf DIREC,w
call escribir_DIREC
incf DIREC,f
btfsc DIREC,6
goto fin_borrar_memoria
goto arriba
;-------------------------------------------------------------------------;funciones de la EEPROM
EE_ESCRIBE
;con esta escvribimos un valor pasado por el W
movf DATO,w
;en la Direccion psada por el registro DIREC
banksel EEDATA
movwf EEDATA

LXXVIII

Anexo

Programa ASM prctica 2

banksel 0
movf DIREC,w
banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
bcf EECON1,WREN
EE_WAIT btfsc EECON1,WR
goto EE_WAIT
banksel DATO
return
EE_LEE
Registro
movf DIREC,w
banksel EEDATA
movwf EEADR
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movf EEDATA,w
banksel DATO
movwf DATO
return

;leemos el valor de la EEPROM que este en el


;DIREC que le hemos pasado

;devolvemos el valor leido por el registro DATO

;-------------------------------------------------------------------------mens_inicio
call limpiar_LCD
call escribir_PROD
return
escribir_CANCEL
call RS0
movlw 0xc8
movwf letra
call escribir_LCD
call RS1
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x41
movwf letra
call escribir_LCD
movlw 0x4e
movwf letra
call escribir_LCD
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x45

;situamos cursor en espacio 8 de 2 linea

;letra C

;letra A

;letra N

;letra C

;letra E

LXXIX

Anexo

Programa ASM prctica 2


movwf letra
call escribir_LCD
movlw 0x4c
;letra L
movwf letra
call escribir_LCD
return

escribir_DIREC
movwf letraux
clrf digito
call limpiar_LCD
escribir_DIREC2
movlw 0x10
subwf letraux
btfss STATUS,C
goto DIREC_decenas
movlw 1
addwf digito
goto escribir_DIREC2
DIREC_decenas
movlw 0x10
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito

;envio las centenas

DIREC_unidades
movf letraux,w
addlw 0x30
movwf letra
call escribir_LCD
return
escribir_borrar_memoria
movlw 0x42
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x41
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x20
movwf letra

;letra B

;letra O

;letra R

;letra R

;letra A

;letra R

;letra ' '

LXXX

Anexo

Programa ASM prctica 2


call escribir_LCD
movlw 0x4d
movwf letra
call escribir_LCD
movlw 0x45
movwf letra
call escribir_LCD
movlw 0x4d
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x49
movwf letra
call escribir_LCD
movlw 0x41
movwf letra
call escribir_LCD
movlw 0x3f
movwf letra
call escribir_LCD
return

;letra M

;letra E

;letra M

;letra O

;letra R

;letra I

;letra A

;letra ?

escribir_NUE
movlw 0x4e
;letra N
movwf letra
call escribir_LCD
movlw 0x55
;letra U
movwf letra
call escribir_LCD
movlw 0x45
;letra E
movwf letra
call escribir_LCD
return
escribir_PROD
movlw 0x50
movwf letra
call escribir_LCD
movlw 0x52
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x44
movwf letra
call escribir_LCD
movlw 0x20
movwf letra
call escribir_LCD
return

;letra P

;letra R

;letra O

;letra D

;ponemos espacio en blanco

LXXXI

Anexo

Programa ASM prctica 2

clear_display
;funcin para las instruciones de 1,53ms del LCD
banksel TRISB
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
t0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return
escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0
t1
btfsc TMR0,7
goto t1
return
E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,5
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,5
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,4
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,4
return

LXXXII

Anexo

Programa ASM prctica 2

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01
;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return

pasar_a_LCD
;todo lo de abajo es para mostrar precio por el LCD
movwf letraux
clrf digito
b_millares
;esto es para las de
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
;este es solo en caso q sea + de 10 euros
addwf letraux
millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C
goto centenas
movlw 1
addwf digito
goto b_centenas

;calculo las centenas de lo que he metido

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito

LXXXIII

Anexo

b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

Programa ASM prctica 2

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;-------------------------------------------------------------------------retardo
;diferente funciones de retardo de diferentes tiempos
movlw 0x1f ;para hacer pausas durante el programa
movwf ret3
retardo3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1
movwf ret2
retardo1
decf ret1,f
btfsc STATUS,Z
goto retardo3
retardo2
decf ret2,f
btfsc STATUS,Z
goto retardo1
goto retardo2
ret_corto
movlw 0xFF
movwf ret1
movwf ret2
r1c
decf ret1,f
btfsc STATUS,Z
return
r2c
decf ret2,f
btfsc STATUS,Z
goto r2c
movlw 0xff
movwf ret2

LXXXIV

Anexo

Programa ASM prctica 2


goto r1c

retardo_ini
movlw 0x80
movwf TMR0
b_r_ini btfsc TMR0,7
goto b_r_ini
return
end

LXXXV

Anexo

Programa ASM prctica 5

A.2.2. Programa ASM de prctica 5


#include "p16f877.inc"
;etiquetas
CANCELAR
equ 0x4F
;por si cancelas algun paso
ACEPTAR
equ 0xF0
;para aceptar el precio.
INICIO
equ 0xfF
;para iniciar envio
FIN
equ 0x66
;para acabar envio
EDATO
equ 0xAA
;para decir que envio dato
EDIREC
equ 0x55
;para decir que envio direccion
CANC_PRO
equ 0x0F
;lo que enciamos se cancela producto
;registros de proposito general
DATO
equ 0x30
DIREC
equ 0x31
dato_recibido equ 0x32
continuar
equ 0x34
pausa2
equ 0x36
aux
equ 0x37
aux1
equ 0x38
rtecla
equ 0x40
tapreta
equ 0x41
rprecio
equ 0x42
r1
equ 0x43
r2
equ 0x44
mas_fil
equ 0x45
recibido
equ 0x50
ret1
equ 0x51
ret2
equ 0x52
ret3
equ 0x53
digito
equ 0x58
ret
equ 0x59
letra
equ 0x5a
letraux
equ 0x5b
lauxil
equ 0x5c
org 0x0
clrf INTCON
goto inicio
org 0x4
goto INTERRUPT
org 0x5
inicio
call iniciar_LCD
call conf_tec
call conf_mic

;dato de eprom
;direcion eprom
;para saber si se ha recibido el dato por RX.
;otro reg para pausa
;reg auxiliar
;reg auxiliar
;valor de la tecla apretada
;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;donde guardamos el valor de lo q recibimos
;registro para retardo
;registro para retardo
;registro para retardo
;reg aux para el digito a pasar al LCD
;para hacer el retardo
;reg para escribir en LCD
;reg aux para escr precios en LCD
;reg auxiliar para escribir tecla

;deshabilitamos interrupciones para iniciar micro

;cuando se produzca una interrupcin vendr aqui


;comienza el programa aqui
;vamos a rutina para iniciar la pantalla LCD
;vamos a rutina para dar vlaores a las teclas
;vamos a rutina para configurar el micro

buckle
nop
call ver_tecla
btfsc tapreta,0
;mira si hay una tecla apretada para enviar
call mirar_si_envio ; la opcion del teclado si no va a volver a mirar
goto buckle

LXXXVI

Anexo

Programa ASM prctica 5

;rutina para iniciar el LCD


iniciar_LCD
banksel TRISA
movlw 0xF0
movwf TRISC
;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0x07
movwf TRISB
;RB<0:2> entradas RC<3:7> salidas
movlw 0x18
movwf TRISA
;RA<0:2> SALIDAS RA <3:4> entradas
movlw 0x83
;ponemos el pre-escaler a 1:16
movwf OPTION_REG
banksel PORTA
clrf PORTA
;ponemos la instruccin FUCTION SET
call RS0
call E1
movlw 0x02
movwf PORTC
call E0
call retardo
movlw 0x2F
movwf letra
call escribir_LCD
call retardo
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo
call RS1
return
;fin de la inicializacin del LCD
;asignamos cada valor del teclado a un registro
conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xf
;tecla f
movwf 0x23
movlw 4
;tecla 4
movwf 0x24
movlw 5
;tecla 5
movwf 0x25
movlw 6
;tecla 6
movwf 0x26
movlw 0xe
;tecla e
movwf 0x27

LXXXVII

Anexo

Programa ASM prctica 5


movlw 7
movwf 0x28
movlw 8
movwf 0x29
movlw 9
movwf 0x2a
movlw 0xd
movwf 0x2b
movlw 0xa
movwf 0x2c
movlw 0
movwf 0x2d
movlw 0xb
movwf 0x2e
movlw 0xc
movwf 0x2f
return

;tecla 7
;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c

;Configuracion del micro


iniciar_mic
movlw 0xc0
iorwf INTCON,f
movlw 0x90
movwf RCSTA
;RC spen=1 rx9=0 CREN=1
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x07
movwf ADCON1
movwf OPTION_REG
movlw 0x24
movwf TXSTA
;TX tx9=0 txen=1 brgh=1
movlw D'27'
;ponemos el SPBRG=27 que es donde tiene menos error
movwf SPBRG
bsf PIE1,RCIE
;interupccion RX habilitada
bcf PIE1,TXIE
;interupccion TX deshabilitada
banksel PORTC
; banco 0
clrf PORTB
bcf PORTC,4
clrf r1
clrf r2
clrf continuar
bsf continuar,0
clrf tapreta
;inicializa el valor del reg. de valor de tecla
clrf rtecla
;inicializa el valor del reg. de tecla apretada
clrf dato_recibido ;limiamos el registro de si hemos recibido dato.
banksel EECON1
;esto es para configurar la EEPROM
bcf EECON1,EEPGD ;ponemos en modo ecritura de datos
banksel PORTB
;volvemos al primer banco
call mens_inicio
return
;-------------------------------------------------------------------------ver_tecla
movlw 0x01
movwf PORTC
clrf r1

;guardamos 0 en r1 para saber q estamos en la columna 1

LXXXVIII

Anexo

Programa ASM prctica 5


call rev_fila ;vamos a mirar las filas una por una
movlw 0x02
movwf PORTC
movlw 0x04
movwf r1
;guardamos 4 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
movlw 0x04
movwf PORTC
movlw 0x08
movwf r1
;guardamos 8 en r1 para saber q estamos en la columna 3
call rev_fila ;volvemos a mirar filas
movlw 0x08
movwf PORTC
movlw D'12'
movwf r1
;guardamos 12 en r1 para saber q estamos en la columna 4
call rev_fila ;volvemos a mirar filas
return
;volvemos al prinicipio

rev_fila
btfsc tapreta,0
return

;si hay tecla apretada salta para ir mas rapido

clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTA,0

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTA,1

;ponemos el valor 1 para saber q es la fila 2

;volvemos a guardar mascara


;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x02
;guardamos el valor 2 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTA,2
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x03
movwf r2
movlw 0x08

;guardamos el valor 2 para la fila 3

LXXXIX

Anexo

Programa ASM prctica 5


movwf mas_fil
btfsc PORTA,3
call confimar_tecla
return

confimar_tecla
call ret_corto
movlw 0x0F
andwf PORTA,w
xorwf mas_fil,w

btfss STATUS,Z
return

;hacemos una xor entre la mascara guardada y W


;si el resultado es diferente de 1 es q la tecla
;esta pulsada
;para mirarlo si el flag Z del STATUS esta a 0 es q
;la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada


most_num
clrw
addwf r1,w
;sumamos r1 y r2 para despues saber el valor de
addwf r2,w
;la tecla apretada
addlw 0x20
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rtecla
;guardamos el resultado de la tecla
bsf tapreta,0
;poenmos a '1' el bit 0 de tapreta para saber que
;hay 1 tecla apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec movlw 0x0f
andwf PORTA,w
andwf mas_fil,w
btfss STATUS,Z
goto sol_tec
return

;volvemos a utilizar la mascara para saber si la


;tecla sigue apretada
;hasta q el flag Z no este a 1 no saldra del buckle

;-------------------------------------------------------------------------mirar_si_envio
clrf tapreta
movf rtecla,w
;miramos si es la tecla e y sies as enviamos EEPROM
xorlw 0xe
btfsc STATUS,Z
goto enviar_RS2
return
;-------------------------------------------------------------------------enviar_RS2
call limpiar_LCD
;escribimos comunicando en el LCD
call escribir_COMUNICANDO
clrf continuar
movlw INICIO
;pasamos el valor de inicio para
movwf TXREG
;transmitirlo y esperamos respuesta
call esperar_respuesta_inicio
btfss continuar,0
;si la resuesta a sido correcta continua
goto error_transmision
;si no va error de transmision

XC

Anexo

Programa ASM prctica 5

enviar_EEPROM
;iniciamos los registros para enviar las 40
movlw 0x4
;posiciones de memoria
movwf aux
movlw 0xa
movwf aux1
clrf DIREC
goto buc_env_EEPROM1
;saltamos ya que esta todo inicializado
buc_env_EEPROM
;este buckle es para pasar del 9 al 10
decf aux,f
;si se ha llegado a la posicion 40 se manda
btfsc STATUS,Z
;fin de envio
goto fin_envio
movlw 0xa
movwf aux1
movlw 0x6
addwf DIREC,f
buc_env_EEPROM1
;este buckle es para incrementar la posicion de
call EE_LEE
;memoria de 1 en 1 y leer el dato de la EEPROM
call enviar_todo ;y enviar el dato
btfss continuar,0 ;si todoa ido correcto pasa a la siguiente
goto error_transmision ;posicion de memoria de lo contrario va a
incf DIREC,f
;error de transmision
decf aux1,f
btfsc STATUS,Z
;aqui si se han pasado 10 posiciones va a
goto buc_env_EEPROM
;a pasar de la posicion 9 a la 10 por ejemplo
goto buc_env_EEPROM1
;si no va a enviar la siguiente posicin
enviar_todo
;aqu pasamos los dataos para cada direccion
nop
;por orden es primero la peticion de direccion
movlw EDIREC
call mandar_RS2
movf DIREC,w
;despues la direccion a cambiar
call escribir_DIREC
;escribimos la direccion en LCD
movf DIREC,w
call mandar_RS2
movlw EDATO
;despues la peticin del dato
call mandar_RS2
movf DATO,w
;despues el valor de la direccin
call escribir_DATO
;escribimos dicho valor en LCD
movf DATO,w
call mandar_RS2
call retardo_corto_rs232
return
mandar_RS2
;esta funcin es para mandar los datos
movwf TXREG
;que le pasan por el W a traves de la USART
call esperar_respuesta ;aqu esperamos un respuesta
btfss continuar,0
;si todo a sido correcto continua
goto error_transmision ;si no va cancelar la transmision
return
esperar_respuesta_inicio
call retardo_rs232
btfss dato_recibido,0
clrf continuar
clrf dato_recibido
return

;para el caso del inicio ponemos una


;funcin ms que tiene perdida de tiempo
;para ver si comunica con el otro micro

XCI

Anexo

Programa ASM prctica 5

esperar_respuesta
;esta funcion es como la anterior pero sin
btfss dato_recibido,0
;la espera
goto esperar_respuesta
clrf dato_recibido
return
error_transmision
call escribir_CANCEL
call retardo
movlw CANCELAR
movwf TXREG
movlw 1
movwf aux
movwf aux1
clrf continuar
call mens_inicio
clrf tapreta
goto L1

;en el caso de producirse un error en


;la tranmision escribe CANCEL en el LCD
;e inicializa registros para continuar
;haciendo lo que se le pida

fin_envio
btfss continuar,0
goto sig
movlw FIN
movwf TXREG
call escribir_OK
call retardo
call mens_inicio
sig
bsf continuar,0
return

;cuando se termina de pasar los datos


;al otro micro se le envia este codigo
;para decirle que ya se ha terminado

;-------------------------------------------------------------------------;funciones de la EEPROM
EE_ESCRIBE
;con esta escvribimos un valor pasado por el W
movf DATO,w
;en la Direccion psada por el registro DIREC
banksel EEDATA
movwf EEDATA
banksel 0
movf DIREC,w
banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
bcf EECON1,WREN
EE_WAIT btfsc EECON1,WR
goto EE_WAIT
banksel DATO
return

XCII

Anexo

Programa ASM prctica 5

EE_LEE
;leemos el valor de la EEPROM que este en el Registro
movf DIREC,w
;DIREC que le hemos pasado
banksel EEDATA
movwf EEADR
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movf EEDATA,w
banksel DATO
movwf DATO
;devolvemos el valor leido por el registro DATO
return
;------------------------------------------------------------------------mens_inicio
call limpiar_LCD
return
escribir_CANCEL
call RS0
movlw 0xc8
movwf letra
call escribir_LCD
call RS1
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x41
movwf letra
call escribir_LCD
movlw 0x4e
movwf letra
call escribir_LCD
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x45
movwf letra
call escribir_LCD
movlw 0x4c
movwf letra
call escribir_LCD
return

;situamos cursor en espacio 8 de 2 linea

;letra C

;letra A

;letra N

;letra C

;letra E

;letra L

escribir_DIREC
;funcion para escribir la direccion del dato a enviar
movwf letraux
;inicializamos registros
clrf digito
call limpiar_LCD
escribir_DIREC2
;aqu camos restando 10 a la direccion dada
movlw 0x10
;cuando salga negativo el valor es que ya a
subwf letraux
;terminado y por digito pasremos el valor a
btfss STATUS,C
;escribir en el LCD
goto DIREC_decenas
movlw 1
addwf digito
goto escribir_DIREC2

XCIII

Anexo
DIREC_decenas
movlw 0x10
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
DIREC_unidades
movf letraux,w
addlw 0x30
movwf letra
call escribir_LCD
return

Programa ASM prctica 5


;envio las dentenas
;incrementamos en 10 el reg auxiliar para
;tener el valor real y escribimos el valor
;de digito en la pantalla LCD

;ahora en escribimos el valor del reg. Aux.


;que sern la unidades de la direccion a
;a enviar

escribir_DATO
call RS0
movlw 0x87
movwf letra
call escribir_LCD
call RS1
movf DATO,w
call pasar_a_LCD
return

;ahora pasamos el valor del dato de la


;direccion a enviar primero situamos el cursor
;y despues vamos a a funcion de escribir
;un precio en la pantalla

escribir_OK
call RS0
movlw 0xc8
movwf letra
call escribir_LCD
call RS1
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x4b
movwf letra
call escribir_LCD
return

;esto es si todo ha ido bien nos pone en la pantalla


;OK para saberlo
;situamos cursor en espacio 8 de la 2 linea del LCD

escribir_COMUNICANDO
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x4d
movwf letra
call escribir_LCD
movlw 0x55
movwf letra
call escribir_LCD
movlw 0x4E
movwf letra
call escribir_LCD
movlw 0x49

;letra O

;letra K

;cuando iniciamos la comunicacin sacamos este mens.


;letra C

;letra O

;letra M

;letra U

;letra N

;letra I

XCIV

Anexo

Programa ASM prctica 5


movwf letra
call escribir_LCD
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x41
movwf letra
call escribir_LCD
movlw 0x4E
movwf letra
call escribir_LCD
movlw 0x44
movwf letra
call escribir_LCD
movlw 0x4F
movwf letra
call escribir_LCD
return

;letra C

;letra A

;letra N

;letra D

;letra O

clear_display
;funcin para las instruciones de 1,53ms de la
banksel TRISB
;pantalla de LCD
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
t0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return
escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC

XCV

Anexo

t1

Programa ASM prctica 5


movwf TMR0
btfsc TMR0,7
goto t1
return

E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,5
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,5
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,4
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,4
return

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01
;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return
pasar_a_LCD
movwf letraux
clrf digito
b_millares
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
addwf letraux

;todo lo de abajo es para mostrar precio por el LCD

;este es solo en caso q sea + de 10 euros

millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C
goto centenas
movlw 1
addwf digito

;calculo las centenas de lo que he metido

XCVI

Anexo

Programa ASM prctica 5


goto b_centenas

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito
b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;-------------------------------------------------------------------------INTERRUPT
;funcion de interupcion
banksel 0
L1
btfss PIR1,RCIF
;revisamos si es por recepcin si no salimos
goto L2
btfss RCSTA,2
goto ER1
movf RCREG,F
goto L1
ER1

;miramos si hay error de framing si no continua


;si lo hay leemos RCREG y volvemos a ver siguiene
;dato

btfss RCSTA,1
;miramos si hay error de overflow si no vamos a
goto ver_recibido ;leer datorecibido de lo contrario ponemos CREN a
bcf RCSTA,4
;1 y luego volvemos a poner a 0
bsf RCSTA,4
goto L1

ver_recibido
movf RCREG,w

;pasamos el valor recibido al registro recibido

XCVII

Anexo

Programa ASM prctica 5


movwf recibido
btfss recibido,6 ;miramos si el bit 6 de lo recibido esta a 1
goto int_producto ;si es as es que pregutna o pide producto
andlw 0x0f
;de lo contrario es una respuesta a lo enviado
btfss STATUS,Z
;por nosotros si aqu el bit Z de status esta
goto cancelar_precio ;activado es que todo va bien de lo contarario
goto aceptar_precio ;es que a habido algn fallo y vamos a cancelar

int_producto
btfss recibido,7 ;dependiendo del bit 7 de lo recibido abemos si
goto preg_prod
;esta pidendo o preguntando por un producto
goto pedir_prod
pedir_prod
bsf PORTC,4
movf recibido,w
movwf aux
andlw 0x0f
movwf PORTB
movf aux,w
andlw 0xF0
movwf PORTA
call retardo
bcf PORTC,4
clrf PORTB
movlw 0xf
iorwf PORTA,f
goto L1

;si pide producto vendr a esta funcin


;activaremos el LED de dar producto
;pasaremoslos cuatro bits de menos peso
;al portb para escribir la unidad del producto
;en el display de 7 segmentos

;y los cuatro de ms peso al porta para escribir


;las decenas del producto a dar
;hacemos pausa par poder ver lo que pasa
;apagomos el LED
;y limpiamos los puertos para dejar todo como
;estaba antes

preg_prod
call RX
btfss PORTC,5
goto no_producto
goto si_producto

;aqui preguntamos si hay producto


;vamos a escribir el numero del producto en el
;display de 7 segementos y testeamos el interruptor
;de portc5 si esta a 1 es quehay producto y de lo
;contrario es queno hay producto

RX

;pasamos el valor recibido a porta y portb para


;sacarlo por display 7 segmentos

movf recibido,w
andlw 0x0f
movwf PORTB
movf recibido,w
andlw 0xF0
movwf PORTA
call retardo
return

no_producto
movlw CANC_PRO
movwf TXREG
clrf PORTB
clrf PORTA
goto L1
si_producto
movlw 0xF0
movwf TXREG
clrf PORTA
clrf PORTB

;hacemos pausa para poder verlo

;si no hay producto enviamos al otro micro la seal


;de que no hay producto
;limpiamos porta y portb

;enviamos la seal de que hay producto


;limpiamos porta y portb

XCVIII

Anexo

Programa ASM prctica 5


bcf PORTC,4
goto L1

aceptar_precio
;si hemos recibido la seal e todo esta bien
bsf continuar,0
;en el envio de la EEPROM activamos continuar
bsf dato_recibido,0 ;y recibido
goto L1
cancelar_precio
;si hemos recibido la seal de error activamos
bcf continuar,0
;recibido pero ponemos a 0 el reg. continuar
bsf dato_recibido,0
goto L1
;----------------------------------------------retardo
;diferentes retardos para diferentes pausas
movlw 0x1f
;utilizadas durante la ejecucion
movwf ret3
retardo3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1
movwf ret2
retardo1
decf ret1,f
btfsc STATUS,Z
goto retardo3
retardo2
decf ret2,f
btfsc STATUS,Z
goto retardo1
goto retardo2
ret_corto
movlw 0xFF
movwf ret1
movwf ret2
r1c
decf ret1,f
btfsc STATUS,Z
return
r2c
decf ret2,f
btfsc STATUS,Z
goto r2c
movlw 0xff
movwf ret2
goto r1c
retardo_rs232
movlw 0x10
movwf ret3
retardo_rs3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1

XCIX

Anexo

Programa ASM prctica 5

movwf ret2
retardo_rs1
decf ret1,f
btfsc STATUS,Z
goto retardo_rs3
retardo_rs2
decf ret2,f
btfsc STATUS,Z
goto retardo_rs1
goto retardo_rs2
retardo_corto_rs232
movlw 0x3
movwf ret3
retardo_c_rs3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1
movwf ret2
retardo_c_rs1
decf ret1,f
btfsc STATUS,Z
goto retardo_c_rs3
retardo_c_rs2
decf ret2,f
btfsc STATUS,Z
goto retardo_c_rs1
goto retardo_c_rs2
L2

retfie
end

Anexo

Programa ASM del Mdulo 2 completo

A.2.3. Programa ASM del Mdulo 2 completo


#include "p16f877.inc"
;etiquetas
CANCELAR
equ 0x4F
;por si cancelas algun paso
ACEPTAR
equ 0xF0
;para aceptar el precio.
INICIO
equ 0xfF
;para iniciar envio
FIN
equ 0x66
;para acabar envio
EDATO
equ 0xAA
;para decir que envio dato
EDIREC
equ 0x55
;para decir que envio direccion
CANC_PRO
equ 0x0F
;lo que enciamos se cancela producto
;registros de proposito general
DATO
equ 0x30
DIREC
equ 0x31
dato_recibido equ 0x32
modo_envio equ 0x33
continuar
equ 0x34
decena
equ 0x35
pausa2
equ 0x36
aux
equ 0x37
aux1
equ 0x38
rtecla
equ 0x40
tapreta
equ 0x41
rprecio
equ 0x42
r1
equ 0x43
r2
equ 0x44
mas_fil
equ 0x45
recibido
equ 0x50
ret1
equ 0x51
ret2
equ 0x52
ret3
equ 0x53
lim_tec
equ 0x54

;dato de eprom
;direcion eprom
;para saber si se ha recibido el dato por RX.
;para pasar a modo de envio de la EEPROM

;para guardar las decenas del producto selec.


;otro reg para pausa
;reg auxiliar
;reg auxiliar
;valor de la tecla apretada
;ponemos a '1' si la tecla a sido apretada
;precio producto
;Guardamos la columna elegida
;guardamos la fila elegida
;se guarda la mascara de la fila
;donde guardamos el valor de lo q recibimos
;registro para retardo
;registro para retardo
;registro para retardo
;registro para saber q tiene q detectar 2 teclas en
;producto
num_prod
equ 0x55
;registro producto seleccionado
rmonaux
equ 0x56
;reg para calcular las decenas en precio
pagado
equ 0x57
;reg de la cantidad pagada
digito
equ 0x58
;reg aux para el digito a pasar al LCD
ret
equ 0x59
;para hacer el retardo
letra
equ 0x5a
;reg para escribir en LCD
letraux
equ 0x5b
;reg aux para escr precios en LCD
lauxil
equ 0x5c
;reg auxiliar para escribir tecla
esp_prec
equ 0x5d
;para saber si hemos insertado el producto
prod_elegido equ 0x5e
;reg para elegir el producto
precio_actual equ 0x5f ;donde guardamos el precio introducido
borrar_memoria equ 0x46 ;para saber si queremos borrar a memoria o no.
org 0x0
clrf INTCON
goto inicio
org 0x4
goto INTERRUPT

;deshabilitamos interrupciones para iniciar micro

;cuando se produzca una interrupcin vendr aqui

CI

Anexo
org 0x5
inicio
call iniciar_LCD
call conf_tec
call conf_mic
buckle
nop
call ver_tecla
btfsc tapreta,0
call mod_precio
goto buckle

Programa ASM del Mdulo 2 completo


;comienza el programa aqui
;vamos a rutina para iniciar la pantalla LCD
;vamos a rutina para dar vlaores a las teclas
;vamos a rutina para configurar el micro

;mira si hay una tecla apretada y si no es asi m


;la ocion del teclado si no va a volver a mirar el
;LCD

;rutina para iniciar el LCD


iniciar_LCD
banksel TRISA
movlw 0xe0
movwf TRISC
;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX
movlw 0xc0
movwf TRISB
;RB<0:2> entradas RC<3:7> salidas
movlw 0x0f
movwf TRISA
;RA SALIDAS
movlw 0x03
;pre-escaler a 1:16
movwf OPTION_REG
banksel PORTA
movf PORTA,W
;ponemos la instruccin FUCTION SET
andlw 0XF
movwf PORTA
call RS0
call E1
movlw 0x02
movwf PORTC
call retardo_ini
call E0
movlw 0x2F
movwf letra
call escribir_LCD
call retardo_ini
movlw 0x0f
;ponemos la instruccin DISPLAY ON/OFF control
movwf letra
call escribir_LCD
call retardo_ini
movlw 0x01
;ponemos la instruccin CLEAR_DISPLAY
movwf letra
call clear_display
call retardo_ini
call RS0
;ponemos la instruccin ENTRY MODE SET
movlw 0x06
movwf letra
call escribir_LCD
call retardo_ini
call RS1
return
;fin de la inicializacin del LCD

CII

Anexo

Programa ASM del Mdulo 2 completo

;asignamos cada valor del teclado a un registro


conf_tec
movlw 1
;tecla 1
movwf 0x20
movlw 2
;tecla 2
movwf 0x21
movlw 3
;tecla 3
movwf 0x22
movlw 0xf
;tecla f
movwf 0x23
movlw 4
;tecla 4
movwf 0x24
movlw 5
;tecla 5
movwf 0x25
movlw 6
;tecla 6
movwf 0x26
movlw 0xe
;tecla e
movwf 0x27
movlw 7
;tecla 7
movwf 0x28
movlw 8
;tecla 8
movwf 0x29
movlw 9
;tecla 9
movwf 0x2a
movlw 0xd
;tecla d
movwf 0x2b
movlw 0xa
;tecla a
movwf 0x2c
movlw 0
;tecla 0
movwf 0x2d
movlw 0xb
;tecla b
movwf 0x2e
movlw 0xc
;tecla c
movwf 0x2f
return
;Configuracion del micro
iniciar_mic
movlw 0xc0
iorwf INTCON,f
movlw 0x90
movwf RCSTA
;RC spen=1 rx9=0 CREN=1
banksel ADCON1
;cogemos el banco de memoria 1
movlw 0x07
movwf ADCON1
movwf OPTION_REG
movlw 0x24
movwf TXSTA
;TX tx9=0 txen=1 brgh=1
movlw D'27'
;ponemos el SPBRG=27 que es donde tiene menos error
movwf SPBRG
bsf PIE1,RCIE
;interupccion RX habilitada
bcf PIE1,TXIE
;interupccion TX deshabilitada
banksel PORTC
; banco 0
clrf PORTB
bcf PORTC,4
clrf r1
clrf r2

CIII

Anexo

Programa ASM del Mdulo 2 completo


clrf continuar
bsf continuar,0
clrf tapreta
;inicializa el valor del reg. de valor de tecla
clrf rtecla
;inicializa el valor del reg. de tecla apretada
clrf rprecio
;inicializamos el valor del registro de precio
clrf dato_recibido ;limiamos el registro de si hemos recibido dato
clrf num_prod
clrf decena
clrf borrar_memoria
clrf lim_tec
bsf lim_tec,1
;iniciamos lim_tec a 2
clrf esp_prec
bsf modo_envio,0
clrf prod_elegido
banksel EECON1
;esto es para configurar la EEPROM
bcf EECON1,EEPGD ;ponemos en modo ecritura de datos
banksel PORTB
;volvemos al primer banco
call mens_inicio
return

;-------------------------------------------------------------------------ver_tecla
movlw 0x01
movwf PORTC
clrf r1
;guardamos 0 en r1 para saber q estamos en la columna 1
call rev_fila ;vamos a mirar las filas una por una
movlw 0x02
movwf PORTC
movlw 0x04
movwf r1
;guardamos 4 en r1 para saber q estamos en la columna 2
call rev_fila ;volvemos a mirar filas
movlw 0x04
movwf PORTC
movlw 0x08
movwf r1
;guardamos 8 en r1 para saber q estamos en la columna 3
call rev_fila ;volvemos a mirar filas
movlw 0x08
movwf PORTC
movlw D'12'
movwf r1
;guardamos 12 en r1 para saber q estamos en la columna 4
call rev_fila ;volvemos a mirar filas
return
;volvemos al prinicipio
rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTA,0

;si hay tecla apretada salta para ir mas rapido

;ponemos 0 para saber que es la fila 1

;guardamos mascara para comprobar despues


;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido

CIV

Anexo

Programa ASM del Mdulo 2 completo


return
movlw
movwf
movlw
movwf
btfsc

0x01
r2
0x02
mas_fil
PORTA,1

;ponemos el valor 1 para saber q es la fila 2

;volvemos a guardar mascara


;comprobamos bit 1 para saber
;si la tecla de la fila esta activada
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return

movlw 0x02
;guardamos el valor 2 para la fila 3
movwf r2
movlw 0x04
movwf mas_fil
btfsc PORTA,2
call confimar_tecla
btfsc tapreta,0
;si hay tecla apretada salta para ir mas rapido
return
movlw 0x03
;guardamos el valor 2 para la fila 3
movwf r2
movlw 0x08
movwf mas_fil
btfsc PORTA,3
call confimar_tecla
return
confimar_tecla
call ret_corto
movlw 0x0F
andwf PORTA,w
xorwf mas_fil,w

btfss STATUS,Z
return

;hacemos una xor entre la mascara guardada y W


;si el resultado es diferente de 1 es q la tecla
;esta pulsada
;para mirarlo si el flag Z del STATUS esta a 0 es q
;la tecla se pulso si no es asi seguimos con el
;programa

;aqui calculamos la tecla apretada


most_num
clrw
addwf r1,w
;sumamos r1 y r2 para despues saber el valor de
addwf r2,w
;la tecla apretada
addlw 0x20
movwf FSR
;movemos el valor a FSR para acceso indirecto
movf INDF,w
movwf rtecla
;guardamos el resultado de la tecla
bsf tapreta,0
;poenmos a '1' el bit 0 de tapreta para saber que
;hay 1 tecla apretada
;buckle para saber si la tecla deja de ser apretada
sol_tec
movlw 0x0f
andwf PORTA,w

CV

Anexo

Programa ASM del Mdulo 2 completo


andwf mas_fil,w
btfss STATUS,Z
goto sol_tec
return

;volvemos a utilizar la mascara para saber si la


;tecla sigue apretada
;hasta q el flag Z no este a 1 no saldra del buckle

;-------------------------------------------------------------------------;rutina para modificar precio


mod_precio
clrf tapreta
btfss prod_elegido,0
;si el producto no ha sido elegido vamos a
goto elegir_prod
;elegirlo
el_precio
btfss esp_prec,0
goto siguiente
btfss rtecla,3
goto primera_letra
movlw 0x06
andwf rtecla,w
btfsc STATUS,Z
goto primera_letra
clrf tapreta
btfsc rtecla,2
return
btfss rtecla,0
return
goto cancelar
primera_letra
call RS0
movlw 0xc0
movwf letra
call escribir_LCD
call RS1
call escribir_NUE
bcf esp_prec,0
clrf decena
clrf num_prod

;si es el primer numero del precio salta


;de lo contrario va a siguiente
;miramos si es una tecla entre 0-7

;miramos si es la tecla 8 o 9

;vamos mirando que sea la tecla Cancelar


;por si se cancela el proceso

;ponemos el cursor en la 2 linea

;escribimos NUE antes del precio


;ponemos a 0 esp_prec para poder apretar
;la tecla cancelar

siguiente

;es igual que el precio pero con la posibilidad de la tecla


;ACEPTAR
movf rtecla,w
btfss rtecla,3
;no saltamos si es tecla 0,1,2,3,4,5,6 o 7
goto rev_precio
andlw 0x6
btfsc STATUS,Z
;no saltamos si es tecla 8 o 9
goto rev_precio
btfsc rtecla,2
;no saltamos si es tecla C,D,E o F
goto err_tecla
btfss rtecla,0
;no saltamos si es tecla A
goto aceptar
goto cancelar
;tiene q ser la tecla B

err_tecla
clrf tapreta
return

;ene l caso de que haya pulsado una tecla


;que no tocaba se limpia el regisrtro de tecla
;apretada y se vuelve a esperar otra

CVI

Anexo

Programa ASM del Mdulo 2 completo

cancelar
;aqui inicializamos los registros para empezar
clrf DIREC
;de nuevo
movlw 0x02
movwf lim_tec
call iniciar_regs
bsf esp_prec,0
bsf modo_envio,0
clrf prod_elegido
call escribir_CANCEL
call retardo
call mens_inicio
return
aceptar
;en esta funcin pasamos el valor del precio
movf precio_actual,w
movwf DATO
;en la direccin guardada y se va a la funcin
movlw 0x02
;de escibir en la eeprom
movwf lim_tec
call EE_ESCRIBE
call iniciar_regs
call RS0
;ponemos cursor en pos 8 de 2 linea de LCD
movlw 0xc9
movwf letra
call escribir_LCD
call RS1
movf DATO,w
;escribimos en LCd el precio insertado en EEPROM
call pasar_a_LCD
call retardo
call mens_inicio ;vamos a inicializar la panatalla LCD y se inician
bsf esp_prec,0
;los registros para empezar de nuevo
bsf modo_envio,0
clrf prod_elegido
return
iniciar_regs
clrf num_prod
clrf decena
clrf tapreta
return
rev_precio
;esto es para seleccionar el precio
movf rtecla,w
;lo unico que hacemos es leer la tecla
addlw 0x30
;escribirla en el LCD
movwf letra
movf decena,w
addwf rtecla,w
movwf rtecla
btfsc STATUS,Z
;revisamos si es 0
goto f_rev_precio
movwf aux
clrf decena
buc_rev_precio
movlw d'10'
addwf decena
decf aux,f

;aqu que es la continuacion multiplica el valor


;del precio por 10 para la siguiente teca que se
;apriete

CVII

Anexo

Programa ASM del Mdulo 2 completo


btfss STATUS,Z
goto buc_rev_precio

f_rev_precio
movf rtecla,w
movwf precio_actual
call escribir_LCD
clrf tapreta
movlw 0x02
movwf lim_tec
return

;finalizamos actualizando los precios


;para la siguiente tecla

;-------------------------------------------------------------------------elegir_prod
btfsc borrar_memoria,0
goto mirar_si_borro
movf rtecla,w
;miramos si no es la tecla acpetar o cancelar
btfss rtecla,3
;si no lo es revisamos la tecla del numero
goto revisar_tecla
andlw 0x6
;miramos si es la tecla 8 o 9
btfsc STATUS,Z
goto revisar_tecla
movf rtecla,w
btfsc rtecla,2
goto mirar_si_envio
btfsc rtecla,0
;si es la tecla B se cancela el proceso
goto cancelar
return
mirar_si_envio
btfss modo_envio,0
return
btfss rtecla,1
return
btfss rtecla,0
goto enviar_RS2
goto ini_reset_memory

;esto para ver si es la tecla envir


;o borrar la memoria

mirar_si_borro
;si se ha seleccionado borrar la memoria
btfss rtecla,3
;solo podemos apretar la tecla aceptar y
return
;cancelar
btfsc rtecla,2
return
btfss rtecla,1
return
btfsc rtecla,0
goto fin_borrar_memoria
;tecla cancelar
goto reset_memory
;tecla aceptar
revisar_tecla
;si es una tecla numerica primero se revisa si
btfsc lim_tec,1
;se han insertado las decenas del producto
goto enviar_decena
movf rtecla,w
;en el caso que si, se escribe la unidad del
addlw 0x30
;producto
movwf letra
call escribir_LCD
call RS0

CVIII

Anexo

Programa ASM del Mdulo 2 completo


movlw 0x89
;ponemos el cursor en el espacio 10 de la 2 linea
movwf letra
call escribir_LCD
call RS1
movf decena,w
addwf rtecla,w
;sumams las decenas del producto a la unidad
movwf DIREC
;y guardamos en DIREC que nos servir para buscar
clrf tapreta
;el precio en la EEPROM se inicializan los
clrf lim_tec
;registros
bsf prod_elegido,0
bsf prod_elegido,0
call EE_LEE
;se busca precio en EEPROM
movf DATO,w
call pasar_a_LCD ;se escribi precio en EEPROM
bsf esp_prec,0
return

enviar_decena
clrf tapreta
btfsc rtecla,2
;si la tecla es mayor de 4 cancelamos
return
btfsc rtecla,3
;si la tecla es 8 o 9 cancelamos
return
call RS1
bcf modo_envio,0
movf rtecla,w
;escibimos la decena del dislay
movwf num_prod
addlw 0x30
movwf letra
call escribir_LCD
buc_decenas
;bucle para calcular las decenas
movf rtecla,w
btfsc STATUS,Z
;revisamos si es la tecla 0
goto escribe_0
movlw 0x10
;sumamos 10 para convertir a decenas
addwf decena
movlw 0x1
subwf rtecla
btfss STATUS,Z
goto buc_decenas
bcf lim_tec,1
clrf tapreta
return
escribe_0
clrf tapreta
movlw 1
subwf lim_tec

;ponemos a 0 el registro tecla apretada


;para sig. tecla
;quitamos 1 al limite de tecla para saber q la
;siguiente es las unidades

return
;-------------------------------------------------------------------------Para poner a cero la memoria EEPROM
ini_reset_memory
call limpiar_LCD
call escribir_borrar_memoria

CIX

Anexo

Programa ASM del Mdulo 2 completo


bsf borrar_memoria,0
return

fin_borrar_memoria
call mens_inicio
bcf borrar_memoria,0
return
reset_memory
clrf DIREC
arriba
clrf DATO
;aqu pnemos a 0 todos los valores de
call EE_ESCRIBE
;la EEPROM entre los valores 00 y 39
call RS0
movlw 0xc0
movwf letra
call escribir_LCD
call RS1
movf DIREC,w
call escribir_DIREC
incf DIREC,f
btfsc DIREC,6
goto fin_borrar_memoria
goto arriba
;-------------------------------------------------------------------------enviar_RS2
call limpiar_LCD
;escribimos comunicando en el LCD
call escribir_COMUNICANDO
clrf continuar
movlw INICIO
;pasamos el valor de inicio para
movwf TXREG
;transmitirlo y esperamos respuesta
call esperar_respuesta_inicio
btfss continuar,0
;si la resuesta a sido correcta continua
goto error_transmision
;si no va error de transmision
enviar_EEPROM
;iniciamos los registros para enviar las 40
movlw 0x4
;posiciones de memoria
movwf aux
movlw 0xa
movwf aux1
clrf DIREC
goto buc_env_EEPROM1
;saltamos ya que esta todo inicializado
buc_env_EEPROM
;este buckle es para pasar del 9 al 10
decf aux,f
;si se ha llegado a la posicion 40 se manda
btfsc STATUS,Z
;fin de envio
goto fin_envio
movlw 0xa
movwf aux1
movlw 0x6
addwf DIREC,f
buc_env_EEPROM1
;este buckle es para incrementar la posicion de
call EE_LEE
;memoria de 1 en 1 y leer el dato de la EEPROM
call enviar_todo ;y enviar el dato
btfss continuar,0 ;si todoa ido correcto pasa a la siguiente
goto error_transmision ;posicion de memoria de lo contrario va a

CX

Anexo

Programa ASM del Mdulo 2 completo


incf DIREC,f
decf aux1,f
btfsc STATUS,Z
goto buc_env_EEPROM
goto buc_env_EEPROM1

;error de transmision
;aqui si se han pasado 10 posiciones va a
;a pasar de la posicion 9 a la 10 por ejemplo
;si no va a enviar la siguiente posicin

enviar_todo
;aqu pasamos los dataos para cada direccion
nop
;por orden es primero la peticion de direccion
movlw EDIREC
call mandar_RS2
movf DIREC,w
;despues la direccion a cambiar
call escribir_DIREC
;escribimos la direccion en LCD
movf DIREC,w
call mandar_RS2
movlw EDATO
;despues la peticin del dato
call mandar_RS2
movf DATO,w
;despues el valor de la direccin
call escribir_DATO
;escribimos dicho valor en LCD
movf DATO,w
call mandar_RS2
call retardo_corto_rs232
return
mandar_RS2
;esta funcin es para mandar los datos
movwf TXREG
;que le pasan por el W a traves de la USART
call esperar_respuesta ;aqu esperamos un respuesta
btfss continuar,0
;si todo a sido correcto continua
goto error_transmision ;si no va cancelar la transmision
return
esperar_respuesta_inicio
call retardo_rs232
btfss dato_recibido,0
clrf continuar
clrf dato_recibido
return
esperar_respuesta
btfss dato_recibido,0
goto esperar_respuesta
clrf dato_recibido
return

;para el caso del inicio ponemos una


;funcin ms que tiene perdida de tiempo
;para ver si comunica con el otro micro

;esta funcion es como la anterior pero sin


;la espera

error_transmision
call escribir_CANCEL
call retardo
movlw CANCELAR
movwf TXREG
movlw 1
movwf aux
movwf aux1
clrf continuar
call mens_inicio
clrf tapreta
goto L1

;en el caso de producirse un error en


;la tranmision escribe CANCEL en el LCD
;e inicializa registros para continuar
;haciendo lo que se le pida

fin_envio
btfss continuar,0

;cuando se termina de pasar los datos


;al otro micro se le envia este codigo

CXI

Anexo

sig

Programa ASM del Mdulo 2 completo


goto sig
movlw FIN
movwf TXREG
call escribir_OK
call retardo
call mens_inicio
bsf continuar,0
return

;para decirle que ya se ha terminado

;-------------------------------------------------------------------------;funciones de la EEPROM
EE_ESCRIBE
;con esta escvribimos un valor pasado por el W
movf DATO,w
;en la Direccion psada por el registro DIREC
banksel EEDATA
movwf EEDATA
banksel 0
movf DIREC,w
banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1,WREN
bcf INTCON,GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bsf INTCON,GIE
bcf EECON1,WREN
EE_WAIT btfsc EECON1,WR
goto EE_WAIT
banksel DATO
return

EE_LEE
;leemos el valor de la EEPROM que este en el Registro
movf DIREC,w
;DIREC que le hemos pasado
banksel EEDATA
movwf EEADR
banksel EECON1
bsf EECON1,RD
banksel EEDATA
movf EEDATA,w
banksel DATO
movwf DATO
;devolvemos el valor leido por el registro DATO
return
;-------------------------------------------------------------------------mens_inicio
call limpiar_LCD
call escribir_PROD
return
escribir_CANCEL
call RS0
movlw 0xc8 ;situamos cursor en espacio 8 de 2 linea
movwf letra

CXII

Anexo

Programa ASM del Mdulo 2 completo


call escribir_LCD
call RS1
movlw 0x43 ;letra
movwf letra
call escribir_LCD
movlw 0x41 ;letra
movwf letra
call escribir_LCD
movlw 0x4e ;letra
movwf letra
call escribir_LCD
movlw 0x43 ;letra
movwf letra
call escribir_LCD
movlw 0x45 ;letra
movwf letra
call escribir_LCD
movlw 0x4c ;letra
movwf letra
call escribir_LCD
return

escribir_borrar_memoria
movlw 0x42 ;letra
movwf letra
call escribir_LCD
movlw 0x4f ;letra
movwf letra
call escribir_LCD
movlw 0x52 ;letra
movwf letra
call escribir_LCD
movlw 0x52 ;letra
movwf letra
call escribir_LCD
movlw 0x41 ;letra
movwf letra
call escribir_LCD
movlw 0x52 ;letra
movwf letra
call escribir_LCD
movlw 0x20 ;letra
movwf letra
call escribir_LCD
movlw 0x4d ;letra
movwf letra
call escribir_LCD
movlw 0x45 ;letra
movwf letra
call escribir_LCD
movlw 0x4d ;letra
movwf letra
call escribir_LCD
movlw 0x4f ;letra
movwf letra
call escribir_LCD
movlw 0x52 ;letra

' '

CXIII

Anexo

Programa ASM del Mdulo 2 completo


movwf letra
call escribir_LCD
movlw 0x49 ;letra I
movwf letra
call escribir_LCD
movlw 0x41 ;letra A
movwf letra
call escribir_LCD
movlw 0x3f ;letra ?
movwf letra
call escribir_LCD
return

escribir_DIREC
;funcion para escribir la direccion del dato a enviar
movwf letraux
;inicializamos registros
clrf digito
call limpiar_LCD
escribir_DIREC2
;aqu camos restando 10 a la direccion dada
movlw 0x10
;cuando salga negativo el valor es que ya a
subwf letraux
;terminado y por digito pasremos el valor a
btfss STATUS,C
;escribir en el LCD
goto DIREC_decenas
movlw 1
addwf digito
goto escribir_DIREC2
DIREC_decenas
movlw 0x10
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
DIREC_unidades
movf letraux,w
addlw 0x30
movwf letra
call escribir_LCD
return
escribir_DATO
call RS0
movlw 0x87
movwf letra
call escribir_LCD
call RS1
movf DATO,w
call pasar_a_LCD
return

;envio las dentenas


;incrementamos en 10 el reg auxiliar para
;tener el valor real y escribimos el valor
;de digito en la pantalla LCD

;ahora en escribimos el valor del reg. Aux.


;que sern la unidades de la direccion a
;a enviar

;ahora pasamos el valor del dato de la


;direccion a enviar primero situamos el cursor
;y despues vamos a a funcion de escribir
;un precio en la pantalla

escribir_PROD
movlw 0x50
;letra P
movwf letra
call escribir_LCD
movlw 0x52
;letra R

CXIV

Anexo

Programa ASM del Mdulo 2 completo


movwf letra
call escribir_LCD
movlw 0x4f
;letra O
movwf letra
call escribir_LCD
movlw 0x44
;letra D
movwf letra
call escribir_LCD
movlw 0x20
;ponemos espacio en blanco
movwf letra
call escribir_LCD
return

escribir_NUE
movlw 0x4e
;letra N
movwf letra
call escribir_LCD
movlw 0x55
;letra U
movwf letra
call escribir_LCD
movlw 0x45
;letra E
movwf letra
call escribir_LCD
return
escribir_OK
call RS0
movlw 0xc8
movwf letra
call escribir_LCD
call RS1
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x4b
movwf letra
call escribir_LCD
return
escribir_COMUNICANDO
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x4f
movwf letra
call escribir_LCD
movlw 0x4d
movwf letra
call escribir_LCD
movlw 0x55
movwf letra
call escribir_LCD
movlw 0x4E
movwf letra
call escribir_LCD
movlw 0x49
movwf letra

;esto es si todo ha ido bien nos pone en la pantalla


;OK para saberlo
;situamos cursor en espacio 8 de la 2 linea del LCD

;letra O

;letra K

;cuando iniciamos la comunicacin sacamos este mens


;letra C

;letra O

;letra M

;letra U

;letra N

;letra I

CXV

Anexo

Programa ASM del Mdulo 2 completo


call escribir_LCD
movlw 0x43
movwf letra
call escribir_LCD
movlw 0x41
movwf letra
call escribir_LCD
movlw 0x4E
movwf letra
call escribir_LCD
movlw 0x44
movwf letra
call escribir_LCD
movlw 0x4F
movwf letra
call escribir_LCD
return

;letra C

;letra A

;letra N

;letra D

;letra O

clear_display
;funcin para las instruciones de 1,53ms de la
banksel TRISB
;pantalla de LCD
movlw 0x87
movwf OPTION_REG
banksel PORTA
call RS0
call E1
clrf PORTC
call E0
call E1
movf letra,w
movwf PORTC
call E0
movlw 0x80
movwf TMR0
t0
btfsc TMR0,7
goto t0
call RS1
banksel TRISA
movlw 0x83
movwf OPTION_REG
banksel PORTA
return
escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
movwf lauxil
swapf lauxil,w
movwf PORTC
call E0
call E1
movlw 0x0f
andwf letra,w
movwf PORTC
call E0
movlw 0xFC
movwf TMR0

CXVI

Anexo
t1

Programa ASM del Mdulo 2 completo


btfsc TMR0,7
goto t1
return

E0

;funcin para poner la entrada E del LCD a '0'


bcf PORTB,5
return

E1

;funcin para poner la entrada E del LCD a '1'


bsf PORTB,5
return

RS0

;funcin para poner la entrada RS del LCD a '0'


bcf PORTB,4
return

RS1

;funcin para poner la entrada RS del LCD a '1'


bsf PORTB,4
return

limpiar_LCD
;funcin para dejar la pantalla sin nada
call RS0
;aqui hariamos un RETURN HOME
movlw 0x02
movwf letra
call clear_display
movlw 0x01
;aqui harimaos un CLEAR DISPLAY
movwf letra
call clear_display
return
pasar_a_LCD
movwf letraux
clrf digito
b_millares
movlw D'200'
subwf letraux
btfss STATUS,C
goto millar_no
movlw 1
addwf digito
goto millar_si
millar_no
movlw D'200'
addwf letraux

;todo lo de abajo es para mostrar precio por el LCD

;este es solo en caso q sea + de 10 euros

millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C
goto centenas
movlw 1
addwf digito
goto b_centenas

;calculo las centenas de lo que he metido

CXVII

Anexo

Programa ASM del Mdulo 2 completo

centenas
;envio las centenas
movlw D'20'
addwf letraux
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
movlw 0x2c
;escribo una coma para separar euros de centimos
movwf letra
call escribir_LCD
clrf digito
b_decenas
movlw D'2'
subwf letraux
btfss STATUS,C
goto unidades
movlw 1
addwf digito
goto b_decenas

;y calculo decenas

unidades
movf digito,w
;envio decenas
addlw 0x30
movwf letra
call escribir_LCD
movlw D'2'
addwf letraux
movlw 0x30
btfsc letraux,0
;calculo y envio unidades
movlw 0x35
movwf letra
call escribir_LCD
clrf letraux
return
;-------------------------------------------------------------------------INTERRUPT
;funcion de interupcion
banksel 0
L1
btfss PIR1,RCIF
;revisamos si es por recepcin si no salimos
goto L2
btfss RCSTA,2
goto ER1
movf RCREG,F
goto L1
ER1

;miramos si hay error de framing si no continua


;si lo hay leemos RCREG y volvemos a ver siguiene
;dato

btfss RCSTA,1
;miramos si hay error de overflow si no vamos a
goto ver_recibido ;leer datorecibido de lo contrario ponemos CREN a
bcf RCSTA,4
;1 y luego volvemos a poner a 0
bsf RCSTA,4
goto L1

ver_recibido
movf RCREG,w
movwf recibido

;pasamos el valor recibido al registro recibido

CXVIII

Anexo

Programa ASM del Mdulo 2 completo


btfss recibido,6 ;miramos si el bit 6 de lo recibido esta a 1
goto int_producto ;si es as es que pregutna o pide producto
andlw 0x0f
;de lo contrario es una respuesta a lo enviado
btfss STATUS,Z
;por nosotros si aqu el bit Z de status esta
goto cancelar_precio ;activado es que todo va bien de lo contarario
goto aceptar_precio ;es que a habido algn fallo y vamos a cancelar

int_producto
btfss recibido,7 ;dependiendo del bit 7 de lo recibido abemos si
goto preg_prod
;esta pidendo o preguntando por un producto
goto pedir_prod
pedir_prod
bsf PORTC,4
movf recibido,w
movwf aux
andlw 0x0f
movwf PORTB
movf aux,w
andlw 0xF0
movwf PORTA
call retardo
bcf PORTC,4
clrf PORTB
movlw 0xf
iorwf PORTA,f
goto L1

;si pide producto vendr a esta funcin


;activaremos el LED de dar producto
;pasaremoslos cuatro bits de menos peso
;al portb para escribir la unidad del producto
;en el display de 7 segmentos

;y los cuatro de ms peso al porta para escribir


;las decenas del producto a dar
;hacemos pausa par poder ver lo que pasa
;apagomos el LED
;y limpiamos los puertos para dejar todo como
;estaba antes

preg_prod
call RX
btfss PORTC,5
goto no_producto
goto si_producto

;aqui preguntamos si hay producto


;vamos a escribir el numero del producto en el
;display de 7 segementos y testeamos el interruptor
;de portc5 si esta a 1 es quehay producto y de lo
;contrario es queno hay producto

RX

;pasamos el valor recibido a porta y portb para


;sacarlo por display 7 segmentos

movf recibido,w
andlw 0x0f
movwf PORTB
movf recibido,w
andlw 0xF0
movwf PORTA
call retardo
return

no_producto
movlw CANC_PRO
movwf TXREG
clrf PORTB
clrf PORTA
goto L1
si_producto
movlw 0xF0
movwf TXREG
clrf PORTA
clrf PORTB
bcf PORTC,4

;hacemos pausa para poder verlo

;si no hay producto enviamos al otro micro la seal


;de que no hay producto
;limpiamos porta y portb

;enviamos la seal de que hay producto


;limpiamos porta y portb

CXIX

Anexo

Programa ASM del Mdulo 2 completo


goto L1

aceptar_precio
;si hemos recibido la seal e todo esta bien
bsf continuar,0
;en el envio de la EEPROM activamos continuar
bsf dato_recibido,0 ;y recibido
goto L1
cancelar_precio
;si hemos recibido la seal de error activamos
bcf continuar,0
;recibido pero ponemos a 0 el reg. continuar
bsf dato_recibido,0
goto L1
;----------------------------------------------retardo
;diferentes retardos para diferentes pausas
movlw 0x1f
;utilizadas durante la ejecucion
movwf ret3
retardo3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1
movwf ret2
retardo1
decf ret1,f
btfsc STATUS,Z
goto retardo3
retardo2
decf ret2,f
btfsc STATUS,Z
goto retardo1
goto retardo2
ret_corto
movlw 0xFF
movwf ret1
movwf ret2
r1c
decf ret1,f
btfsc STATUS,Z
return
r2c
decf ret2,f
btfsc STATUS,Z
goto r2c
movlw 0xff
movwf ret2
goto r1c
retardo_rs232
movlw 0x10
movwf ret3
retardo_rs3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1

CXX

Anexo

Programa ASM del Mdulo 2 completo

movwf ret2
retardo_rs1
decf ret1,f
btfsc STATUS,Z
goto retardo_rs3
retardo_rs2
decf ret2,f
btfsc STATUS,Z
goto retardo_rs1
goto retardo_rs2
retardo_corto_rs232
movlw 0x3
movwf ret3
retardo_c_rs3
decf ret3,f
btfsc STATUS,Z
return
movlw 0xFF
movwf ret1
movwf ret2
retardo_c_rs1
decf ret1,f
btfsc STATUS,Z
goto retardo_c_rs3
retardo_c_rs2
decf ret2,f
btfsc STATUS,Z
goto retardo_c_rs1
goto retardo_c_rs2
retardo_ini
movlw 0x80
movwf TMR0
b_r_ini btfsc TMR0,7
goto b_r_ini
return
L2

retfie
end

CXXI