Este es el codigo del programa
CMCON = 7 'Hace digital todas las entradas y salida
define LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DATA @5,20 'inicio con 1 peso por primera vez (20 pulsos)
data @10,0
DAtA @11,20 'inicio con 20 segundos por primera vez
data @15,0
data @16,0
data @17,0
data @18,0
'DECLARACION DE VARIABLES
dinero var word 'variable convertida a centavos
pulsos var word 'pulsos contados desde el monedero 1 pulso = 5 centavos
pulsos1 var word 'utilizada como auxiliar en "configuracionprecio:" para comparar estados
p0 var byte 'unidad de pesos ingresado. EJ: 6.30 pesos ingresado p0=6
c1 var byte 'decena de centavos ingresado. Ej: 6.30 pesos ingresado c1=3
c0 var byte 'unidad de centavos ingresado. Ej: 6.30 pesos ingresado c0=0
pg0 var byte 'unidad de pesos guardado. EJ: 6.30 pesos guardado p0=6
cg1 var byte 'decena de centavos guardado. Ej: 6.30 pesos guardado c1=3
cg0 var byte 'unidad de centavos guardado. Ej: 6.30 pesos guardado c0=0
pulsosguardados var word 'dato leido de la EEPROM en la configuracion de precio
B0 var bit 'utilizado para el conteo de flancos en bucle "contador:"
B1 var word 'control de tiempo en bucle "contador:"
a0 var bit 'control de flancos en "configuracionprecio:"
a1 var bit 'control de flancos en "configuracionprecio:"
total var word 'almacena el total del servicio
multitotal var word 'almacena los multiplos de 255 del total
totalrestante var word 'almacena los bits menos significativos del total
time var word 'almacena el tiempo configurado
timeA1 var word 'se utiliza para comaparar los datos con "time"
multitiempo var word 'guarda el multiplo del tiempo/255
restotiempo var word ' guarda el resto de la division tiempo//255
tempo var byte 'auxiliar para calcular digitos enviados al LCD
seg var byte 'auxiliar para calcular digitos enviados al LCD
m var byte 'decenas de minutos
m1 var byte 'unidades de minutos
s var byte 'decenas de segundos
s1 var byte 'unidades de minutos
TRISA= %11111100
Pause 1000 ' espera al inicio del LCD
PULSOS=0
B0=0
inicio:
LCDout $FE,1, " INICIANDO SISTEMA " ' Mensaje de Bienvenida
PAUSE 1000 ' Pausa del mensaje
LCDOUT $FE,1, " JOelectronica " ' Publicidad
pause 2000 ' Pausa Publicidad
if PORTA.6 =1 and PORTA.7=0 then
read 10,multitiempo 'lee los datos del primer banco de memmoria
read 11,restotiempo 'lee los datos del segundo banco de memoria
time=multitiempo*255+restotiempo 'suma los datos
goto configuraciontiempo
endif
if PORTA.7=1 and PORTA.6 = 0 then
goto configuracionprecio
endif
if PORTA.7=1 and PORTA.6=1 then
goto totalizado
endif
'COMIENZA A CARGAR LOS DATOS ALMACENADOS
read 5,pulsosguardados 'lee los datos guardados en memoria en la ubicacion 5 que fueron guardados en la configuracion de precio
pg0=pulsosguardados/20 'obtiene la cantidad de pesos guardados
cg1=(pulsosguardados//20)/2 ' obtiene la decena de los centavos guardados
lookup2 ((pulsosguardados//20)//2),[0,5],cg0 'obtiene la unidad de los centavos guardados
ingresodinero: 'Bucle principal que muestra el dinero a ingresar e ingresado
p0=pulsos/20 'obtiene la cantidad de pesos ingresados
c1=(pulsos//20)/2 ' obtiene la decena de los centavos ingresados
lookup2 ((pulsos//20)//2),[0,5],c0 'obtiene la unidad de los centavos ingresados
lcdout $FE,1, "Credito: ","$",dec p0,".",dec c1,dec c0
lcdout $FE,$c0, "Precio: ","$",dec pg0,".",dec cg1,dec cg0
if pulsos>=pulsosguardados then ' compara el valor ingresado con el valor guardado, si es mayor ejecuta el temporizado
goto totalizador 'va a la subrutina totalizador para modificar los valores
endif
esperapulsos:
if PORTA.2=0 then
goto contador 'espera en el puerto A2 una señal de pulso
endif
goto esperapulsos
contador:'bucle conteo de pulsos
LCDout $FE,1
lcdout $fe,1, "Ingresando Espere" 'mensaje de espera
buclecontador:
if PORTA.2 =0 and B0=0 then
pulsos = pulsos +1
B0=1 'B0 impide el conteo del mismo pulso varias veces
else
if PORTA.2=1 then 'Al cambiar el estado de la señal de pulsos, habilita nuevamente por medio de B0 al conteo
B0=0
endif
EndIF
pause 1
B1=B1+1
if B1>500 then 'Espera de 0.5 segundos (tiempo que demora el monedero en enviar los datos
B1=0
goto ingresodinero:
endif
goto buclecontador:
tiempo:
LCDOUT $FE,1
pause 300
lcdout $FE, 1, " PRESIONE EL BOTON "
lcdout $fe, $c0," INICIO "
pulsos=0
if PORTA.5=0 then 'espera a que el boton en PA5 sea presionado
read 10,multitiempo 'lee los datos del primer banco de memmoria
read 11,restotiempo 'lee los datos del segundo banco de memoria
time=multitiempo*255+restotiempo 'suma los datos
goto temporizador
endif
Pause 500
if PORTA.5=0 then 'espera a que el boton en PA5 sea presionado
read 10,multitiempo 'lee los datos del primer banco de memmoria
read 11,restotiempo 'lee los datos del segundo banco de memoria
time=multitiempo*255+restotiempo 'suma los datos
goto temporizador
endif
GOTO TIEMPO
temporizador:
output PORTB.3
PORTB.3=1 'enciende el rele
tempo=time/60
m=tempo/10
m1=tempo//10
seg=time//60
s=seg/10
s1=seg//10
LCDout $fe,1
lcdout $fe, 1, " AIRE DISPONIBLE "
lcdout $fe, $c0,"Restante: ", dec m,dec m1, ":", dec s, dec s1," S"
pause 1000
time=time-1
if time<=0 then 'apaga el rele y vuelve a ingreso dinero
PORTB.3=0
goto ingresodinero
endif
goto temporizador
configuracionprecio: 'Bucle para configurar el precio de habilitacion
if PORTA.4 =0 and a1=0 THEN 'incrementa el precio
pulsos = pulsos +1
a1=1 'a1 impide la autorepeticion
else
if PORTA.4=1 then 'habilita nuevamente al conteo por un cambio de flanco
a1=0
endif
endif
if PORTA.3=0 and a0=0 then 'decrementa el precio
pulsos = pulsos -1
a0=1 'a1 impide la autorrepeticion
else
if PORTA.3 =1 then 'habilita nuevamente al conteo por un cambio de flanco
a0=0
endif
endif
Write 5,pulsos 'Guarda en la direccion 5 la cantidad de pulsos
if pulsos1<>pulsos then 'compara si el estado actual es distinto al anterior, en caso de serlo lo encia al LCD
p0=pulsos/20 'obtiene la cantidad de pesos ingresados
c0=(pulsos//20)/2 ' obtiene la decena de los centavos ingresados
lookup ((pulsos//20)//2),[0,5],c1 'obtiene la unidad de los centavos ingresados
lcdout $fe,1
lcdout $fe,1, "Configuracion Dinero"
lcdout $fe, $c0,"$ ", dec p0,".",dec c0,dec c1
pulsos1=pulsos 'Iguala los valores para poder realizar una comparacion nuevamente
endif
if PORTA.7=1 and PORTA.6=1 then 'Si se presiona el pulsador en PA7 y PA6 simultaneamente el sistema se reinicia
goto inicio:
endif
if PORTA.6=1 then
lcdout $fe,1
lcdout $fe,1, "Configuracion Tiempo"
lcdout $fe, $c0,"Segundos:"
goto configuraciontiempo:
endif
goto configuracionprecio:
configuraciontiempo:
if PORTA.7=1 and PORTA.6=1 then 'Si se presiona el pulsador en PA7 y PA6 simultaneamente el sistema se reinicia
goto inicio:
endif
if PORTA.4 =0 THEN 'aumenta un segundo
time = time +1
endif
if PORTA.3=0 then 'disminuye un segundo
time = time -1
endif
if timeA1<>time then 'si se detecta un cambio de valor se lo muestra en el LCD
multitiempo=time/255
restotiempo=time//255
Write 10,multitiempo 'guarda los datos en memoria
write 11,restotiempo
lcdout $fe,1
lcdout $fe,1, "Configuracion Tiempo"
lcdout $fe, $c0,"Segundos: ",dec time," S"
timeA1=time 'iguala los datos para que no vuelva a ingresar si no hay cambio
endif
if PORTA.7=1 and PORTA.6=1 then
lcdout $fe,1
lcdout $fe,1, "REINICIANDO"
goto inicio:
endif
if PORTA.7=1 then
lcdout $fe,1
lcdout $fe,1, "Configuracion Dinero"
lcdout $fe, $c0,"$ ", dec p0,".",dec c0,dec c1
goto configuracionprecio:
endif
PAUSE 70
goto configuraciontiempo
totalizador: 'incrementa el valor del totalizador y del parcial
read 15,multitotal 'lee el multiplo del total
read 16,totalrestante 'lee el resto de la division
total=multitotal*255+totalrestante+1 'calcula el total e incrementa una unidad
multitotal=total/255 'calcula el multiplo del total
totalrestante=total//255 'calcula el resto del total
write 15, multitotal 'escribe el multiplo del total
write 16, totalrestante 'escribe el resto de la division
goto tiempo
totalizado:
read 15,multitotal 'lee el multiplo del total
read 16,totalrestante 'lee el resto de la division
total=multitotal*255+totalrestante
Lcdout $FE,1,"Total: ",dec total
pause 5000
goto inicio