Professional Documents
Culture Documents
en mquina de vending
1.- NDICE
2.1. INTRODUCCIN
2.1.1. Antecedentes
2.1.2. Objetivos
2
2
2
4
4
5
5
6
6
6
7
7
7
7
8
8
8
8
8
9
9
10
10
11
13
13
13
13
14
16
16
17
17
18
18
18
19
19
19
19
21
21
21
24
24
25
25
26
27
30
30
31
31
34
36
38
40
42
42
42
43
50
59
69
78
88
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
4.- PRESUPUESTO
107
107
108
108
109
109
109
110
111
112
114
115
115
116
117
117
118
119
119
120
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
127
127
128
129
130
131
132
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:
-
Memoria descriptiva
Solucin adoptada
- Microcontroladores
Memoria descriptiva
Solucin adoptada
Memoria descriptiva
Solucin adoptada
Memoria descriptiva
Solucin adoptada
EEPROM
FLASH
Memoria descriptiva
Solucin adoptada
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
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
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:
11
Memoria descriptiva
Solucin adoptada
12
Memoria descriptiva
Development
Tools
MPLAB IDE
v6.60
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
Memoria descriptiva
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.
14
Memoria descriptiva
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.
15
Memoria descriptiva
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 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
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:
17
Memoria descriptiva
18
Memoria descriptiva
Memoria descriptiva
10
11
12
13
14
15
16
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
39s
20
1.53ms
39s
39s
39s
39s
Memoria descriptiva
Read Busy
Flag and
Addrees
Write Data
To RAM
Read Data
From RAM
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
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
5 CENT
50 CENT
1 EURO
2 EURO
ACEPTAR
CANCELAR
ENVIAR
RESETEAR
ACEPTAR
CANCELAR
22
Memoria descriptiva
4x200O
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
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
24
DISPLAY
Memoria descriptiva
25
Memoria descriptiva
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
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:
27
Memoria descriptiva
El interruptor de Producto
El conector para la comunicacin con el mdulo 1
28
Memoria descriptiva
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
MDULO 1
REGULADOR
DE
TENSIN
CONECTOR
PANTALLA LCD
CONECTOR
TECLADO
PRODUCTO
PIC 16f876
CONECTOR
TECLADO
MONEDAS
DECODIFICADOR
74LS138
MDULO 2
REGULADOR
DE
TENSIN
CONECTOR
PANTALLA LCD
DECODIFICADOR
DE BCD
A 7 SEGMENTOS
7447
Y DIPLAY
PIC 16f876
CONECTOR
TECLADO
PRODUCTO
30
Memoria descriptiva
Descripcin circuital
U1
LM7805CT
J1
Vreg
IN
HDR1X2
LED1
47uF
100nF
C1
C2
OUT
100nF
C3
LED_red
R1
1.0kohm
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
32
Memoria descriptiva
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
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)
RC0/T1OSO/T1CKI 11
E/S
ST
RC1/T1OSI/CCP2
12
E/S
ST
RC2/CCP1
13
E/S
ST
RC3/SCK/SCL
14
E/S
ST
RC4/SDI/SDA
15
E/S
ST
RC5/SDO
16
E/S
ST
33
Memoria descriptiva
Descripcin circuital
RC6/TX/CK
17
E/S
ST
RC7/RX/DT
18
E/S
ST
8,19
20
P
P
Vss
Vdd
(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
MONEDA
NO
CONECTADO
5 CENTIMOS
10 CENTIMOS
20 CENTIMOS
50 CENTIMOS
1 EURO
NO
CONECTADO
NO
CONECTADO
34
Memoria descriptiva
Descripcin circuital
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
35
5V
Memoria descriptiva
Descripcin circuital
36
Memoria descriptiva
Descripcin circuital
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
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
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
38
Memoria descriptiva
Descripcin circuital
RC0
RC1
J1
RC2
RC3
RB0
RB1
RB2
HDR2X5
R3
R1
R2
10kohm
10kohm
10kohm
RC0
RC1
J1
RC2
RC3
RA0
RA1
RA2
RA3
HDR2X5
R3
R1
10kohm 10kohm
R2
R4
10kohm 10kohm
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:
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
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
42
2.6.2.1.
1.1
Prctica nm.1
Monedero
Equipos y materiales:
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
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
Figura 2
45
1.5
Bases tericas
46
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
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
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
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:
10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
2.2
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
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
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
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
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
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
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.
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.
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:
59
3.3
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
Figura 2
61
H09
H19
H29
H39
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
$
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:
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
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
65
3.7
Resumen de objetivos
Que una vez seleccionado un producto, busque el precio y espere a que se pulse la
tecla ACEPTAR para continuar.
Una vez seleccionado el producto, hay que revisar si existe suficiente dinero para
pagar el producto.
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.
66
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
69
4.3
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
Figura 2
71
4.5
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
Bases tericas
72
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
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
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
Resumen de objetivos
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.
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
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
10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
Cable para conectar los microcontroladores.
5.2
78
5.3
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
Figura 2
80
5.5
Protocolo de comunicacin
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
SEGMENTOS
A1
B1
C1
D1
5.7
Bases tericas
X
I
X
I
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
84
5.9.
Resumen de objetivos
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).
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
10
Cable comunicacin puerto serie
Kit MPLAB-ICD debuger
PIC 16F876
Cable para conectar los microcontroladores.
6.2
88
6.3
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
Figura 2
90
6.5
Protocolo de comunicacin
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
Peticin de direccin.
Direccin
Peticin de dato
Dato
Fin de grupo de datos
92
Se debera sacar por pantalla del LCD el nmero que queremos enviar y la respuesta
que nos da el otro micro:
N
I
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
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
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.
Se tendrn que poner en la pantalla del display los datos que se explican en el
apartado 6.7
6.9.
Objetivos de conocimieto
94
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
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
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
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
100
TECLA APRETADA=0
FIN
Memoria descriptiva
Programa ASM
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
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
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
103
Memoria descriptiva
Programa ASM
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
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
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
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
107
Memoria descriptiva
Programa ASM
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
108
Memoria descriptiva
Programa ASM
109
Memoria de clculo
3.MEMORIA DE CLCULO.
110
Memoria de clculo
R1
LED1
LED_blue
5V
V1
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
1
( TMR0) 8 = 8 s (TMR0)
4MHz
(3)
1
( TMR0) 8 = 8s (TMR0) = 39s
4MHz
39 s
= 4.875 = 5
8 s
(4)
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
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
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
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
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
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
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
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
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
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
5V
RA4
RB2
RB1
5V RB3
RB0
RA3
U1
VDD
U2
U3
74LS47N
OA
13
11
12
123
OB
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
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
J1
TX
RX
HDR1X4
Figura 45. Esquema comunicacin USART
124
5V
Planos
Esquemas de elementos
5.1.5.1.Teclado producto
RC0
RC1
J1
RC2
RC3
RB0
RB1
RB2
HDR2X5
R3
R1
R2
10kohm
10kohm
10kohm
RA3
R1
R2
10kohm
10kohm
J1
RA4
RC0
RC1
RC2
RC3
HDR2X5
Figura 47. Teclado monedero
125
Planos
Esquemas de elementos
RC0
RC1
J1
RC2
RC3
RA0
RA1
RA2
RA3
HDR2X5
R3
R1
R2
R4
10kohm
10kohm
10kohm
10kohm
RC0
RC1
RC2
RC3
RIBBON_16H
RC0
RC1
RC2
RC3
RIBBON_16H
126
Planos
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
127
5V
10nF
Planos
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
128
Planos
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
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
129
Planos
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
130
Planos
1kOhm
7
Y7
Y6
~G2B
~G2A
74LS138N
10
6
5V
G1
Y5
11
Y4
12
Y3
13
Y2
C
14
Y1
B
Y0
15
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
131
Planos
132
Planos
5.3.
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
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
133
SEVEN_SEG_DISPLAY
AB CDE FG
Planos
134
ANEXOS
Anexo
A.
A.1 Mdulo 1
A.1.1. Programa ASM de prctica 1
include "p16f877.inc"
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
;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
II
Anexo
;tecla a
;tecla 0
;tecla b
;tecla c
valor de tecla
la tecla apretada
de precio
de inicio
III
Anexo
0x10
r2
mas_fil
PORTA,4
IV
Anexo
Dev_pagado
movf pagado,w
call dev_dinero
clrf pagado
call mens_inicio
clrf tapreta
return
detect_moneda
btfsc modetect,2
goto detec_50_100_200
btfsc modetect,1
goto detec_10y20
movf modetect,w
goto fin_detect
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
detect_20
movlw D'4'
goto fin_detect
detec_50_100_200
btfsc modetect,1
goto detec_200
btfsc modetect,0
goto detec_100
movlw D'10'
goto fin_detect
detec_200
movlw D'40'
goto fin_detect
detec_100
movlw D'20'
goto fin_detect
fin_detect
Anexo
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
millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
btfss STATUS,C
VI
Anexo
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
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
E1
RS0
VIII
Anexo
RS1
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
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
;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
Anexo
XI
Anexo
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c
XII
Anexo
rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTB,0
0x01
r2
0x02
mas_fil
PORTB,1
buck_re
decfsz ret,f
goto buck_re
movf PORTB,w
andwf mas_fil,w
XIII
Anexo
;-------------------------------------------------------------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
XIV
Anexo
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
XV
Anexo
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
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
XVII
Anexo
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
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
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
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
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
XXI
Anexo
t0
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
E1
RS0
RS1
limpiar_LCD
call RS0
movlw 0x02
XXII
Anexo
;-------------------------------------------------------------------------;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
retm2
banksel TRISB
banksel PORTB
decfsz pausa
goto retm2
decfsz pausa2
goto retm1
return
end
XXIV
Anexo
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
;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
LCD
XXV
Anexo
XXVI
Anexo
movlw 0x4
movwf PORTC
movlw 0x08
movwf r1
call rev_fila
movlw 0x8
movwf PORTC
movlw D'12'
movwf r1
call rev_fila
return
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
XXVII
Anexo
movlw
movwf
movlw
movwf
btfsc
0x01
r2
0x02
mas_fil
PORTB,1
btfsc STATUS,Z
return
XXVIII
Anexo
;-------------------------------------------------------------------------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
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
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
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
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
return
dar_moneda
movf maux,w
movwf PORTA
XXXI
Anexo
;-------------------------------------------------------------------------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
XXXII
Anexo
t0
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
E1
RS0
RS1
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
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
equ 0x40
equ 0x41
equ 0x42
equ 0x50
equ 0x51
equ 0x52
equ 0x55
XXXV
Anexo
buckle
nop
call ver_moneda
btfsc tapreta,0
call pedir_prod
goto buckle
XXXVI
Anexo
;tecla 4
;tecla 5
;tecla 6
;tecla e
;tecla 7
;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c
XXXVII
Anexo
0x01
r2
0x02
mas_fil
PORTB,1
XXXVIII
Anexo
btfsc STATUS,Z
return
XXXIX
Anexo
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
;-------------------------------------------------------------------------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
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
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?
XLI
Anexo
cancelado
clrf
call
call
goto
T_escrita
mens_inicio
ini_reg
fin_correcto?
fin_correcto?
clrf tapreta
return
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
clear_display
t0
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
E1
XLIII
Anexo
RS0
RS1
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
XLIV
Anexo
;-------------------------------------------------------------------------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
Anexo
;------------------------------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
XLVI
Anexo
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
equ
equ
equ
equ
equ
equ
equ
equ
0x40
0x41
0x42
0x50
0x51
0x52
0x54
0x55
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
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
;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
Anexo
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
call retardo_prod
LI
Anexo
0x01
r2
0x02
mas_fil
PORTB,1
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
0x10
r2
mas_fil
PORTA,4
btfsc STATUS,Z
return
LII
Anexo
most_num
clrw
addwf r1,w
addwf r2,w
addlw 0x20
movwf FSR
movf INDF,w
movwf rmoneda
bsf tapreta,0
;--------------------------------------------------------------------------
LIII
Anexo
detect_moneda
btfsc modetect,2
goto detec_50_100_200
btfsc modetect,1
goto detec_10y20
movf modetect,w
goto fin_detect
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
detect_20
movlw D'4'
goto fin_detect
detec_50_100_200
btfsc modetect,1
goto detec_200
btfsc modetect,0
goto detec_100
movlw D'10'
goto fin_detect
detec_200
movlw D'40'
goto fin_detect
detec_100
movlw D'20'
goto fin_detect
fin_detect
LIV
Anexo
exceso_de_dinero
movf aux,w
subwf pagado,f
call dev_dinero
clrf tapreta
return
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
millar_si
movf digito,w
addlw 0x30
movwf letra
call escribir_LCD
clrf digito
b_centenas
movlw D'20'
subwf letraux
LV
Anexo
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
LVI
Anexo
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
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
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
LVIII
Anexo
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
err_x_cambio
call escribir_CM
goto fin_no_pagado
;-------------------------------------------------------------------------dar_cambio
LIX
Anexo
;--------------------------------------------------------------------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
LX
Anexo
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
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
LXI
Anexo
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
;espacio en blanco
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
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
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
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
escribir_LCD
;funcin para las instruccion de 49us de la pantalla LCD
call E1
movf letra,w
andlw 0xf0
LXV
Anexo
t1
E0
E1
RS0
RS1
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
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
LXVII
Anexo
;-----------------------------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
LXVIII
Anexo
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
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
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
LXX
Anexo
LXXI
Anexo
;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c
LXXII
Anexo
rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTA,0
0x01
r2
0x02
mas_fil
PORTA,1
LXXIII
Anexo
andwf PORTA,w
xorwf mas_fil,w
btfss STATUS,Z
return
;miramos si es la tecla 8 o 9
LXXIV
Anexo
siguiente
err_tecla
clrf tapreta
return
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
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
;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
;-------------------------------------------------------------------------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
LXXVI
Anexo
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
LXXVII
Anexo
escribe_0
clrf tapreta
movlw 1
subwf lim_tec
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
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
;-------------------------------------------------------------------------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
;letra C
;letra A
;letra N
;letra C
;letra E
LXXIX
Anexo
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
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
LXXX
Anexo
;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
LXXXI
Anexo
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
E1
RS0
RS1
LXXXII
Anexo
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
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
;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
retardo_ini
movlw 0x80
movwf TMR0
b_r_ini btfsc TMR0,7
goto b_r_ini
return
end
LXXXV
Anexo
;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
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
LXXXVII
Anexo
;tecla 7
;tecla 8
;tecla 9
;tecla d
;tecla a
;tecla 0
;tecla b
;tecla c
LXXXVIII
Anexo
rev_fila
btfsc tapreta,0
return
clrf r2
movlw 0x01
movwf mas_fil
btfsc PORTA,0
0x01
r2
0x02
mas_fil
PORTA,1
LXXXIX
Anexo
confimar_tecla
call ret_corto
movlw 0x0F
andwf PORTA,w
xorwf mas_fil,w
btfss STATUS,Z
return
;-------------------------------------------------------------------------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
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
XCI
Anexo
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
fin_envio
btfss continuar,0
goto sig
movlw FIN
movwf TXREG
call escribir_OK
call retardo
call mens_inicio
sig
bsf continuar,0
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
XCII
Anexo
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
;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
escribir_DATO
call RS0
movlw 0x87
movwf letra
call escribir_LCD
call RS1
movf DATO,w
call pasar_a_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
;letra O
;letra K
;letra O
;letra M
;letra U
;letra N
;letra I
XCIV
Anexo
;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
E0
E1
RS0
RS1
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
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
XCVI
Anexo
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
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
XCVII
Anexo
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
preg_prod
call RX
btfss PORTC,5
goto no_producto
goto si_producto
RX
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
XCVIII
Anexo
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
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
;dato de eprom
;direcion eprom
;para saber si se ha recibido el dato por RX.
;para pasar a modo de envio de la EEPROM
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
CII
Anexo
CIII
Anexo
;-------------------------------------------------------------------------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
CIV
Anexo
0x01
r2
0x02
mas_fil
PORTA,1
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
CV
Anexo
;miramos si es la tecla 8 o 9
siguiente
err_tecla
clrf tapreta
return
CVI
Anexo
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
CVII
Anexo
f_rev_precio
movf rtecla,w
movwf precio_actual
call escribir_LCD
clrf tapreta
movlw 0x02
movwf lim_tec
return
;-------------------------------------------------------------------------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
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
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
return
;-------------------------------------------------------------------------Para poner a cero la memoria EEPROM
ini_reset_memory
call limpiar_LCD
call escribir_borrar_memoria
CIX
Anexo
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
;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
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
fin_envio
btfss continuar,0
CXI
Anexo
sig
;-------------------------------------------------------------------------;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
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
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
escribir_PROD
movlw 0x50
;letra P
movwf letra
call escribir_LCD
movlw 0x52
;letra R
CXIV
Anexo
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
;letra O
;letra K
;letra O
;letra M
;letra U
;letra N
;letra I
CXV
Anexo
;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
E0
E1
RS0
RS1
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
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
CXVII
Anexo
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
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
CXVIII
Anexo
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
preg_prod
call RX
btfss PORTC,5
goto no_producto
goto si_producto
RX
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
CXIX
Anexo
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
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