; CARTEL DE LEDS. de 8x8. Pruebas de transmisión de un caracter almacenado en columnas.
; Xtal = 4 Mhz


                      list p=16F84A                      ;Microcontrolador utilizado
                      #include P16F84A.inc               ;Definicion de registros SFR

 
 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC



                      CBLOCK 0x0C      	                 ;En esta posicion se declaran los registros de usuario
	              
                      MASCARA                            ;mascara para operación AND con ALMACEN
                      ALMACEN                            ;Registro donde se coloca el byte para operación AND con MASCARA
                      FILA                               ;Registro que rota cada 2ms para realizar multiplexión por filas
                      CARACTER                           ;Registro que controla los 8 bytes que forman el caracter

                      ENDC


BData	              equ	  3                      ;pin por donde salen datos al 74HC164
BClock		      equ	  2                      ;pin que ejecuta el clock de transmisión de datos al registro



;****************************************************************************************************************************
;            
;****************************************************************************************************************************

Reset                 org	  0x00
                      goto	  Inicio	         ;Salto a inicio del programa
                      org	  0x05
                 

;****************************************************************************************************************************
;                  Inicio del microcontrolador
;****************************************************************************************************************************


Inicio                bsf         STATUS,RP0             ;Banco 1
                      movlw       0x00
                      movwf       TRISA                  ;puerta A salida
                      movlw       0x00
                      movwf       TRISB                  ;puerta B salida
                      movlw       b'00000110'    
                      bcf         STATUS,RP0             ;Banco 0

	              clrf	  PORTA                  ;limpio registros
                      clrf        MASCARA
                      clrf        FILA
                      clrf        CARACTER

                      movlw       b'11111111'            ;aseguramos todas las filas apagadas
                      movwf       PORTB
                      
                      movlw       b'11111110'            ;registro de filas empieza activada la fila 1
                      movwf       FILA
                      
                      movlw       b'00000001'            ;cargo 1 en mascara
                      movwf       MASCARA
                      
                      movlw       .8
                      movwf       CARACTER               ;8 bytes forman el caracter


;****************************************************************************************************************************
;           AQUI LLAMO A LOS BYTES QUE CONFORMAN EL CARACTER
;****************************************************************************************************************************


Dato                  call        byte_1
                      movwf       ALMACEN
                      call        TX
                      call        byte_2
                      movwf       ALMACEN
                      call        TX
                      call        byte_3
                      movwf       ALMACEN
                      call        TX
                      call        byte_4
                      movwf       ALMACEN
                      call        TX
                      call        byte_5
                      movwf       ALMACEN
                      call        TX
                      call        byte_6
                      movwf       ALMACEN
                      call        TX
                      call        byte_7
                      movwf       ALMACEN
                      call        TX
                      call        byte_8
                      movwf       ALMACEN
                      call        TX

                      movf        FILA,0                 ;muevo el contenido de FILA a PORTB
                      movwf       PORTB                  ;para activar la salida que corresponda del PORTB
                      call        Retardo_2ms            ;durante 2 ms
      


                      bcf         STATUS,C               ;evito acarreos
                      rlf         MASCARA                ;roto mascara para siguiente dato de operación AND
                      bsf         STATUS,C               ;evito acarreos
                      rlf         FILA                   ;roto fila para sigiente fila de la multiplexación
                      decfsz      CARACTER,1             ;controlo si pasaron ya los 8 bytes del caracter
                      goto        Dato                   ;no, pues siguiente dato a registro
	              goto        Inicio                 ;si, pues vuelta a empezar
                      

   
;****************************************************************************************************************************
;                 Rutina envia bit
;****************************************************************************************************************************



TX                    movlw       b'11111111'
                      movwf       PORTB
                      movf        ALMACEN,0
	              andwf	  MASCARA,0		 ;Hacemos ALMACEN (AND) MASCARA para determinar el bit a enviar.
	              subwf	  MASCARA,0		 ;[ALMACEN (AND) MASCARA] - MASCARA, 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
	   

                      bcf         PORTA,BClock           ;pone a 0 CLOCK
                      nop                                ;espera 1 micros (a 4Mhz)
                      nop                                ;otro
                      nop                                ;otro
                      nop                                ;otro
                      bsf         PORTA,BClock           ;pone a 1 CLOCK
                      nop                                ;1 micros		
                      return`
                            
;****************************************************************************************************************************
;                                                     CARACTER
;****************************************************************************************************************************

byte_1                movlw       b'11111111'
                      return

byte_2                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_3                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_4                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_5                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_6                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_7                movlw       b'11111111'
                      movwf       ALMACEN
                      return

byte_8                movlw       b'11111111'
                      movwf       ALMACEN
                      return

                      
                      INCLUDE <RETARDOS.INC>             ;subrutinas de control de tiempos de retardo.
                      END
                   

