# Matriz de leds 8x32



## italoper (Jul 8, 2013)

hola amigos tengo que hacer una matriz de leds de 8x32 y no se como hacerlo pues tengo que hacerlo en mplab y con pic 16f628a busque en Internet y nada solo encontré un archivo de una matriz de 8x8 pero solo muestra letra por letra y no se desplaza
ojala y me puedan ayudara a modificar el programa para hacerlo desplazar 
este es el programa








```
//CONFIGURACION///////////////////
#include<16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=4000000)
#define DATA  PIN_A0
#define CLK   PIN_A1
#define RESET PIN_A2

void config(void){
        set_tris_b(0x00);
        set_tris_a(0x20);
        setup_comparator(NC_NC_NC_NC);
}

void SEND_DATA0(void){
        output_low(DATA);
        delay_us(2);
        output_low(CLK);
        delay_us(2);
        output_high(CLK);
}

void SEND_DATA1(void){
        output_high(DATA);
        delay_us(2);
        output_low(CLK);
        delay_us(2);
        output_high(CLK);
}


void main(void){
        int H[]={0b01000010,0b01000010,0b01000010,0b01111110,0b01000010,0b01000010,0b01000010,0b01000010};//"H" 
        int O[]={0b00111100,0b01000010,0b01000010,0b01000010,0b01000010,0b01000010,0b01000010,0b00111100};//"O"
        int L[]={0b01111110,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000};//"L"
        int A[]={0b01000010,0b01000010,0b01000010,0b01111110,0b01000010,0b01000010,0b00100100,0b00011000};//"A"
        int i;
        long j;
        config();
        output_bit(RESET,1);  // "ON"
        output_bit(CLK,0);
        output_bit(DATA,0);

        while(TRUE){
            for(j=0;j<=25;j++){
                for(i=0;i<=7;i++){
                    output_b(H[i]);            //H
                    delay_ms(5);
                    SEND_DATA1();
                }
                SEND_DATA0();
            }

            for(j=0;j<=25;j++){
                for(i=0;i<=7;i++){
                    output_b(O[i]);            //O
                    delay_ms(5);
                    SEND_DATA1();
                }
                SEND_DATA0();
            }

            for(j=0;j<=25;j++){
                for(i=0;i<=7;i++){
                    output_b(L[i]);            //L
                    delay_ms(5);
                    SEND_DATA1();
                }
                SEND_DATA0();
            }    

            for(j=0;j<=25;j++){
                for(i=0;i<=7;i++){
                    output_b(A[i]);            //A
                    delay_ms(5);
                    SEND_DATA1();
                }
                SEND_DATA0();
            }

            for(j=0;j<=25;j++){
                for(i=0;i<=7;i++){
                    output_b(0X00);            //" "
                    delay_ms(5);
                    SEND_DATA1();
                }
                SEND_DATA0();
            }
        }
}
```
*Nota del Moderador:*

Para que sepas cómo agregar archivos, fotos, etc. Visita este tema.

*¿Cómo subo imágenes, archivos y demás?*​


----------



## MrCarlos (Jul 8, 2013)

Hola italoper

Podríamos ver tu circuito ??. . . porque por ejemplo: Qué Shift Register(Registro De Desplazamiento) estás utilizando??.

Comprime con WinZip o WinRar el archivo que se genera con tu simulador para circuitos electrónicos y adjúntalo aquí.

Al ver ese circuito se podrá dar una ayuda más efectiva y rápida.

Puedes adjuntar tambien una imagen de ese circuito.

saludos
a sus ordenes


----------



## savad (Ago 18, 2013)

Hace años hice una marquesina con el z-80 aqui esta el pseudo-codigo, codigo y test
espero que te sea útil


```
; DPLAZA_DER = Desplaza caracteres del Display hacia la derecha
; Esta rutina se llama con 
;	Reg-A = caracter a insertar al inicio de la ventana (WIN1_STR)
;	Reg-E = AAH   si se desea recircular caracter (WIN1_END) a (WIN1_STR)
;
; Desplaza hacia la derecha todos los caracteres del display
;   y el último caracter (WIN1_END)
;		ó se remplaza por caracter recibido
;		ó se pone en posición (WIN1_STR),
;         dependiendo si reg-E es ajustado a 0AAH antes de entrar a la rutina.
;
; Se deshabilitan las interrupciones, mientras se ejecuta la rutina
; 
; Toma referencia de PSEUDO-Instrucciones Globales para el Assambler
  Num_Char_Dply  EQU 15    ; Numero de caracteres que tiene el Display - 1
;
; Toma referencia de variables Globales (RAM)
;	WIN1_STR = Inicio de Ventana del display
;	WIN1_END = Final  de Ventana del display
;
; Usa los registros:
;   HL como apuntador de los caracteres del display
;    A para mover caracteres
;    B como almacén de caracter recivido
;    C como contador interno de posición
;    D como almacén de caracter a reciclar en caso deseado
;	 E como indicador que queremos circular último a primer (0AAH)
;
DPLAZA_DER:								; Inicia
;
     Deshabilita interrupciones
;
; Como cultura siempre guardamos los registros utilizados y status 
;  así no interferimos con otras rutinas. Se puede quitar para
;  ahorrar memoria y velocidad, ya que la carga es significativa
;  PUSH/POP's son lentos... usan de 21 a 29 T-states por par
;  
	Guarda en el stack:
    	Acumulador y Banderas AF
		Registro BC
		Registro HL
;
	Guarda el caracter que se recivio en reg-B
	Inicializa contador (C) a Zero 
 	Ajusta apuntador (HL) a dirección de WIN1_END
	Obten caracter en WIN1_END y salvalo en registro D
LOOP:
	Incrementa contador (C=C+1)
	Obten en Accumulador caracter en WIN1_END - (Contador -1)
	y salvalo en su nueva posición hacia la derecha = WIN1_END - (Contador)
	Es contador igual Num_Char_Dply
		No:
			regresa a LOOP para desplazar todas las posiciones del Display
		Si: 
; Revisa si se quiere recircular en la primera pocisión el caracter
; 	que ocupaba la última posición del display
			Es reg_E = 0AAH ( recicla)
					No:
						Recupera caracter que se recivio
						Continua en NEXT
					Si:
						recupera último
		NEXT:	Coloca caracter apropiado en primero
				Restaura del stack:
					Registro HL
					Registro BC
					Acumulador y Banderas AF
		Habilita interupciones
		Regresa a programa principal
		
Implementación Z-80
;
DPLAZA_DER:
		DI						; Deshabilita interrupciones
		PUSH	AF				; Salva Accumulador y Status
		PUSH	BC				; y registros que usamos
		PUSH	HL
		LD		B, A			; Guarda caracter que se recivio
		XOR		A				; Ajusta contador a 00H
		LD		C, A
		LD		HL, WIN1_END	; Ajusta apuntador al final de ventana
		LD		A, (HL)			; Obten caracter en WIN1_END
		LD		D, A			;  y guardalo en registro temporal
LOOP:
		INC		C				; Incrementa Contador
		DEC		HL				; Apunta al previo caracter
		LD		A, (HL)			;  y obtenlo
		INC		HL				; Apunta al desplazamiento
		LD		(HL), A			;  y desplaza caracter hacia la derecha
		DEC		HL				; Ajusta para procesar siguiente caracter
		CMP		C, Num_Char_Dply	; Ve si ya desplazamos todos
		JR		NZ, LOOP		; No, Regresa hasta que se hallan desplazado
								;     Todos los caracteres
REV_E:                          ; Si,  Revisa reg_E para ver si
		CMP		E, 0AAH			;      Recirculamos último a primero?
		JR		NZ, NO_E		; No,  asi que ajusta que vamos a incertar
		LD		A, D			; Si, Recupera último
		JR		NEXT
;		
NO_E:	LD		A, B			;      caracter que se recivio
;
NEXT:
		LD		(HL), A			;      y ponlo en primero
		POP		HL				; Restaura Registros
		POP		BC
		POP		AF
		EI						; Habilita interrupciones
		RET						; Regresa a programa principal
		
		
		
Ejemplo de uso:

; Directrices para el assambler
;
Num_Char_Dply	EQU 15    	; Número de caracteres que tiene el Display - 1
WIN1_STR		EQU 1000H	; Dirección RAM a inicio de ventana
WIN1_END		EQU 100FH	; Dirección RAM a final  de ventana
;
; carga mensaje en memoria
				ORG	1000H
Mensaje:		DB 'COME A TUS HORAS', 0
;
				ORG 100H				; En cpm todas las rutinas inician aqui
INICIA:			LD		E, 0AAH			; Indica que reciclamos último a primero
				CALL	DPLAZA_DER		; Desplaza hacia derecha
				XOR		A				; Incerta caracter en blanco
				LD		E, A			;  Asi que no reciclamos
				CALL	DPLAZA_DER		; Desplaza hacia derecha
				HALT



	'TEST desplaza derecha

	    Reg-L  e d c b a 9 8 7 6 5 4 3 2 1 0 
	    Reg-A  A R o H " S U T " A " E M O C S
		Reg-C  1 2 3 4 5 6 7 8 9 a b c d e f 
	    Reg-D  S
	    Reg-E  AA

	1000H = C  c c c c c c c c c c c c c c c S 
	1001H =	o  o o o o o o o o o o o o o o C
	1002H =	M  m m m m m m m m m m m m m O  
	1003H =	E  e e e e e e e e e e e e M
	1004H =	"  " " " " " " " " " " " E
	1005H =	A  a a a a a a a a a a "
	1006H =	"  " " " " " " " " " A
	1007H =	T  t t t t t t t t "
	1008H =	U  u u u u u u u T
	1009H =	S  s s s s s s U
	100aH =	"  " " " " " S
	100bH =	H  h h h h "
	100cH =	O  o o o H
	100dH =	R  r r o
	100eH =	A  a R 
	100fH =	S  A
```


----------

