list p=16F84 include "p16F84.inc" __FUSES _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON ;******************************************************************************* ; Define variables ;******************************************************************************* #define RAM0 bcf STATUS,RP0 #define RAM1 bsf STATUS,RP0 COLUMNA equ 0x30 SALVA equ 0x40 ;******************************************************************************* ; Inicialización de registros y puertos ;******************************************************************************* org 0x00 goto START org 0x05 START clrf PORTA ;Limpia puerto RA clrf PORTB ;Limpia puerto RB clrf PCLATH ;Limpia Pclath RAM1 ;Cambio a RAM1 movlw B'00000000' ;Programa puerto RB como salida movwf TRISB^80h ;Truco, así no se queja el compilador movlw B'00011111' ;Programa puerto RA salida movwf TRISA^80h ; movlw B'10000000' ;Deshabilita PullUp, asigna timer0 movwf OPTION_REG^80h ; bcf INTCON,7 ;Deshabilita interrupciones RAM0 ;Cambia a RAM0 ;******************************************************************************* ; Programa principal ;******************************************************************************* BUCLE movlw d'107' ;Carga en el reg.COLUMNA el número movwf COLUMNA ;de columnas a imprimir call DISPLAY_OFF ;Apaga el display BUCLE_bis ;Espera flanco de subida del fotosensor btfss PORTA,4 ;¿Llegó pulso positivo del fotosensor? goto BUCLE_bis ;-No, cierra bucle en espera de pulso BUCLE_bis_2 btfsc PORTA,4 ;¿Llegó pulso negativo del fotosensor? goto BUCLE_bis_2 ;-No, cierra bucle en espera de pulso call PRINT ;-Si, salta para imprimir goto BUCLE ;Cierra el bucle indefinidamente ;******************************************************************************* ; Sub-rutinas ;******************************************************************************* ;------------------------------------------------------------------------------- ; Rutina para imprimir en el display ;------------------------------------------------------------------------------- PRINT call TEXTO ;Salta a buscar el texto movwf PORTB ;Imprime en el display call TEMPORIZA ;Tiempo para que se vea la columna decf COLUMNA,F ;Número de columnas a imprimir movf COLUMNA,F ;Lee el reg.COLUMNA skpnz ;¿es cero el contador de columnas? return ;Si, pues vuelve a programa principal goto PRINT ;No, salta a leer la siguiente columna ;------------------------------------------------------------------------------- DISPLAY_OFF ;------------------------------------------------------------------------------- clrf 0x10 ;Carga indirecta del reg.W decf 0x10,F ;con el valor FF movf 0x10,W ;para apagar el display movwf PORTB ;Apaga el display return ; ;------------------------------------------------------------------------------- TEXTO ;Lo he puesto en perfecto binario para que se vean las letras (con '0') ;------------------------------------------------------------------------------- movf COLUMNA,W ;Lee contador movwf 0x11 ;Muevelo al registro 0x11 decf 0x11,F ;Decrementa este registro movf 0x11,W ;Carga reg.W con el valor del reg. 0x11 addwf PCL,F ;Suma al cont. de prog. para salto ;------------------------- retlw B'00111111' ; retlw B'11001111' ; retlw B'11110011' ; retlw B'11111100' ; V retlw B'11110011' ; retlw B'11001111' ; retlw B'00111111' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'11111111' ; retlw B'00000000' ; I retlw B'11111111' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'11000011' ; retlw B'10111101' ; retlw B'10111101' ; retlw B'01111110' ; C retlw B'01111110' ; retlw B'01111110' ; retlw B'10111101' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'01111111' ; retlw B'01111111' ; retlw B'01111111' ; retlw B'00000000' ; T retlw B'01111111' ; retlw B'01111111' ; retlw B'01111111' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'10000001' ; retlw B'01111110' ; retlw B'01111110' ; retlw B'01111110' ; O retlw B'01111110' ; retlw B'01111110' ; retlw B'10000001' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'00000000' ; retlw B'01110111' ; retlw B'01110111' ; retlw B'01110111' ; R retlw B'01110011' ; retlw B'01110101' ; retlw B'10001110' ; ;------------------------- retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio ;------------------------- retlw B'01111111' ; retlw B'10111111' ; retlw B'11011111' ; retlw B'11100000' ; Y retlw B'11011111' ; retlw B'10111111' ; retlw B'01111111' ; ;------------------------- retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio retlw B'11111111' ;Espacio ;------------------------- retlw B'11000000' ; retlw B'10110111' ; retlw B'01110111' ; retlw B'01110111' ; A retlw B'01110111' ; retlw B'10110111' ; retlw B'11000000' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'11111111' ; retlw B'00000000' ; I retlw B'11111111' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'00000000' ; retlw B'10111111' ; retlw B'11011111' ; retlw B'11101111' ; N retlw B'11110111' ; retlw B'11111011' ; retlw B'00000000' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'00000000' ; retlw B'11101111' ; retlw B'11101111' ; retlw B'11101111' ; H retlw B'11101111' ; retlw B'11101111' ; retlw B'00000000' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'10000001' ; retlw B'01111110' ; retlw B'01111110' ; retlw B'01111110' ; O retlw B'01111110' ; retlw B'01111110' ; retlw B'10000001' ; ;------------------------- retlw B'11111111' ;Espacio ;------------------------- retlw B'11000000' ; retlw B'10110111' ; retlw B'01110111' ; retlw B'01110111' ; A retlw B'01110111' ; retlw B'10110111' ; retlw B'11000000' ; ;------------------------------------------------------------------------------- ; Temporización de 500 u-segundos ;------------------------------------------------------------------------------- TEMPORIZA movwf SALVA ;Salva registro W bsf STATUS,RP0 ;Cambia a RAM1 movlw B'10000101' ;Asigna preScaler y predivisión /64 (101) movwf OPTION_REG^80h ; clrf INTCON ;Prepara reg.INTCON control de tiempo bcf INTCON,T0IF ;Borra flag control tiempo bcf STATUS,RP0 ;Cambia a RAM0 movlw 0XF8 ;Carga temporizador, regula ancho colum. movwf TMR0 ;para 0.5 ms. BUCLE_TEMPO ; btfss INTCON,T0IF ;Analiza flag activado por timer0 goto BUCLE_TEMPO ;Bucle hasta temporización completa movf SALVA,W ;Recupera registro W return ; ;------------------------------------------------------------------------------- END