;****************************************************************************************************************************
;              MATRIZ 8x8 con scroll de mensaje para PIC 16F84A, reloj a 4Mhz, registro de desplazamiento 74HC164
;****************************************************************************************************************************


 __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
                      
                      LIST P=16F84A                     
                      #include P16F84A.inc             

                      CBLOCK  0x0C
          
;registros de rutina transmisión bits a registro de desplazamiento.

                      MASCARA
                      ALMACEN     
                      CONTADOR
                    
;registros para matriz.

	              FILA1		
	              FILA2		
	              FILA3		
	              FILA4		
	              FILA5			
	              FILA6		
	              FILA7	
	              FILA8		

	              FILA9			
	              FILA10			
	              FILA11		
	              FILA12		
	              FILA13			
	              FILA14		
	              FILA15
	              FILA16

;registros para diversos controles.
			
                      CONTROL
                      VECES
                      ROTACION

;registro para puntero indicador de la tabla.

                      PUNTERO

                      ENDC

BData	              EQU	  3
BClock	              EQU	  2


	              ORG	  0x00
	              goto	  INICIO
                      ORG	  0x05

;****************************************************************************************************************************
;TABLA DONDE SE GUARDA LA INFORMACIÓN A MOSTRAR, NOTA: ES MEJOR COLOCAR LAS TABLAS AL INICIO DEL PROGRAMA PARA EVITAR
;PROBLEMAS CON EL PCL, YA QUE SI EL PROGRAMA ES LARGO SE PUEDE DESBORDAR Y NO HACER EL RECORRIDO COMPLETO DE TODA LA
;TABLA.
;****************************************************************************************************************************

TABLA                 addwf       PCL,F
                
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'                   ;espacio en blanco
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'

                      retlw       h'0'                   ;A
                      retlw       h'1C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'3E'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'

                      retlw       h'0'                   ;B
                      retlw       h'3C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'3C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'3C'

                      retlw       h'0'                   ;C
                      retlw       h'1C'
                      retlw       h'22'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'22'
                      retlw       h'1C'

                      retlw       h'0'                   ;D
                      retlw       h'38'
                      retlw       h'24'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'24'
                      retlw       h'38'

                      retlw       h'0'                   ;E
                      retlw       h'3E'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'3C'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'3E'

                      retlw       h'0'                   ;F
                      retlw       h'3E'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'3C'     
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'

                      retlw       h'0'                   ;G
                      retlw       h'1C'
                      retlw       h'22'
                      retlw       h'20'
                      retlw       h'26'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'1C'

                      retlw       h'0'                   ;H
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'3E'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'

                      retlw       h'0'                   ;I
                      retlw       h'1C'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'1C'

                      retlw       h'0'                   ;J
                      retlw       h'E'
                      retlw       h'4'
                      retlw       h'4
                      retlw       h'4'
                      retlw       h'4'
                      retlw       h'24'
                      retlw       h'18'

                      retlw       h'0'                   ;K
                      retlw       h'22'
                      retlw       h'24'
                      retlw       h'28'
                      retlw       h'30'
                      retlw       h'28'
                      retlw       h'24'
                      retlw       h'22'

                      retlw       h'0'                   ;L
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'3E'

                      retlw       h'0'                   ;M
                      retlw       h'22'
                      retlw       h'36'
                      retlw       h'2A'
                      retlw       h'2A'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'

                      retlw       h'0'                   ;N
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'32'
                      retlw       h'2A'
                      retlw       h'26'
                      retlw       h'22'
                      retlw       h'22'

                      retlw       h'1C'                  ;Ñ
                      retlw       h'0'
                      retlw       h'22'
                      retlw       h'32'
                      retlw       h'2A'
                      retlw       h'26'
                      retlw       h'22'
                      retlw       h'22'

                      retlw       h'0'                   ;O
                      retlw       h'1C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'1C'

                      retlw       h'0'                   ;P
                      retlw       h'3C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'3C'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'20'

                      retlw       h'0'                   ;Q
                      retlw       h'1C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'2A'
                      retlw       h'24'
                      retlw       h'1A'

                      retlw       h'0'                   ;R
                      retlw       h'3C'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'3C'
                      retlw       h'28'
                      retlw       h'24'
                      retlw       h'22'

                      retlw       h'0'                   ;S
                      retlw       h'1E'
                      retlw       h'20'
                      retlw       h'20'
                      retlw       h'1C'
                      retlw       h'2'
                      retlw       h'2'
                      retlw       h'3C'

                      retlw       h'0'                   ;T
                      retlw       h'3E'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'

                      retlw       h'0'                   ;U
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'1C'

                      retlw       h'0'                   ;V
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'14'
                      retlw       h'8'

                      retlw       h'0'                   ;W
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'2A'
                      retlw       h'2A'
                      retlw       h'2A'
                      retlw       h'14'

                      retlw       h'0'                   ;X
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'14'
                      retlw       h'8'
                      retlw       h'14'
                      retlw       h'22'
                      retlw       h'22'

                      retlw       h'0'                   ;Y
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'22'
                      retlw       h'14'
                      retlw       h'8'
                      retlw       h'8'
                      retlw       h'8'

                      retlw       h'0'                   ;Z
                      retlw       h'3E' 
                      retlw       h'2'
                      retlw       h'4'
                      retlw       h'8'
                      retlw       h'10'
                      retlw       h'20'
                      retlw       h'3E'

                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'                   ;espacio en blanco
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'
                      retlw       h'0'


;****************************************************************************************************************************
;                       INICIALIZACIÓN DEL PROGRAMA
;****************************************************************************************************************************


INICIO	              bsf 	  STATUS,RP0	         ;voy a banco 1
                      clrf        TRISA                  ;puertas A todo salida
                      clrf        TRISB                  ;puertas B todo salida
                      bcf         STATUS,RP0             ;voy a banco 0

                      movlw       d'255'                 ;meto 1 a los registros para evitar que la primera
                                                         ;pantalla quede iluminada al empezar
                      movwf       FILA1
                      movwf       FILA2
                      movwf       FILA3
                      movwf       FILA4
                      movwf       FILA5
                      movwf       FILA6
                      movwf       FILA7
                      movwf       FILA8
                      movwf       FILA9
                      movwf       FILA10
                      movwf       FILA11
                      movwf       FILA12
                      movwf       FILA13
                      movwf       FILA14
                      movwf       FILA15
                      movwf       FILA16

                      movlw       d'29'                  ;cargo caracteres del letrero en este caso 29
                      movwf       CONTROL                ;incluidos los espacios en blanco
                      clrf        PUNTERO                ;comienza PUNTERO en 0
              

CARGA                 movf        PUNTERO,0              ;muevo contenido dígito a W
                      call        TABLA                  ;llamo a tabla
                      movwf       FILA9                  ;y cargo resultado en FILA9
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w


  
                      call        TABLA                  ;llamo a tabla
                      movwf       FILA10                 ;y cargo resultado en FILA10
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w


              
                      call        TABLA                  ;llamo a tabla
                      movwf       FILA11                 ;y cargo resultado en FILA11
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w



                      call        TABLA                  ;llamo a tabla
                      movwf       FILA12                  ;y cargo resultado en FILA12
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w


              
                      call        TABLA                  ;llamo a tabla
                      movwf       FILA13                 ;y cargo resultado en FILA13
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w


              
                      call        TABLA                  ;llamo a tabla
                      movwf       FILA14                 ;y cargo resultado en FILA14
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w



                      call        TABLA                  ;llamo a tabla
                      movwf       FILA15                 ;y cargo resultado en FILA15
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
                      movf        PUNTERO,0              ;y lo cargo en w



                      call        TABLA                  ;llamo a tabla
                      movwf       FILA16                 ;y cargo resultado en FILA16
                      nop
                      incf        PUNTERO,F              ;incremento PUNTERO como offset para tabla
    

;****************************************************************************************************************************
;                     AQUI MUESTRA EL CARACTER EN LOS LEDS DURANTE UN TIEMPO
;****************************************************************************************************************************

             
Principal             movlw       d'7'
                      movwf       VECES
                      movlw       d'8'
                      movwf       ROTACION

Caracter              movf        FILA1,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'11111110'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA2,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'11111101'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA3,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'11111011'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA4,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'11110111'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA5,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'11101111'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA6,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'11011111'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA7,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'10111111'
                      movwf       PORTB
                      call        Retardo_2ms

                      movf        FILA8,0
                      movwf       ALMACEN
                      call        TX
                      movlw       b'01111111'
                      movwf       PORTB
                      call        Retardo_2ms

                      decfsz      VECES,F                ;Es el tiempo que es mostrado en pantalla el caracter antes de cambiar.
                      goto        Caracter
                      call        Rota
                      call        Recarga
                      decfsz      ROTACION,F             ;Número de rotaciones,si las disminuimos se juntan mas los caracteres.
                      goto        Caracter
                      decfsz      CONTROL,F              ;Controla el número de caracteres para empezar de nuevo.
                      goto        CARGA                  ;no han pasado todos los caracteres, pues coje otro.
                      goto        INICIO                 ;si han pasado los caracteres, pues empieza de nuevo.


;****************************************************************************************************************************
;                     RECARGAMOS REGISTRO "VECES" CAMBIANDO EL DATO DAMOS MAS O MENOS VELOCIDAD AL LETRERO
;****************************************************************************************************************************


Recarga               movlw       d'7'                   ;cargamos de nuevo dato en "VECES" para indicar el tiempo
                      movwf       VECES                  ;que se muestra en la matriz el caracter antes de las rotaciones.
                      return


;****************************************************************************************************************************
;                     RUTINA DE ROTACION A LA IZQUIERDA
;****************************************************************************************************************************


Rota                  bcf	  STATUS,C
	              rlf	  FILA9,f
	              rlf	  FILA1,f

	              bcf	  STATUS,C
	              rlf	  FILA10,f
	              rlf	  FILA2,f

	              bcf	  STATUS,C
	              rlf	  FILA11,f
	              rlf	  FILA3,f

	              bcf	  STATUS,C
	              rlf	  FILA12,f
	              rlf	  FILA4,f

	              bcf	  STATUS,C
	              rlf	  FILA13,f
	              rlf	  FILA5,f

	              bcf	  STATUS,C
	              rlf	  FILA14,f
	              rlf	  FILA6,f

	              bcf	  STATUS,C
	              rlf	  FILA15,f
	              rlf	  FILA7,f

	              bcf	  STATUS,C
	              rlf	  FILA16,f
	              rlf	  FILA8,f

	              return


;****************************************************************************************************************************
;                     RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************


TX                    movlw       b'11111111'
                      movwf       PORTB
                      movlw       .8                     ;pone 8 en W
                      movwf       CONTADOR               ;carga contador con 8
                      movlw       0x01
                      movwf       MASCARA
                      
TXLP                  movf        ALMACEN,0
	              andwf	  MASCARA,0		 ;Hacemos ByteActual (AND) FilaActual para determinar el bit a enviar.
	              subwf	  MASCARA,0		 ;[ByteActual(AND)FilaActual] - FilaActual, si esto es cero el bit a enviar es 1, sino 0.
	              bcf	  PORTA,BData		 ;Primero cargamos un 0.
	              btfsc	  STATUS,Z		 ;La operacion anterior es 0?
	              bsf	  PORTA,BData		 ;Si, cargamos un 1 en el bit
	              bsf	  PORTA,BClock		 ;Generamos clock.
	              nop				 ;demora
	              bcf	  PORTA,BClock		
                      bcf         STATUS,C
                      rlf         MASCARA,1
                      decfsz      CONTADOR,F             ;decrementa contador si es 0 salta
                      goto        TXLP
                      return







                      INCLUDE <RETARDOS.INC>             ;subrutinas de control de tiempos de retardo.
                      END
                    
                  

