;Muestra secuencialmente los caracteres escritos en memoria.
;eeprom externa 24LC256 de 32k posiciones, el caracter ocupa 1kbyte por lo que cabrían 32000
;caracteres de 8x8 bits.
;Xytal = 4Mhz.
;PIC = 16F84A.



 __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

              LIST   P=16F84A
              INCLUDE <P16F84A.INC>

              CBLOCK  0x0C
              PAGINA                 ;Guarda el valor de la dirección de memoria a
              POSICION               ;escribir o leer.
              EEPROM                 ;registro de control
              ALMACEN                ;aquí se guarda la informacion para llevarla al registro de desplazamiento  
              CONTADOR               ;contador 8 bits
              REPITE                 ;repetición ciclos en columna
              CONTADOR2              ;contador de número de caracteres mostrados
              FILA1                  ;registro de linea caracter
              FILA2                  ;registro de linea caracter
              FILA3                  ;registro de linea caracter
              FILA4                  ;registro de linea caracter
              FILA5                  ;registro de linea caracter
              FILA6                  ;registro de linea caracter
              FILA7                  ;registro de linea caracter
              FILA8                  ;registro de linea caracter
              ENDC

DI            EQU     7              ;bit de control
DO            EQU     6              ;bit de control

                 
              ORG    0X00            
              goto   INICIO          ;Salto a la primera instruccion
              ORG    0X05            ;Ensamblar desde 05 despues del vector de interrupción



INICIO        bsf    STATUS,RP0      ;pagina 1
              clrf   TRISB           ;portb salidas
              clrf   TRISA           ;porta salidas
              bcf    STATUS,RP0      ;pagina 0
              clrf   PORTB
              clrf   PORTA
              clrf   FILA1
              clrf   FILA2
              clrf   FILA3
              clrf   FILA4
              clrf   FILA5
              clrf   FILA6
              clrf   FILA7
              clrf   FILA8
              clrf   PAGINA          
              clrf   POSICION
              movlw  .3              ;pone 3 en W porque son tres caracteres a mostrar
              movwf  CONTADOR2       ;carga contador con 3
              clrw

;****************************************************************************************************************************
;AQUI HAGO LA LLAMADA A LA MEMORIA PARA IR SACANDO LOS DATOS Y CARGAR LOS REGISTROS
;****************************************************************************************************************************


PRINCIPAL     clrf   PAGINA          ;PAGINA 0x00
              clrf   POSICION        ;POSICION 0x00
              call   I2C_EnviaStart  ;Envía condición de Start.
              movlw  b'10100000'     ;Envía dirección de escritura del esclavo.
              call   I2C_EnviaByte 
              movf   PAGINA,W        ;A partir de la dirección apuntada por los
              call   I2C_EnviaByte   ;registros PAGINA
              movf   POSICION,W      ;y POSICION.
              call   I2C_EnviaByte
              call   I2C_EnviaStop

              call   I2C_EnviaStart  ;Envia condición de Start
              movlw  b'10100001'     ;Indica a la memoria 24LC256 que va a
              call   I2C_EnviaByte   ;proceder a la lectura. 

CARACTER      call   LeeOtroByte
              movwf  FILA1
              call   LeeOtroByte
              movwf  FILA2
              call   LeeOtroByte
              movwf  FILA3
              call   LeeOtroByte
              movwf  FILA4
              call   LeeOtroByte
              movwf  FILA5
              call   LeeOtroByte
              movwf  FILA6
              call   LeeOtroByte
              movwf  FILA7
              call   LeeOtroByte
              movwf  FILA8
              goto   REG


LeeOtroByte   call   I2C_LeeByte     ;Lee la memoria 24LC256.
              return
              
                     
;****************************************************************************************************************************
;AQUI CARGO LOS REGISTROS LLAMADOS FILA_X EN EL REGISTRO ALMACEN PARA SER SACADOS POR REGISTRO DE DESPLAZAMIENTO
;****************************************************************************************************************************


REG           movlw  D'15'           ;cargo registro con 15 para que se visualize el dato 0,25 seg
              movwf  REPITE

              

MUESTRATE     movf   FILA1,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX          
              nop
              movlw  D'254'          ;activo fila 1
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB

              


              movf   FILA2,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'253'          ;activo fila 2
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA3,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'251'          ;activo fila 3
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA4,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'247'          ;activo fila 4
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA5,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'239'          ;activo fila 5
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA6,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'223'          ;activo fila 6
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA7,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'191'          ;activo fila 7
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA8,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'127'          ;activo fila 8
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              decfsz REPITE,1        ;decrementa control salta si vale 0
              goto   MUESTRATE
              decfsz CONTADOR2,F     ;decrementa contador de caracteres salta si es 0       
              goto   CARACTER        ;no es 0 pues siguiente caracter
              call   I2C_EnviaStop   ;es 0 pues para la lectura
              goto   INICIO          ;vuelta a empezar
              
              
;****************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************


TX            movlw  .8              ;pone 8 en W
              movwf  CONTADOR        ;carga contador con 8


TXLP          bcf    EEPROM,DO       ;a 0 bit DO
              btfsc  ALMACEN,0       ;mira el bit 7 de ALMACEN y salta si es 0
              bsf    EEPROM,DO       ;a 1 bit DO
              call   BITOUT 
              rrf    ALMACEN,F       ;rota a izquierda ALMACEN
              decfsz CONTADOR,F      ;decrementa contador si es 0 salta
              goto   TXLP
              return 
         
 

BITOUT        bsf    STATUS,RP0      ;pagina 1     
              movlw  0X00 
              movwf  TRISA           ;puerta A salida
              bcf    STATUS,RP0      ;pagina 0 
 
              btfss  EEPROM,DO       ;mira el bit DO y salta si vale 1
              goto   BITLOW 
              bsf    PORTA,3         ;pone a 1 DATA
              goto   CLOCK

 
BITLOW        bcf    PORTA,3         ;pone a 0 DATA


;****************************************************************************************************************************
;RUTINA DE TRANSMISIÓN SEÑAL DE RELOJ A REGISTRO 74HC164
;****************************************************************************************************************************


CLOCK         bcf    PORTA,2         ;pone a 0 CLOCK
              nop                    ;espera 1 micros
              nop                    ;otro
              nop                    ;otro
              nop                    ;otro
              bsf    PORTA,2         ;pone a 1 CLOCK
              nop                    ;1 micros 
              return


;****************************************************************************************************************************
              INCLUDE <BUS_I2C.INC>  ;subrutinas protocolo I2C
              INCLUDE <RETARDOS.INC> ;subrutinas de control de tiempos de retardo.
              END
