primero que nada saludos a todos, lo que pasa es que no se como poder manejar registros grandes (80 bits para ser mas exacto) en realidad lo puedo hacer pero dividiendo los 80 bits en 10 partes dejando asi 10 registros de 8 bits pero ese metodo me trae muchos problemas despues para manipular ese byte ya que los 80 bits son para unos shift register de 8 bits los cuales controlan las columnas de unas matrices osea solo para la primera matriz utilizo los primeros 5 bits por lo que me quedan 3 bits en el primer registro y los siguientes 2 en el segindo registro y es hay donde tengo los problemas ya que no se como poder despues modificar esos dos registros para solo tocar los ultimos 3bits y los primeros dos bits correspondiente a la 5 columnas de la segunda matriz
bueno la matriz esta compuesta por 16 matrices bicolores por lo que da un total de 1120 leds osea una matriz de 7x80 de la cual ya he logrado hacer algunas cosas pero no de mucha importancia bueno tambien coloco un ejemplo de lo que he hecho para solo encender las 5 columnas de la primera matriz y dejar la 2 sin encender y luego encender la tercera y asi sucesivamente
Codigo:
LIST p=16F628A
include "P16F628A.inc"
__config 0x3D18
errorlevel -302
;----------------------------------------------------------------------
;----------------------------------------------------------------------
#DEFINE SRCLK PORTA,0 ; 74hc595 clock
#DEFINE SRLAT PORTA,1 ; 74hc595 latch
#DEFINE SRDAT PORTA,2 ; 74hc595 data
;----------------------------------------------------------------------
;----------------------------------------------------------------------
cblock 0x20 ; definicion de registros
sr_tmp ; este es utlilizado para un contador para enviar los datos en cadenas de 1 byte
sr_sr ; este es utlilizado para hacer una copia de bufferx para manipular los datos a enviar de forma serial
BUFFER0 ; estos son los registros en donde almaceno los 80 bits
BUFFER1 ; de forma dividida, osea en cada uno almaceno 8 bits
BUFFER2 ; y es esto lo que en realidad quisiera evitar almacenando
BUFFER3 ; todo en un solo buffer
BUFFER4 ;
BUFFER5 ;
BUFFER6 ;
BUFFER7 ;
BUFFER8 ;
BUFFER9 ;
endc
;----------------------------------------------------------------------
;----------------------------------------------------------------------
org 0x0000 ;
;
movlw 0x07 ; apaga los comparadores de este micro, eliminando estas lineas el programa
movwf CMCON ; deberia trabajar sin problemas sobre un 16f84
bsf STATUS,RP0 ; selecciono banco 1
movlw b"00000000" ; configuro todos los puertos y pines como salidas
movwf TRISB ;
movlw b"00000000" ;
movwf TRISA ;
bcf STATUS,RP0 ; vuelvo al banco 0
;----------------------------------------------------------------------
;----------------------------------------------------------------------
INICIO
movlw b"00011111" ; los datos a enviar de forma serial
movwf BUFFER0 ; y los almaceno en el buffer
movlw b"01111100" ;
movwf BUFFER1 ;
movlw b"11110000" ;
movwf BUFFER2 ;
movlw b"11000001" ;
movwf BUFFER3 ;
movlw b"00000111" ;
movwf BUFFER4 ;
movlw b"00011111" ;
movwf BUFFER5 ;
movlw b"01111100" ;
movwf BUFFER6 ;
movlw b"11110000" ;
movwf BUFFER7 ;
movlw b"11000001" ;
movwf BUFFER8 ;
movlw b"00000111" ;
movwf BUFFER9 ;
;
call ENVIA_SPI ; llamo a la subrutina que me emula una comunicacion SPI enviandome
; los datos de forma serial.
bsf SRLAT ; una vez terminado el envio mando un pulso de latch el cual activa los shift register
nop ; una diminuta demora para asegurar de que se lea con exito el pulso
bcf SRLAT ;
;
goto INICIO ; vuelvo a inicio
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
ENVIA_SPI
movlw d"8" ; coloco en 8 el registro sr_tmp para generar un contador de pulsos de reloj
movwf sr_tmp ; para los shift registers
movf BUFFER9,w ; paso el contenido de bufferx a w para hacer una copia del mismo
movwf sr_sr ; hago la copia de bufferx en sr_sr
CALL ENVIA ; llamo a la subrutina que me envia el contenido de bufferx
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER8,w ; **** se repite todo para poder enviar todos los buffers ****
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER7,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER6,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER5,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER4,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER3,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER2,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER1,w ;
movwf sr_sr ;
CALL ENVIA ;
movlw d"8" ;
movwf sr_tmp ;
movf BUFFER0,w ;
movwf sr_sr ;
CALL ENVIA ;
return ;
ENVIA
bcf SRDAT ; coloca a cero el pin de datos si es que esta en alto
rlf sr_sr,f ; rota el contenido de sr_sr
btfsc STATUS,C ; la verdad no se bien lo que hace esta linea pero comprueba si el ultimo bit de sr_sr es 1 o 0
bsf SRDAT ; enviando un pulso de dato si es 1 y si es 0 se salta una linea
nop
bsf SRCLK ; pone en 1 el pin clock
nop
bcf SRCLK ; pone en 0 el pin clock
decfsz sr_tmp,f ; decrementa sr_tmp y si no es cero prosigue con el envio y si llega a cero salta una linea dando
; fin a esta subrutina
goto ENVIA ;
return
goto INICIO ;
end ;fin
bueno pronto colocare mas datos de esto mismo por si alguien quisiera experimentar con estas matrices
-==XooTRAooX==-