;control de un modulo LCD inteligente ;CONTADOR DE PULSOS HASTA 9.999.999 CON MEMORIA LAP ;NORBERTO PELLEGRINI 28/01/2001 ;------------------------------------------------------------- INCLUDE "P16F84.INC" PC EQU 2H STATUS EQU 3H PORT_A EQU 5H PORT_B EQU 6H SENSOR EQU 1DH PUERTO EQU 1CH ;GUARDO EL VALOR VIEJO DEL PUERTO LAP EQU 1BH ;SI LAP=1 MANTIENE EL VISOR SIN ACTUALIZAR UNIDAD EQU 14H ;CONTADORES UNIDADES DECENA EQU 15H ; CENTENA EQU 16H ; UNIMIL EQU 17H ; DECMIL EQU 18H ; CENMIL EQU 19H ; MILLON EQU 1AH ; DELAY2 EQU 1EH DELAY1 EQU 0CH REFRESH EQU 0DH TEMPO EQU 13H Z EQU 2H C EQU 0H W EQU 0H R EQU 1H E EQU 1H ;PATA18 MICRO A LA PATA 6 (E) HABILITACION DEL MODULO RS EQU 0H ;PATA17 MICRO A LA PATA 4 DEL MODULO (RS - INSTRUCCION O CARACTER) ; PATA 2 DEL MODULO A +VCC ; 3 REGULA CONTRASTE, AL PUNTO MEDIO DE UN POTE 5K ENTRE VCC Y MASA ; 5 Y 1 A MASA - YO EMPLEO 2 R FIJAS, DE 1K ;PATA 6 DEL PIC----->A LA 7 DEL MODULO ; 7----------> 8 ; 8----------->9 ; 9---------->10 ; 10--------->11 ; 11--------->12 ; 12--------->13 ; 13--------->14 ; PARA LA ILUMINACION POSTERIOR, UNA RESISTENCIA DE 220 OHMS A +5V ; PATA 1 DEL MICRO, RESISTENCIA 1K A VCC, Y PULSADOR A MASA ; PATA 2 DEL MICRO, RESISTENCIA 1K A VCC, Y SENSOR (YO EMPLEO INDUCTIVO) ; 17/09/2000, FUNCIONA OK __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;CONFIGURO ;PARA LA GRABACION, CODE PROTECT OFF, RESET DE ENCENDIDO ,ETC ;*****************PROGRAMA PRINCIPAL******************************** ORG 00 ; VECTOR DE RESET DEL 16F84 GOTO INICIO ORG 05H RETARDO MOVLW .200 MOVWF TEMPO DECRE DECFSZ TEMPO,R GOTO DECRE RETLW 0 ;-----------------------LCD---------------------------------------- CONTROL BCF PORT_A,RS ;ESTA RUTINA GENERA LAS GOTO DATO2 ;SEŅALES DE CONTROL Y ENVIA DATO BSF PORT_A,RS ;EL DATO Al MODULO DATO2 BSF PORT_A,E ;CON INTERFACE DE 8 BITS MOVWF PORT_B CALL RETARDO BCF PORT_A,E CALL RETARDO RETLW 0 TABLA2 ADDWF PC,R ;TABLA DE ASCII DT "0123456789" ;****************************************************************** ;--------------------------CONTADOR DE PULSOS------------- SUMA1 BSF REFRESH,0 ;MARCO UN BIT PARA PRESENTAR EN PANTALLA ;SI ES 1, LO MUESTRA SOLO UNA VEZ SUME INCF UNIDAD,1 MOVLW .10 ; VERIFICA SI ES IGUAL A 10 XORWF UNIDAD,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF UNIDAD ; SI LLEGO A 10 LA COLOCO EN CERO ;DECENAS INCF DECENA,1 ;LE SUMO 1 A LA DECENA MOVLW .10 ; VERIFICA SI ES IGUAL A 10 XORWF DECENA,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF DECENA ;CENTENAS INCF CENTENA,1 ;LE SUMO 1 A LA DECENA MOVLW .10 ;VERIFICA SI ES IGUAL A 10 XORWF CENTENA,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF CENTENA ;UNIDAD DE MIL INCF UNIMIL,1 ;LE SUMO 1 A LA DECENA MOVLW .10 ;VERIFICA SI ES IGUAL A 10 XORWF UNIMIL,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF UNIMIL ;DECENA DE MIL INCF DECMIL,1 ;LE SUMO 1 A LA DECENA MOVLW .10 ;VERIFICA SI ES IGUAL A 10 XORWF DECMIL,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF DECMIL ;CENTENA DE MIL INCF CENMIL,1 ;LE SUMO 1 A LA DECENA MOVLW .10 ;VERIFICA SI ES IGUAL A 10 XORWF CENMIL,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF CENMIL ;MILLON INCF MILLON,1 ;LE SUMO 1 A LA DECENA MOVLW .10 ;VERIFICA SI ES IGUAL A 10 XORWF MILLON,W ;PREGUNTA SI=10 BTFSS STATUS,Z ; RETLW 0 CLRF MILLON RETLW 0 ;**************************SENSAR************************* ;DETECTA LOS FLANCOS del SENSOR Y PULSADO DE TECLA ;EL SENSOR ESTA SOBRE UN ENGRANAJE, Y CUENTA LOS "BORDES" ;EN EL MOMENTO DE "SOLTAR" EL PULSADOR QUEDA 'FIJO' EL CONTADOR ;Y APARECE LA PALABRA 'MEMORIA' EN EL LCD ;--------------------------------------------------------- LEER COMF PUERTO,F ;TRANSFORMO LOS CEROS EN UNOS MOVF PORT_A,W ;LEO PORT_A Y GUARDO EN W ANDWF PUERTO,F SENSAR ;SENSOR MAGNETICO BTFSC PUERTO,3 GOTO FLANCO ;SI HAY FLANCO IR A SUMAR GOTO PULSADOR SALIDA MOVF PORT_A,W MOVWF PUERTO ;GUARDO EL ACTUAL PARA LA PROXIMA VEZ RETLW 0 FLANCO CALL SUMA1 ;SI HAY FLANCO, LO SUMO ;Y AHORA PRUEBO EL ESTADO DEL PULSADOR ;-------------------------------------------------------------- PULSADOR ;LEER ESTADO DEL PULSADOR BTFSS PORT_A,2 ;ESTA SIN PRESIONAR (1) SALTO GOTO MARCAR BTFSS REFRESH,2 ;LEO SI YA INDICO QUE PULSARON GOTO SALIDA BCF REFRESH,2 ;BORRO LA MARCA,SOLTARON EL PULSADOR INCF LAP,1 ;SUMA POR CADA FLANCO ASCEND O DESCEND BCF REFRESH,1 ;BORRO PARA QUE ESCRIBA "MEMORIA" GOTO SALIDA MARCAR BSF REFRESH,2 GOTO SALIDA ;======================================================== INICIO NOP ;CLRF UNIDAD MOVLW .255 ;PORQUE APARECE EL CONTADOR EN UNO MOVWF UNIDAD ; Y ASI AL SUMAR EMPIEZA EN CERO (???) CLRF DECENA CLRF CENTENA CLRF UNIMIL CLRF DECMIL CLRF CENMIL CLRF MILLON CLRF LAP CLRF REFRESH CLRF PUERTO MOVLW 0FCH ;FCH='11111100' PROGRAMACION DE PUERTOS TRIS PORT_A ;SEGUN CIRCUITO, 2 ENTRADAS (SENSOR Y PULSADOR) MOVLW 00H TRIS PORT_B ;TODAS SALIDAS BEGIN MOVLW 30H ;INICIO DEL MODULO A 8 BITS CALL CONTROL ;Y UNA LINEA ;MOVLW 07H ;SELECCIONA MODO ROTAR,EL MENSAJE SALE DE LA DERECHA Y PASA A IZQ. MOVLW 06H ;modo fijo a la izq y se agregan a la derecha CALL CONTROL ;EL MENSAJE MOVLW 0CH ;ACTIVA EL DISPLAY CALL CONTROL ;************************MOSTRAR MARCA************************** ; MICROPIC 2001 * ;*************************************************************** CALL RETARDO MP2001 ;ESCRIBE CONTADOR EN EL LCD, BTFSC REFRESH,1 GOTO PRINCIPAL MOVLW " " CALL DATO CALL RETARDO ;PODRIA EMPLEAR UNA TABLA ;Y DECREMENTAR UN CONTADOR MOVLW " " ;CON LA CANTIDAD DE CARACTERES CALL DATO ;PERO ESTO ES MUY FACIL!!!! CALL RETARDO MOVLW "C" CALL DATO CALL RETARDO MOVLW "O" CALL DATO CALL RETARDO MOVLW "N" CALL DATO CALL RETARDO MOVLW "T" CALL DATO CALL RETARDO MOVLW "A" CALL DATO CALL RETARDO MOVLW "D" CALL DATO CALL RETARDO MOVLW "O" CALL DATO CALL RETARDO MOVLW "R" CALL DATO CALL RETARDO MOVLW " " CALL DATO CALL RETARDO MOVLW "2" CALL DATO CALL RETARDO MOVLW "0" CALL DATO CALL RETARDO MOVLW "0" CALL DATO CALL RETARDO MOVLW "1" CALL DATO CALL RETARDO MOVLW .25 MOVWF DELAY2 RETAR3 MOVLW .255 MOVWF DELAY1 ;RETARDO DE VISUALIZACION DE MARCA DECRE1 CALL RETARDO ;SOLO APARECE EN EL RESET DE INICIO DECFSZ DELAY1,R GOTO DECRE1 DECFSZ DELAY2,R GOTO RETAR3 ;==================================================================== PRINCIPAL CALL LEER ;SI ESTA PULSADO, QUEDA FIJO LA LECTURA BTFSC LAP,0 ;PERO CONTINUA CONTANDO PULSOS GOTO MEMORY ;PRINCIPAL BTFSS REFRESH,0 ;SI BIT=1 MOSTRAR, LUEGO LO PONGO EN 0 GOTO PRINCIPAL ;PARA NO PERDER TIEMPO EN MOSTRAR LO MISMO GOTO MOSTRAR MEMORY ;ESCRIBE "MEMORIA" EN EL LCD, MANTIENE FIJO EL VALOR DEL CONTADOR BTFSC REFRESH,1 ;PARA UNA FACIL VISUALIZACION, PERO SIGUE GOTO PRINCIPAL ;INTERNAMENTE ACTUALIZANDO LA CUENTA DE MOVLW " " ;PULSOS CALL DATO CALL RETARDO MOVLW "M" CALL DATO CALL RETARDO MOVLW "E" CALL DATO CALL RETARDO MOVLW "M" CALL DATO CALL RETARDO MOVLW "O" CALL DATO CALL RETARDO MOVLW "R" CALL DATO CALL RETARDO MOVLW "I" CALL DATO CALL RETARDO MOVLW "A" CALL DATO CALL RETARDO BSF REFRESH,1 ;MEMORIZO QUE YA ESCRIBIO GOTO PRINCIPAL ;*************************************************** MOSTRAR BCF REFRESH,0 ;BORRO BIT PORQUE YA LO MUESTRO ; MOVLW 0 ;INICIA EL ENVIO DE DATOS ; MOVWF R0C ;AL MODULO BLANK MOVLW 01H ;BORRA DISPLAY CALL CONTROL CICLO MOVWF " " ;PARA DESPLAZAR UN CARACTER (00H) QUE NO ES VISIBLE CALL DATO ;Y EMPIECE A ESCRIBIR EN 01H DEL DISPLAY CALL RETARDO ;CALL LEER MOVF MILLON,W ;IMPRIMO VALOR DE "MILLON" CALL TABLA2 ;PASO DEL NUMERO AL ASCII CALL DATO ;INFORMO AL LCD QUE ENVIO UN "DATO" CALL RETARDO ;RETARDO POR EL LENTO LCD CALL LEER ;VOY A LEER POR SI HAY CAMBIOS EN SENSOR ;O PULSADOR DE "MEMORIA" MOVF CENMIL,W ; CALL TABLA2 ;IMPRIMO VALOR DE CENTENA DE MILLON CALL DATO CALL RETARDO ;CALL LEER MOVF DECMIL,W ;DECENA DE MILLON CALL TABLA2 CALL DATO CALL RETARDO CALL LEER MOVF UNIMIL,W ;UNIDAD DE MILLON CALL TABLA2 CALL DATO CALL RETARDO ;CALL LEER MOVF CENTENA,W ;CENTENA CALL TABLA2 CALL DATO CALL RETARDO CALL LEER MOVF DECENA,W ;DECENA CALL TABLA2 CALL DATO CALL RETARDO ;CALL LEER MOVF UNIDAD,W ;UNIDAD CALL TABLA2 CALL DATO CALL RETARDO CALL LEER GOTO PRINCIPAL ;************************************************************************ END