Plano maquina dispensadora de refrescos

List C=132, W=1, P=16F877, ST=OFF, N=062 Include P16F877. INC Title «Control Logico para Maquina Expendedora de Alimentos» ;Configuracion del integrado: WDT off, CP on, OSC LP, BOR Off, _PWRTE On, LVP Off __Config _CP_ALL & _LVP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _LP_OSC ; #Define PRUEBA ;Omitir rutina de base de tiempo ; #Define OMITLCD ;Omitir Bit bf del Modulo LCD ;——————————————————————————- ; Este programa controla el despacho automatico de Alimentos ; ;Perifericos asociados: ; * Teclado Selector de Producto y Ajuste ; de la Hora. Puerto D: RD0 a RD5) ; * Sensor de Cancelar Despacho. (Puerto D: RD6) ; * Sensor de Modo de Servicio. (Puerto D: RD7) ; * Interruptor Selector de Campo de ; producto a Modificar (Puerto C: RC0) ; * Sensor de Moneda 100 Bs. (Puerto C: RC1) ; * Sensor de Moneda 500 Bs. (Puerto C: RC2) ; * Pantalla LCD 2 x 16. (Puerto B: RB0 a RB7) Data ; (Puerto E: RE0 a RE2) Control ; * Driver para Solenoide #1 (Puerto A: RA0) ; * Driver para Solenoide #2 (Puerto A: RA1) ; * Driver para Solenoide #3 (Puerto A: RA2) ; * Driver para Solenoide #4 (Puerto A: RA3) ; * Driver para el Compresor del ; Refrigerador. Puerto A: RA4) ; * Driver para el Solenoide de Monto ; Valido. (Puerto A: RA5)

Lo sentimos, pero las muestras de ensayos completos están disponibles solo para usuarios registrados

Elija un plan de membresía
;——————————————————————————- ;Definir registros de proposito general: Cblock 0x20 REGSEG ;Contador BCD de segundos REGMIN ;Contador BCD de minutos REGHORA ;Contador BCD de horas REGTIEMPO ;Registro para eventos de segundos REGCOMP ;Registro para evento del Compresor REGTEMP ;Registro de proposito general PRODUCTO ;Registro que contiene el producto seleccionado CANTPRO1 ;Registro de Cantidad del Producto #1 CANTPRO2 ;Registro de Cantidad del Producto #2

CANTPRO3 ;Registro de Cantidad del Producto #3 CANTPRO4 ;Registro de Cantidad del Producto #4 COSTO1 ;Registro Costo del Producto #1 COSTO2 ;Registro Costo del Producto #2 COSTO3 ;Registro Costo del Producto #3 COSTO4 ;Registro Costo del Producto #4 MONTO ;Registro Monto Ingresado por el Usuario CSTATUS ;Registro Indicador de Eventos REGT_W ;Stack del registro W REGT_STATUS ;Stack del registro STATUS REGT_FSR ;Stack del registro FSR REGT_INDF ;Stack del registro INDF Endc ;Definir pines del Puerto A Control de Actuadores: Cblock 0 solend_1 ;Motor para gira del espiral #1 – RA0 olend_2 ;Motor para gira del espiral #2 – RA1 solend_3 ;Motor para gira del espiral #3 – RA2 solend_4 ;Motor para gira del espiral #4 – RA3 compre ;Compresor para el Refrigerador de Refrescos – RA4 solend_c ;Soleiode de Bandeja de Monto Valido – RA5 Endc ;Definir pin del Puerto B Bit Ocupado del Modulo (LCD BF): bf Equ 7 ;Bit indicador de ocupado del modulo LCD – RB7 ;Definir pines del Puerto C Sensores del Equipo: Cblock 0 selcampo ;Interruptor selector de campo a modificar – RC0 _100bs ;Sensor de Moneda de 100 Bs – RC1 _500bs ;Sensor de Moneda de 500 Bs – RC2

Endc ;Definir pines del Puerto D (Teclado): Cblock 0 pdto1 ;Seleccion del producto 1 – RD0 pdto2 ;Seleccion del producto 2 – RD1 pdto3 ;Seleccion del producto 3 – RD2 pdto4 ;Seleccion del producto 4 – RD3 ajthrs ;Ajuste del campo de las horas – RD4 ajtmin ;Ajuste del campo de los minutos – RD5 clr_par ;Interruptor de limite N. C. Cancelar operacion – RD6 puerta ;Interruptor de limite N. C. (Servicio) – RD7 Endc ;Definir pines del Puertos E (Control LCD): Cblock 0 rs ;Pin de habilitacion del modulo LCD – RE0 rw ;Pin de lectura / escritura del modulo LCD – RE1 na ;Pin de habilitacion del modulo LCD – RE2 Endc ;Definir bit de Control del Registro CSTATUS: Cblock 0 rtc ;Indicador de ciclo de registros del RTC key ;Indicador de teclado en uso seg ;Indicador de evento de 1 segundo Endc ;Definir constantes y variables: PTODATA Equ PORTB ;Puerto de Datos del modulo LCD CNFDATA Equ TRISB ;Registro de Configuracion TRIS del Puerto de Datos LCD PTOCTL Equ PORTE ;Puerto de Control del modulo LCD MOD10MSH Equ 0FF ;Valor del TMR1H para retardo de 10 mseg MOD10MSL Equ 0AE ;Valor del TMR1L para retardo de 10 mseg MOD50MSH Equ 0FC ;Valor del TMR1H para retardo de 50 mseg

MOD50MSL Equ 0CC ;Valor del TMR1L para retardo de 50 mseg MODXSEGH Equ 0C0 ;Modulo del TMR1H para retardo de 2 seg MODXSEGL Equ 0 ;Modulo del TMR1L para retardo de 2 seg MOD1SEG Equ . 128 ;Modulo del TMR0 para 1 seg MODSEG Equ 60 ;Modulo del contador de los segundos MODMIN Equ 60 ;Modulo del contador de los minutos MODHRS Equ 13 ;Modulo del contador de las horas ;******************************* VECTOR DE INICIO ****************************** Org 0 VECINI Goto INICIO ;**************************** VECTOR DE INTERRUPCION *************************** Org 4 VECINT Goto RTC ;Salto a la rutina de Interrupcion ******************************** MENSAJES ************************************* TXT00 Addwf PCL ;Buscar un caracter del mensaje Identificador Dt «USB-Vargas»,0 TXT01 Addwf PCL ;Buscar un caracter del mensaje de Bienvenida Dt «** Bienvenido **»,0 TXT02 Addwf PCL ;Buscar un caracter del mensaje de Verificacion Dt «Producto Agotado»,0 TXT03 Addwf PCL ;Buscar un caracter del mensaje de Pago Dt «Inserte Monedas»,0 TXT04 Addwf PCL ;Buscar un caracter del mensaje de cancelar Dt «Pedido Cancelado»,0 TXT05 Addwf PCL ;Buscar un caracter del mensaje Despachando Dt «Despachando… «,0

TXT06 Addwf PCL ;Buscar un caracter del mensaje Retire Producto Dt «Retire Producto»,0 TXT07 Addwf PCL ;Buscar un caracter del mensaje Ajuste Producto Dt «#0 Cant:0″,7E,»0000Bs»,0 ;******************** RUTINA DE SERVICIO DE INTERRUPCION *********************** ; ;Call RTC: Base de tiempo de 1 seg para el RTC. Esta interrupcion provoca ; que el RTC sea actualizado cada segundo. ; Nivel de profundidad: 2 RTC Movwf REGT_W ;Salva el contenido del registro W Swapf STATUS,w ;Salva el contenido del registro STATUS Movwf REGT_STATUS ; ;Carga nuevamente el Temporizador para un proximo evento de la HORA: ;

Movlw MOD1SEG ;Cargar el temporizador TMR0 Movwf TMR0 ; ;Lleva el registro de la Hora en Tiempo Real (RTC). Para ello se ;utilizan los registro REGSEG, REGMIN y REGHORA: ; ;Incrementa un Segundo: ; RTCSEG Incf REGSEG ;Incrementar contenido de los Segundos Movlw 06 Addwf REGSEG,w ;Suma 06 al digito inferior SEG para verificar Acarreo Btfss STATUS,DC ;Acarreo al digito superior SEG ? Goto SEG100 ;No, Verifica cuenta maxima de los segundos Movwf REGSEG ;Si, actualiza el contenido del digito inferior SEG Movlw 60 Addwf REGSEG,w ;Suma 60 al digito superior SEG para verificar Acarreo Btfsc STATUS,C ;Acarreo al Bit C ?

Movwf REGSEG ;Si, actualiza el contenido del digito superior SEG Movlw MODSEG ;Carga W con la direccion del Registro de los ; SEG100 Movlw 60 ;Carga W con el valor del modulo de los segundos Xorwf REGSEG,w ;Verifica la cuanta maxima de los segundos Btfss STATUS,Z ;REGSEG = 60 ? Goto RTC100 ;No, continua con el Servicio de Interrupcion Clrf REGSEG ;Si, Coloca el REGSEG a 00 (Segundos a 00) ; ;Incrementa un Minuto: ; RTCMIN Incf REGMIN ;Incrementar contenido de los Minutos Movlw 06 Addwf REGMIN,w ;Suma 06 al digito inferior MIN para verificar Acarreo Btfss STATUS,DC ;Acarreo al digito superior MIN ?

Goto MIN100 ;No, Verifica cuenta maxima de los minutos Movwf REGMIN ;Si, actualiza el contenido del digito inferior MIN Movlw 60 Addwf REGMIN,w ;Suma 60 al digito superior MIN para verificar Acarreo Btfsc STATUS,C ;Acarreo al Bit C ? Movwf REGMIN ;Si, actualiza el contenido del digito superior MIN ; MIN100 Movlw 60 ;Carga W con el valor del modulo de los minutos Xorwf REGMIN,w ;Verifica la cuanta maxima de los minutos Btfss STATUS,Z ;REGMIN = 60 ? Goto RTC100 ;No, continua con el Servicio de Interrupcion Clrf REGMIN ;Si, Coloca el REGMIN a 00 (Minutos a 00) ; ;Incrementa una Hora: ;

RTCHRS Incf REGHORA ;Incrementar contenido de la Hora Movlw 06 Addwf REGHORA,w ;Suma 06 al digito inferior HRS para verificar Acarreo Btfss STATUS,DC ;Acarreo al digito superior HRS ? Goto HRS100 ;No, Verifica cuenta maxima de la hora Movwf REGHORA ;Si, actualiza el contenido del digito inferior HRS Movlw 60 Addwf REGHORA,w ;Suma 60 al digito superior HRS para verificar Acarreo Btfsc STATUS,C ;Acarreo al Bit C ? Movwf REGHORA ;Si, actualiza el contenido del digito superior HRS ; HRS100 Movlw 13 ;Carga W con el valor del modulo de la hora Xorwf REGHORA,w ;Verifica la cuanta maxima de la hora Movlw 1

Btfss STATUS,Z ;REGHORA = 13 ? Goto RTC100 ;No, continua con el Servicio de Interrupcion Movwf REGHORA ;Si, Coloca el REGHORA a 01 (Hora a 01) ; ;Finaliza la rutina de servicio de interrupcion, levantando el indicador ;de segundo cumplido, decrementando el contenido del registro REGTIEMPO ;y restableciendo los valores de los registros W, STATUS y FSR: ; RTC100 Bsf CSTATUS,seg ;Indica 1 segundo cumplido Decf REGTIEMPO ;Decrementa contador de segundos ; ;Decrementa el Temporizador del Ciclo del Compresor: ; Bcf PORTA,compre ;Desactiva el Compresor Decf REGCOMP ;Decrementar el Temporizador del Compresor

Btfss STATUS,Z ;Temporizador del Compresor = 0 ? Goto RTCFIN ;No, Culmina Rutina de Servicio de Interrupcion Bsf PORTA,compre ;Si, Activa el Compresor Movlw . 11 ;Carga nuevamente el Temporizador del Compresor Movwf REGCOMP ; ;Finalizacion de la Rutina de Servicio de Interrupcion del RTC (TIMER0) ; RTCFIN Bcf INTCON,T0IF ;Borrar indicador de Overflow del TMR0 Swapf REGT_STATUS,w ;Recupera el contenido del registro STATUS Movwf STATUS Swapf REGT_W ;Recupera el contenido del registro W Swapf REGT_W,w Retfie ;Retorna ;******************************* SUBRUTINAS ************************************ *************************** SUBRUTINAS DE TIEMPO ****************************** ;Call RET10MS: Rutina para realizar un retardo de 10 mseg con la finalizadad de ; establizar o «eliminar» los rebotes producidos por los contactos ; de los interruptores electromecanicos. ; Nivel de Profundidad: 1 RET10MS Movlw MOD10MSH ;Carga Registro TMR1 para retardo de 10 mseg Movwf TMR1H Movlw MOD10MSL Movwf TMR1L Bcf PIR1,TMR1IF ;Borra indicador de desbordamiento del TIMER1 RET10_M Btfss PIR1,TMR1IF ;Tiempo de rebotes cumplido ? Goto RET10_M ;No, espera Return ;Si, Retorna Call RET100M: Rutina para realizar un retardo de 50 mseg con la finalizadad de ; establizar o «eliminar» los rebotes producidos por los contactos ; de los interruptores electrmecanicos de monedas de 100Bs y 500Bs. ; Nivel de Profundidad: 1 RET100M Movlw MOD50MSH ;Carga Registro TMR1 para retardo de 50 mseg Movwf TMR1H Movlw MOD50MSL Movwf TMR1L Bcf PIR1,TMR1IF ;Borra indicador de desbordamiento del TIMER1 RET50_M Btfss PIR1,TMR1IF ;Tiempo de rebotes interruptor limite cumplido ? Goto RET50_M ;No, espera Return ;Si, Retorna ;Call RETXSEG: Rutina para realizar un retardo con la finalizadad de mantener abierta la compuerta del Producto seleccionado mientras este sale ; del dispensador. Tambien se utiliza para mantener en pantalla los ; mensajes de advertencia al consumidor. ; Nivel de Profundidad: 1 RETXSEG Movlw MODXSEGH ;Carga Registro TMR1 para retardo de Solenoide o Movwf TMR1H ;retardo de Mensaje al Consumidor Movlw MODXSEGL Movwf TMR1L Bcf PIR1,TMR1IF ;Borra indicador de desbordamiento del TIMER1 RETX100 Btfss PIR1,TMR1IF ;Tiempo de Solenoide cumplido ? Goto RETX100 ;No, espera Return ;Si, Retorna ;Call INCBCD: Incrementa en BCD el contenido del registro especificado en la ; direccion apuntada por FSR. Nivel de Profundidad: 1 INCBCD Incf INDF ;Incrementar contenido del registro (INDF) Movlw 06 ;Verificar el contenido del nibble inferior Addwf INDF,w Btfss STATUS,DC ;Acarreo al nibble superior ? Return ;No, retorna. Movwf INDF ;Si, actualiza el contenido del nibble inferior Movlw 60 ;Verificar el contenido del nibble superior Addwf INDF,w Btfsc STATUS,C ;Acarreo al bit C ? Movwf INDF ;Si, actualiza el contenido del nibble superior Return ;Retorna ;************************** SUBRUTINAS DEL MODULO LCD ************************** ; ;CNFDATA = Registro de Configuracion TRIS del Puerto de Datos PTOCTL = Puerto de Control del modulo LCD ;PTODATA = Puerto de Datos PORT ; ; ;Call RDBF: Lee la bandera de ocupado (busy flag) del modulo LCD. ; Esta rutina se utiliza para evitar enviar un dato o comando al ; modulo LCD mientras este ocupado. ; Nivel de Profundidad: 1 RDBF Bsf PTOCTL,rw ;Operacion de Lectura Bsf STATUS,RP0 Movlw 0FF ;Configurar Puerto de Datos como entrada Movwf CNFDATA Bcf STATUS,RP0 Bsf PTOCTL,ena ;Habilita pantalla LCD Nop Ifndef OMITLCD RDBF100 Btfsc PTODATA,bf ;Pantalla ocupada? Goto RDBF100 ;Esperar que bf = 0 Endif Bcf PTOCTL,ena ;Deshabilitar pantalla LCD

Bsf STATUS,RP0 Clrf CNFDATA ;Configurar Puerto de Datos como salida Bcf STATUS,RP0 Bcf PTOCTL,rw ;Operacion de Escritura Return ;Call CLKLCD: Genera un impulso de 1 µseg para que la pantalla LCD acepte el ; dato o comando respectivo. CLKLCD Bsf PTOCTL,ena ;Habilitar LCD Nop Bcf PTOCTL,ena ;Deshabilitar LCD Return ;Call WRDATA: Envia un dato en formato ASCII cargado en el registro W hacia ; la pantalla LCD para visualizar o para la CGRAM. ; Nivel de Profundidad: 2 WRDATA Bcf PTOCTL,rs ;Modo Comando al LCD Movwf PTODATA ;Colocar valor ASCII o direccion AC en el Puerto ;de Datos

Call RDBF ;Leer BF Bsf PTOCTL,rs ;Modo Dato al modulo LCD Goto CLKLCD ;Generar pulso en pin «E» ;Call WRCMDO: Envia un comando cargado en el registro W hacia ; la pantalla LCD. ; Nivel de Profundidad: 2 WRCMDO Bcf PTOCTL,rs ;Modo Comando al modulo LCD Movwf PTODATA ;Colocar codigo de comando en el Puerto de Datos Call RDBF ;Leer BF Goto CLKLCD ;Generar pulso en pin «E» ;Call TXTINI: Envia el Texto Inicial a la pantalla LCD. En la primera linea se ; muestra el Logotipo y la Hora. En la segunda linea se muestra la ; invitacion a adquirir el producto. ; Nivel de Profundidad: 3 ; Enviar texto Inicial a la linea superior en la pantalla LCD: ; TXTINI Movlw 80 ;DD RAM 00h, linea superior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT000 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT00 ;Busca caracter de texto linea superior Xorlw 00 ;Verifica dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Goto TXT100 ;Si, envia texto a la linea inferior Call WRDATA ;No, envia caracter a la linea superior Incf REGTEMP ;Si, incrementa apuntador de caracter Goto TXT000 ;Busca proximo caracter del texto linea superior ; ;Enviar texto Inicial a la linea inferior en la pantalla LCD: TXT100 Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT200 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT01 ;Busca caracter de texto linea inferior Xorlw 00 ;Verificar dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de caracter Goto TXT200 ;Busca proximo caracter del texto linea inferior ;Call TXTAGO: Indica al Usuraio en la segunda linea que el producto seleccionado ; se encuentra agotado. ; Nivel de Profundidad: 3 ; Enviar texto agotado a la linea inferior en la pantalla LCD: ; TXTAGO Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT300 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT02 ;Busca caracter TXT02 linea inferior Xorlw 00 ;Verifica dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de caracter TXT02 Goto TXT300 ;Busca proximo caracter TXT02 linea inferior ;Call TXTINS: Indica al Usuraio en la segunda linea que inserte las monedas para pagar el producto seleccionado ; Nivel de Profundidad: 3 ; ;Enviar texto Inserte Monedas a la linea inferior en la pantalla LCD: ; TXTINS Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT400 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT03 ;Busca caracter TXT03 linea inferior Xorlw 00 ;Verifica dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de caracter TXT03 Goto TXT400 ;Busca proximo caracter TXT03 linea inferior Call TXTCNC: Indica al Usuraio en la segunda linea que la operacion del ; despacho del producto ha sido cancelada. ; Nivel de Profundidad: 3 ; ;Enviar texto Cancelado a la linea inferior en la pantalla LCD: ; TXTCNC Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT500 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT04 ;Busca caracter TXT04 linea inferior Xorlw 00 ;Verifica dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de aracter TXT04 Goto TXT500 ;Busca proximo caracter TXT04 linea inferior ;Call TXTDSP: Indica al Usuario en la segunda linea que se esta efectuando el ; despacho del producto seleccionado. ; Nivel de Profundidad: 3 ; ;Envia texto Despachando a la linea inferior en la pantalla LCD: ; TXTDSP Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT600 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT05 ;Busca caracter TXT05 linea inferior Xorlw 00 ;Verifica dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna

Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de caracter TXT05 Goto TXT600 ;Busca proximo caracter TXT05 linea inferior ;Call TXTLST: Indica al Ususario en la segunda linea que puede retirar el ; producto seleccionado. ; Nivel de Profundidad: 3 ; ;Envia texto Retire Producto a la linea inferior en la pantalla LCD: ; TXTLST Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT700 Movf REGTEMP,w ;Carga valor de apuntador de caracter Call TXT06 ;Busca caracter TXT06 linea inferior Xorlw 00 ;Verifica dato obtenido de texto

Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de caracter TXT06 Goto TXT700 ;Busca proximo caracter TXT06 linea inferior ;Call TXTSVC: Indica en la segunda linea el Modo de Servicio, mostrando la ; Cantidad y el costo del Prducto #1 por defecto. ; Nivel de Profundidad: 3 ; ;Envia texto Producto, Cantidad, Costo a la linea inferior en la pantalla LCD: ; TXTSVC Movlw 0C0 ;DD RAM 40h, linea inferior Call WRCMDO Clrf REGTEMP ;Borra apuntador de tabla TXT800 Movf REGTEMP,w ;Carga valor de apuntador de caracter

Call TXT07 ;Busca caracter TXT07 linea inferior Xorlw 00 ;Verifica dato obtenido de texto Btfsc STATUS,Z ;Dato del texto = 00h ? Return ;Si, Retorna Call WRDATA ;No, envia caracter a la linea inferior Incf REGTEMP ;Si, incrementa apuntador de caracter TXT07 Goto TXT800 ;Busca proximo caracter TXT07 linea inferior ;Call VISRTC: Muestra la hora en la pantalla LCD. ; Nivel de Profundidad: 4 VISRTC Movlw 8B ;Selecciona el Campo de las Horas en la pantalla Call WRCMDO Swapf REGHORA,w ;Carga el MSD de la Hora Andlw 0F ;Codifica a ASCII el valor de MSD de la Hora Btfss STATUS,Z Addlw 30 Btfsc STATUS,Z

Movlw 20 Call WRDATA ;Envia MSD de la Hora a la pantalla ; Movf REGHORA,w ;Carga el LSD de la Hora Call CNVASC ;Codifica a ASCII y envia el LSD de la Hora Movlw «:» ;Envia separados de Campos a la pantalla Call WRDATA Swapf REGMIN,w ;Carga el MSD de los Minutos Call CNVASC ;Codifica a ASCII y envia el MSD de los Minutos Movf REGMIN,w ;Carga el LSD de los Minutos Call CNVASC ;Codifica a ASCII y envia el LSD de los Minutos Return ;Call CNVASC: Convierte el LSD (BCD) de un byte cargado en el registro W a ; codigo numerico ASCII. ; Nivel de Profundidad: 3 CNVASC Andlw 0F ;Borra el MSD del Byte

Addlw 30 ;Convierte el numero del LSD (BCD) a Codigo ASCII Call WRDATA Return ;***************** SUBRUTINAS DE RECOPILACION DE INFORMACION ******************* ; ;Call SELPRO: Obtiene del teclado el producto seleccionado, quedando almacenado ; en el registro PRODUCTO, cuyo valor esta comprendido entre 01H al ; 04H. Si se detecta una tecla no valida o error el contenido de ; PRODUCTO es FFH. ; El bit KEY ubicado en el registro CSTATUS indica si el teclado ; esta en uso (1) o libre (0). ; Nivel de Profundidad: 2 SELPRO Btfss CSTATUS,key ;Teclado en uso? Goto SPRO100 ;No, verifica teclas de seleccion del producto SPRO000 Movf PORTD,w ;Lee el teclado Andlw b’01001111′ ;Omite teclas SERV, AJTHR y AJTMIN. Xorlw b’01001111′ ;Verifica teclas de seleccion, cancelar (Pulsada) Btfss STATUS,Z ;Tecla liberada ? Return ;No, retorna con el teclado en uso (key = 1) Call RET10MS ;Si, elimina rebote tecla liberada Bcf CSTATUS,key ;Borra indicador de teclado en uso (key = 0) Return ; SPRO100 Movf PORTD,w ;Lee el teclado Andlw b’00001111′ ;Omite teclas SERV, CANCELAR, AJTHR y AJTMIN. Xorlw b’00001111′ ;Verifica teclas de seleccion Btfsc STATUS,Z ;Tecla Pulsada ? Return ;No, Retorna Call RET10MS ;Si, elimina rebote tecla pulsada

Bsf CSTATUS,key ;Activa indicador de teclado en uso (key = 1) SPRO101 Movlw 1 Btfss PORTD,pdto1 Goto SPRO200 ;Producto #1 seleccionado Movlw 2 Btfss PORTD,pdto2 Goto SPRO200 ;Producto #2 seleccionado Movlw 3 Btfss PORTD,pdto3 Goto SPRO200 ;Producto #3 seleccionado Movlw 4 Btfsc PORTD,pdto4 ;Producto #4 seleccionado Movlw 0 ;Tecla errada SPRO200 Movwf PRODUCTO Return ;******************************************************************************* ;**************************** PROGRAMA PRINCIPAL ******************************* ; ;Configuracion inicial del procesador ;Valores Iniciales de los registros SFR a utilizar: ;

INICIO Clrf PCLATH ;Borrar PCH (Pagina ROM 00) Clrf INTCON ;Deshabilitar todas las interrupciones Clrf TMR0 ;Borrar Temporizador TMR0 Clrf TMR1H ;Borrar Temporizador TMR1 Clrf TMR1L Clrf PORTA ;Carga inicial del Registro PORTA Movlw b’11111111′ ;Carga inicial del Registro PORTD Movwf PORTD Movwf PORTB ;Carga inicial del registro PORTB Clrf PORTE ;Carga inical del registro PORTE ;RS=0, R/W=0, E=0 Movlw b’00000111′ ;Carga inicial del registro PORTC Movwf PORTC Clrf ADCON0 ;Deshabilita Convertidor A/D ; ;Configuracion de Puertos, Temporizadores e Interrupciones: ; Bcf STATUS,RP1 ;Seleccionar Banco 1 de la memoria RAM

Bsf STATUS,RP0 Clrf PIE1 ;Deshabilitar Interrupciones de Perifericos Clrf PIE2 Movlw b’11010101′ ;Configurar el Temporizador TMR0: Movwf OPTION_REG ;Pull-Up On, Clk Int, Prescaler 1:64 Movlw b’00000110′ ;Configura el Puerto A como Digital Movwf ADCON1 Clrf TRISA ;Configura el puerto A como salida Movlw b’11111111′ ;Configura el puerto B como entrada (por defecto): Movwf TRISB ;RB7 a RB4 20 (2000 Bs) Movlw 5 Btfsc STATUS,Z ;Costo del Producto > 20 (2000 Bs) ? Movwf INDF ;Si, Carga el Costo a 5 (500 Bs) Goto SVSPRO ;Visualiza Campos del Producto De «Memotronics – Derechos Reservados 2007» End