#include <16f88.h>
#fuses XT,NOWDT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=4000000)
#define max 50
#use fast_io(a)
#use fast_io(b)
int i,j,min=0,maxi=8,cont=0;
int const data[208]={48,120,204,204,252,204,204,204,248,204,204,248,248,204,204,248,252,
192,192,192,192,192,192,252,240,200,204,204,204,204,200,240,252,192,192,240,240,192,192,252,252,
192,192,240,240,192,192,192,60,64,192,192,216,204,204,248,204,204,204,204,252,204,204,204,252,
48,48,48,48,48,48,252,252,48,48,48,48,48,176,224,196,200,208,224,208,204,204,204,192,
192,192,192,192,192,192,252,238,214,214,198,198,198,198,198,196,228,244,212,212,204,204,196,48,
204,204,204,204,204,204,48,248,204,204,204,248,192,192,192,56,196,196,196,196,212,200,52,248,
204,204,204,248,208,200,196,120,204,192,192,120,12,12,248,252,48,48,48,48,48,48,48,204,
204,204,204,204,204,204,120,204,204,204,204,204,204,72,48,198,198,198,198,198,214,214,238,132,
132,72,48,48,72,132,132,204,204,204,120,48,48,48,48,252,252,8,16,32,64,252,252};
//int enie[8]={56,196,228,244,212,204,204,196};
void main()
{
set_tris_a(0xf8);
set_tris_b(0);
setup_adc_ports(NO_ANALOGS);
while(true)
{
for(j=0;j<max;j++)
{
for(i=min;i<maxi;i++)
{
output_a(cont);
output_b(data[i]);
delay_ms(1);
cont++;
}
}
output_b(0);
delay_ms(500);
min=maxi;
maxi=maxi+8;
cont=0;
if(maxi>208)
{
min=0;
maxi=8;
}
}
}Desafortunadamente ese es el gran problema de los anuncios de leds de éste tipo, ya que la matriz de leds está íntimamente ligada al proceso de la generación de los mensajes. Lo ideal es que sean dos cosas separadas y que no tengan conocimiento entre sí: que la matriz de leds no reconozca ningún carácter, sólo unos y ceros, y que el generador de animaciones desconozca que "tiene" que manejar una matriz de leds. De esta forma la matriz hace su trabajo electrónico y la animación hace su trabajo en software, pudiendo hacerse en Adobe Premiere, Flash, etc.suena muy interesante lo que dices jacrmr, pero y eso como se podría lograr? esta mal el hardware o el software para hacer algo como dices? cual sería el hw y sw?
pero lo hice con software en un pic16f88
i <3 p88ehh? no entendí :oops:
Bueno... implicaría un cambio radical en el circuito, con PLDs (no es necesario llegar a FPGAs ya que las funciones no son tan complicadas y no se requiere mucha síntesis), y algunos integrados algo raros, como memorias multipuertos síncronas. El problema puede ser que no se justifique la complejidad para manejar una matriz de 7(ú 8 ) por N, ya que sólo es un renglón e independientemente de la resolución horizontal sólo es cuestión de ir aumentando drivers, registros de corrimiento, etc. hasta alcanzar la longitud deseada. El criterio de diseño que menciono es valioso cuando estamos hablando de una matriz más grande y donde la altura del caracter no esté limitada por el tamaño del renglón. Para el caso que mencionas y que estás trabajando en C la verdad no le veo mucha ayuda llegar a manejar punteros. Es que lo veas por donde lo veas en un letrero electrónico como el que mencionas le estás cargando todo el trabajo al software (o mejor dicho al programador del software, o sea tú) y en cambio la matriz y su electrónica muy ligeros casi sin hacer nada. No está mal ni el software ni el hardware, es sólo que en estos letreros se le apostó totalmente al software para hacer el trabajo. Por ejemplo la marca líder de éste tipo de letreros unilínea (Alpha Display) lleva interiormente un sistema mínimo (RAM, ROM, micro) para generar todos sus efectos, producto de una cuidadosa (y muy larga) programación.:roll:
....2 años y medio no es tanto tiempo!! Smile:shock: :shock:
Citar....2 años y medio no es tanto tiempo!! Smile:shock: :shock:
ya me duplicaste el tiempo aitopes :D :D
que bueno es tenerte de vuelta por aca!!
felices fiestas amigo!! :-/ :-/
jajaja ahora entiendo tu código: I <3 p88 2
De hecho pienso cambiar de micro, lamentablemente (porque me gusta más el 88), por un 18f2550, porque tiene más RAM y tiene USB; además que pretendo copiarme la idea de muchos y colocarle también un RTC :mrgreen: y por tanta lata voy a necesitar más pines, espero que no demasiados y no tenga que pasar al 4550
Entonces, AKENAFAB, como me agregas más hardware me ayudarás a rutear :D :D :D
Ahora para utilizar el otro color de la matriz que es lo mejor que puedo hacer??, he pensado en utilizar otros 5 4094-ULN2803 (uno por cada matriz) lo que daría un total de 10 4094-uln2803 y los ENABLES de los 4094 que antes estaban todos directamente a VCC ahora tienen que ser activados con el color correspondente. Lo cual es demasiado hardware, y al ver el ruteo para un solo color en el sector de las matrices está horrible, pensar que van a aparecer muchas más pistas que hacer será solo realizable con muuucha paciencia y algo más. De este mismo modo tendremos en cada ULN resistores para el color adecuado, y creo que a pesar de ser un hardware pesado es el más óptimo.
vale. Vi lo del CAM pero no me salio nada bien, salio a blanco y negro y con cuadritos plomos, estaba intentando en formato PS y EPS para llevarlo al photoshop, pero malos resultados tuve, y como estos esquemas que hago son algo grandes el printscreen no sacará muy bien
ni modo, gracias pro la respuesta AKENAFAB, un saludo
a seguir ruteando
Pueden ver en la foto que la pantalla es RGB. No hay otra manera de manejar una pantalla RGB a full color que no sea una FPGA.
:-/ :-/
Quiero un minipublik :mrgreen:
Me has animado pana Cryn.
xD
Ya me avente el cubo de leds 33.
Me hice el tengucito xD
y quiero publik xD
Lo malo es que no he terminado nada de ninguno y otras cosas más xD.
Pero me lo aviento.
Saludos!
Hay una cosa que no entiendo, por que se utilizan transistores PNP en lugar de transistores NPN, Lo que no entiendo es que si pones la pata del PIC que está conectada al transistor PNP por la base, a "1" entonces estas poniendo un voltaje positivo en la base del PNP, y según tengo entendido estará en corte.
Lo que quiero saber es como funciona el PNP para activar el led, y el porque se pone el integrado ULN2803. (el funcioamiento del CD4094 ya lo entiendo, solo que me descuadra el transistor PNP).
Queremos ver la matriz funcionando !!! :D.
Salu2.
lo que no tenia claro era la logica con la que activavas el PNP, es decir si pones en la salida del PIC un 0 lógico, realmente es como si estubieras conectando los terminales de massa (GND)?
El conexionado de los diodos es con el PNP es colector-anodo/cátodo-GND ?, otra duda es: si en el cd4094 le transmites un 0 lógico, es como si estuvieras poniendo GND en la pin?
Antes que nada felicitaciones Cryn, pues quedo muy bueno tu trabajo :!: :!: :!:Muchas gracias por las felicitaciones y el ánimo nico.
Por otro lado, siendo que este publik esta realizado con matrizes de 8x8, les dejo un ejemplito que tal vez podrias aplicar en el tuyo(si tienes ganas de jugar claro :D). El mismo lo hice cuando empezaba a usar estas divinuras de las matrizes. Se trata de un juego de pong, con dos matrizes de 8x8 que permite un juego de 1 o 2 jugadores, con sonido por pwm e indicacion de juego terminado(GAME OVER).... Estaba simulado con el 16f628 y fue para entretenerme nada mas.....Claro que aqui, lo podrias implementar con puntuacion y nivel.... Solo una idea...El codigo esta en asm y bastante desprolijo, ya que fue hace mucho tiempo y eran mis primero proyectos, de todos modos, si alguien lo quiere, lo colgamos...
Cryn nuevamente felicitaciones...Si te molesta este ejemplito, pues no tienes mas que avisarme y lo retiro de aqui...
Slds.
nico.
Hola amigos solo creo que el "PROYECTO" de mi pana Cryn y creo podrás estar de acuerdo deberia ir en "Proyectos".OK AKENA, está hecho, lo muevo a PROYECTOS, a tu pedido :mrgreen:
Ahora que he tratato de entenderle mejor a este rollo de matriz de leds siempre busco tu trabajo en proyectos xD hasta que me acuerdo que no esta ahí.
Hola AKENAFAB!! Me encanto la mini matriz, cuanto te salio? No creo q aca en mendoza (arg) se consiga. Las grandes de 8x8 salen $50 O.o un robo. Asiq voy a ver si me hago una con los leds mas pequeños q pueda conseguir jeje.
Saludos!
wow que buen proyecto, espero que termines de arreglar el problema suerte y saludosHola ussspa, nose si me olvidé decirlo, pero si, ya corregí todos los errores en la PCB, me costo, pero ya esta, la PCB esta al 100% funcionando, algunos erran falsos contactos en las patas de las matrices, pero ya está :-/. Lo que pasó es que lo dejo pendiente unos días porque estoy correteando en otro proyecto urgente para un amigo.
void load_letra(int caracter){
int j,resta;
for(j=0;j<8;j++){
matriz[5][j]=Fonts[caracter-32][j];
}
}
/************** Interrupcion RS232 para recepcion de Datos ********************/
#int_RDA
void RDA_isr(void) {
char ch;
ch = getc(); // Almaceno Los Datos en ch
fputc(ch);
if( cnti >= 63) // cunado coloco un indice mayor a 63 hay errores
cnti = 0;
if( 0x20 <= ch && ch <= 0x7F ){
write_eeprom(cnti,ch);
++cnti;
}
PosEnd = cnti; // indice de pocicion final de la eeprom
}
////////////////////////////////////////////////////////////////////////////////
void DesplazarChar(){
int i,j,tmp;
for(j=0;j<=6 ;j++){
Matriz[9][j]= ~bitmap[ read_eeprom(cnt)-0x20][j];
}
/* aqui va el codigo de ordenamiento
que no lo he incluido porque todavia estoy trabajando en esto*/
}
for(i=0;i<NUM_FILAS;i++)
aux[i]=aux[i]<<1;Parece que se entendió mal :mrgreen: Creo que se puede solucionar fácilmente cambiando la lógica del mensaje, osea lo que esta en 1 pasarlo a 0 y viceversa.Exacto, pues eso mismo, en q parte o deq forma supeustamente debo hacer eso?
Saludos!
void load_letra(int caracter){
int i,j;
if(isalnum(caracter)){
if(isalpha(caracter)){
if(isupper(caracter))
{
for(j=0;j<8;j++){
//matriz[5][j]=letrasM[i][j];
matriz[5][j]=letrasM[caracter - 'A'][j];
}
}
else{
for(j=0;j<8;j++){
//matriz[5][j]=letras_m[i][j];
matriz[5][j]=letras_m[caracter - 'a'][j];
}
}
}
else{
for(j=0;j<8;j++){
matriz[5][j]=numeros[caracter-'0'][j];
}
}
}
else{
switch(caracter){
case ' ': i=0; break;
case '!': i=1; break;
case '"': i=2; break;
case '#': i=3; break;
case '$': i=4; break;
case '%': i=5; break;
case '&': i=6; break;
case '´': i=7; break; //este es el acento
case '(': i=8; break;
case ')': i=9; break;
case '*': i=10; break;
case '+': i=11; break;
case ',': i=12; break;
case '-': i=13; break;
case '.': i=14; break;
case '/': i=15; break;
case ':': i=16; break;
case ';': i=17; break;
case '>': i=18; break;
case '=': i=19; break;
case '<': i=20; break;
case '?': i=21; break;
case '[': i=22; break;
case ']': i=23; break;
case '^': i=24; break;
case '_': i=25; break;
case '{': i=26; break;
case '|': i=27; break;
case '}': i=28; break;
case '@': i=29; break;
case 'ñ': i=30; break; // esta es la enie
case '\f': i=31; break;
}
for(j=0;j<8;j++){
matriz[5][j]=chars[i][j];
}
}
}
Jeje, muy chulo.Nose que es lo que estaras creyendo pero es un soudonimo creado por nosotros, pues me refiero a sus labios que parece una trompa y cuando duerme se "chorrea" :mrgreen: Si, lose, dificil de explicar.
Si no es indiscreción, ¿"trompa chorreada" significa lo que creo que significa?
Felicitaciones!
Te ha quedado muy bien , yo todavia no puedo con el desplazamiento del texto xD.
Saludos!
P.D.2: Los videos son míos.Porque la aclaración, quien puede dudar de eso :D
P.D.3.: En el primer video pueden apreciar una columna entera que no enciende. Esto fue porque es un prototipo y he hecho un corto que ha quemado los 7 LEDs durante el armado...Actualmente quemé otra columna mas, por tener restos de estaño pegados a la mesa donde estaba apoyado el prototipo que han terminado en cortocircuito...Mas cuidado Bruno, por favor!! :D :D
Se me cae la baba por la versión estéreo, me parece que me voy a gastar un dinerillo y me voy a armar un cartel, no me puedo quedar con las ganas! :5] :mrgreen:
P.D.2: Los videos son míos.Porque la aclaración, quien puede dudar de eso :D
P.D.3.: En el primer video pueden apreciar una columna entera que no enciende. Esto fue porque es un prototipo y he hecho un corto que ha quemado los 7 LEDs durante el armado...Actualmente quemé otra columna mas, por tener restos de estaño pegados a la mesa donde estaba apoyado el prototipo que han terminado en cortocircuito...Mas cuidado Bruno, por favor!! :D :D
...porque a mi Nokia 1100 no le encontre la función de cámara di video... :z)
Fahh! No me vuelve a pasar! Lo pegué a la pared ahora... :D
Encima no consigo mas esos LEDs rojos SMD 0805 :(
Igual, era solo el prototipo. La fabricacion en serie no pudo hacerse con esos LEDs porque resulta demasiado caro soldar esos LEDs diminutos...
Felicitaciones!
Te ha quedado muy bien , yo todavia no puedo con el desplazamiento del texto xD.
Saludos!
Que método estas usando para el desplazamiento? Porque como lo implementa Bruno es realmente sencillo ;-)
Saludos!
Pero... en assembler :( :D Fíjate por aquí (http://www.ucontrol.com.ar/forosmf/programacion-en-asm/mis-primeros-programas-pic16f84a-y-pic16f628a/msg17048/#msg17048), explico de como hacer un cartel super limitado y en eso como se puede hacer el desplazamiento.
Saludos!
Oye akena, y el .C no te sirvió?
Felicitaciones!
Te ha quedado muy bien , yo todavia no puedo con el desplazamiento del texto xD.
Saludos!
letra A esta acostadita y es para una matriz de leds 5x7
0b01111110,
0b11001000,
0b11001000,
0b11001000,
0b01111110,Hola.Gracias !!!! :-/ :-/
LCDFontMaker, BitFontCreator, GLCDFontCreator.
Saludos
MLO_ veo que al efectuar el desplazamiento un par de columnas de la letra que aparece desde la derecha se encienden de golpe, es la simulación o hay un problemita
Muy buen publik te quedó MLO__ es de 16filas? modificaste o te creaste las matrices en el proteus?
AKENA, en algún momento dije que el uso que hice de una matriz o arreglo bidimensional un poco más grande en tamaño a la matriz real; era una manera no muy buena de solucionarlo, porque los algoritmos algo complejos que se llegan a tener para distintos efectos. Pero BrunoF me dio una mejor manera de manejar los datos con la misma cantidad de datos en RAM, usando solamente arreglos unidimensionales. una explicación corta está en el link (http://www.todopic.com.ar/foros/index.php?topic=25723.msg213094#msg213094) que ya estuviste viendo anteriormente.
Aunque de la manera que lo hice sirve para aprender :mrgreen:
Espero te sirva, saludos.
char mensaje[10]={" MENSAJE "}luego tomo cada BYTE del mensaje y decodifico,después cargo mi buffer con sus 5 BYTES correspondientesletras[27][5]={
//M
{
0x04,034,0x54,0xfe,0x3c
},
....letra N....O
}char buffer[80]; //añmacena 80 columnas void ShowFila(void)
{
int i;
//output_b(0x0);
for (i = 0; i < 5; i++) // 5 = numero de matrices usado
{
cargar(matriz[i][Fila]);
}
//bit_set(portb,fila);
output_low(clock2);
delay_cycles(2);
if (Fila == 0)
{
output_bit(dato2, 1);
}
else
{
output_bit(dato2, 0);
}
output_high(clock2);
delay_cycles(1);
output_low(clock2);
}
Es de 128x14, pero el problema es que el amigo Proteus ISIS tiene sus cosas y por eso solo lo deje de 16x16 (para la simulación). Las matrices las modifique con la ayuda de un forero.
Aqui un video de como se ve esto (para el caso de las columnas)... Poco, pero se ve como digo.
Finalmente, decir que para el aumento de filas para estas matrices, almenos yo, NO recomiento el 74LS164 :5] Ah! y tampoco estoy usando transistores, aunque en caso de que se aumente MAS las filas, creo que ya seria necesario, desde ahora, siento que la intensidad ha bajado regularmente, pero bueno.
Por otro lado, el PIC (18F2550) se calienta regularmente, cosa rara :?
Epa, aqui el video:
Salu2.
const int mensaje[2][60] = {{"GASEOSAS GOLOSINAS TARJETAS CLARO MOVISTAR... AQUI >>>>> \0"}, {"ShArOn\0"}};
const int num_msj = 2;
const int msj_length[num_msj]={58, 6};//const int msj_length[num_msj]={31};Ah, no en este caso no xD! Mejor, asi le cobro por el cambio del mensaje hahaha:D muy buena jeremylf, que bueno que lograste hacer una venta...
Ah, no en este caso no xD! Mejor, asi le cobro por el cambio del mensaje hahaha
Device 16F876
Dim i As Bit
Dim aux As Byte
Dim cont As Word
Dim cont2 As Word
Dim A As Word
Dim B As Word
Dim repeticiones As Word
TRISB = %00000000
TRISC = %00000000
PORTB = 0
TRISC = 0
Repite: i = 0
cont = 0
cont2 = 0
aux = 0
A = 0
B = 7
While i < 1
For repeticiones = 0 To 12 'numero maximo de repeticiones
For cont = A To B
PORTB = LookUp cont,[$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$80,$F7,$F7,$F7,$80,$FF,$F1,$EE,$EE,$EE,$F1,$FF,$BE,$80,$FE,$FF,$FD,$EA,$EA,$EA,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF]
aux = cont - cont2
PORTC = aux
DelayMS 1
PORTB= $FF
DelayMS 1
Next
Next
Inc A
Inc B
Inc cont2
If B = 36 Then 'longitud frase
cont2 = 0
A = 0
B = 7
End If
Wend i
End
Hola mikele, no hace falta colocar los métodos en el bucle infinito, porque la interrupción por el timer0 llamará a los métodos correspondientes para cargar la letra y desplazar.
Sobre la simulación en proteus, para el código que hice, me quedó el circuito que dejo adjunto, creo que se me olvidó colocarlo antes.
Espero te sirva, saludos.
zagoaristides, yo usé seguramente una versión superior, la 7.5 o 7.6 si existía ya la última para esas fechas.
Prueba conseguir la versión de prueba u otro de la última versión de proteus y seguramente que lo podrás abrir.
Strepto, Se ve muy bien tu primer paso, a ver cunado nos sorprendes con un cartel.
saludos.
...
Strepto, Se ve muy bien tu primer paso, a ver cunado nos sorprendes con un cartel
...
Cryn, al guardarlo puedes elegir versión compatible con 7.x o algo así. Digo, porque yo usando la 7.4 no pasaría a una más actual :mrgreen:esa no la sabía, cambiado entonces, gracias por el dato suky
Estas definiciones(mayusculas, minusculas y signos) las puedo hacer en una EEprom externa (por ej 24lc256)? Y luego dependiendo del string que quiera (ya sea este declarado en la EEprom o ingresado por RS232) ir leyendo la EEprom para así después realizar el efecto que quiera?Seguro que lo puedes hacer, pero perderás algún tiempo precioso quizá. Pienso que al leer constantemente las letras, cargar byte a byte cada letra (ya que una letra tendrá entre 5 a 8 bytes) de una memoria externa se perderá mucho más tiempo que leerlo de una memoria del micro como la flash.
Nuevamente gracias y buen fin de semana.
Fernando.
fijate yo entiendo que debo enviar bit a bit al registro de desplazamiento...corrigeme si me equivoco..y si es asi como podria enviar el dato de 8 bits que antes enviaba por las filas por el registro de desplazamiento...Tendrías que hacer precisamente eso, coger bit a bit y enviarlo al registro de desplazamiento, para ello te puede ayudar la función output_bit dentro de un ciclo for e ir desplazando bit a bit cada byte, más o menos como hice en mi función void cargar(int datob) en el código.
hay instrucciones que no se como trabajan por ejemplo esta load_letra(mensaje[msj][letra]); se supone que load_letra(int caracter) es una funcion que debe llevar dentro un caracter pero en ves de eso esta mensaje[msj][letra] osea 2 arreglosEfectivamente load_letra es una función que recibe un byte como parámetro y por tanto mensaje[msj][letra] hace referencia a un byte, mensaje[ x ][ y ] es un arreglo bidimensional de bytes o también casualmente conocida como matriz.
int matriz[matriz_num+1][size_matriz_col]={"\0"}; // por qué se inicializa con '0' ?Para que no me muestre basura por la matriz al comienzo del programa.
#int_TIMER0Este If else sirve para mostrar una determinada cantidad de veces lo que el buffer tiene, para que posteriormente se desplaze el mensaje una posición, en mi caso muestro 5 veces el mismo cuadro y después desplazo, ese valor determinará la velocidad del desplazamiento, si se muestra muchos más cuadros obviamente el desplazamiento será más lento, y por el contrario mientras menos cuadros más rápido pasa el mensaje y a veces no se puede ni leer XD
void TIMER0_isr(void){
ShowFila(); //Mostremos la fila actual...
Fila++;
if(Fila==8){
Fila=0;
VSync=1;
if(Inhibit!=0) // no entiendo bien este if-else
Inhibit--;
else
desplazar_izq();
}
else
VSync=0;
}
Cryn, nuevamente gracias !Está casi todo OK, si cambias el orden de las matrices en tu esquema verás el mensaje desplazandose, la que está de 1ra a la izquierda la llevas al lado 1ro derecha, el 2izquierda será 2derecha y así sucesivamente..
Estoy simulando tu código en proteus y me parece que algo tengo mal ya que el comportamiento no es el correcto.
Lo hice con un 16F628A ya que así lo tenía armado anteriormente.
Te adjunto los archivos por si podés darle una mirada.
Saludos.
hola amigos he intentado lo que me aconsejo cryn pero no entiendo como crear el otro buffer y ir rotando sobre el de verdad que lo intente de varias formas y nada...solo quiero aprender a rotar las letras estoy empleando un 4094 el cual emplea 3 pines para enviarle la data...bueno yo entiendo que primero se coloca el STROBE en bajo y el CLOCK Y EL DATO.. luego envio los primeros 8 bits al registro de desplazamiento y luego se coloca al STROBE en alto para que el registro los muestre en su salida...pero como hago ahora para rotar los valores de las columnas...yo entiendo que debo rotarlo para ver el desplazamiento pero no se como hacerlo en codigo...espero me puedan ayudar y disculpen mi ignorancia...Hola marturetjulio, como te dije en el MP la idea del buffer es solamente por tener una copia, para poder manipular a gusto y placer los datos que se enviaran al cartel.
este es el código que he realizado pero con su simulación...lo que hice fue colocarle otro contador para que no se corra hacia abajo la letra pero por fa que alguien me ayude a crear otro arreglo para rotar porque no entiendo como hacerlo
Cryn, era eso nomás, el orden de las matrices, muchas gracias.Dependerá del uso que le des, o mejor dicho del ambiente donde lo colocarás, si es para ambiente cerrado, quizá con los leds comunes no haya ningún problema, si más bien será para verlo en las afueras, con mucha luz solar, los led's de alto brillo serán los que seguramente darán un mejor rendimiento, aunque tengas leds de alto brillo casi siempre estarás a merced de ese brillo y a la vez el ángulo de visibilidad, lo que te obligará a hacer algunas pruebas para llegar al led adecuado.
Tengo pensado armar fisicamente una matriz de 8x24. Hace un tiempo compré leds de 5 mm de los comunes, tu qué opinas? utilizo esos leds o compro los que tienen mayor brillo ?
Con respecto al registro de desplzamiento, compro los 4094 o 595 ?
Es necesaria la utilización de los ULN2803 o 2003?
Salvo los transistores, todo bien. Los transistores que sean un BD139 por ejemplo, u otro de más corriente, por lo menos 1 ó 2A, ya que como tienes 24 columnas, y tus leds digamos que cada uno a 25mA consumirás 600mA con toda una fila encendida, y un BC557 se queda corto, puede que caliente mucho, se queme, o que no tengas un brillo bueno.Gracias Cryn, pero el BD169 no es NPN? Yo necesitaría PNP. Conoces algún modelo posible?
No te olvides de los condensadores de desacoplo de unos 100nF en el micro y en cada integrado.
saludos.
Hola fgaretto.
Perdona que me entrometa,¿estas haciendo un refresco para encender los leds,o enciendes todos a la vez?.Si enciendes todos a la vez,es posible que los registros no aguanten la corriente y se crucen,provocando la rotura del pic también.
Saludos!!!
Javi.
Hola fgaretto, vi tu esquema, parece estar todo bienCryn, voy a probar de la forma que me dices. Luego te comento. Muchas gracias.
Por que no intentas probar por partes, primero solamente los leds correspondientes a un registro, después el otro, y al final juntas todo, quizá en ese trabajo descubrás pro donde va tu error.
saludos
Raro que se tenga indice negativo, no lo había visto antes...Inicio está definido como INT8. Bruno dio una explicación. La voy a estudiar, seguramente ahí está la respuesta. Te comento que funcionó la matriz de 8x24, no se quemó nada. Primero probé con un texto fijo y luego con desplazamiento vertical, todo OK.
Pero si funciona seguramente es por el tema de los desbordes.
No te olvides que un número negativo simplemente es un complemento a 2 de su positivo.
¿Cómo está definido Inicio como int? int16? con signo? sin signo?
Raro que se tenga indice negativo, no lo había visto antes...Inicio está definido como INT8. Bruno dio una explicación. La voy a estudiar, seguramente ahí está la respuesta. Te comento que funcionó la matriz de 8x24, no se quemó nada. Primero probé con un texto fijo y luego con desplazamiento vertical, todo OK.
Pero si funciona seguramente es por el tema de los desbordes.
No te olvides que un número negativo simplemente es un complemento a 2 de su positivo.
¿Cómo está definido Inicio como int? int16? con signo? sin signo?
No me funciona bien con el desplazamiento horizontal, pero seguramente es problema de mi soft.
Por lo tanto voy a trabajar sobre ello.
Tuve que colocar un cristal de 4 MHz ya que con el 20 Mhz no me funciona. Lo probé en un protoboard para prender y apagar un led y tampoco, saben a que se puede deber esto?
Saludos.
Bruno, OK, y con respecto a los otros FUSES ?
Estoy utilizando un 16F876A, mi configuración es:
Fuses XT,NOWDT,NOBROWNOUT,NOPROTECT ( con respecto a PUT, debe ir PUT o NOPUT?)
Muchas gracias
Saludos
Fernando
Salvo los transistores, todo bien. Los transistores que sean un BD139 por ejemplo, u otro de más corriente, por lo menos 1 ó 2A, ya que como tienes 24 columnas, y tus leds digamos que cada uno a 25mA consumirás 600mA con toda una fila encendida, y un BC557 se queda corto, puede que caliente mucho, se queme, o que no tengas un brillo bueno.
No te olvides de los condensadores de desacoplo de unos 100nF en el micro y en cada integrado.
saludos.
Como lo prometido es deuda acá esta todo el material, lo prueban y me dicen que les pareció y si se lo puede realizar alguna adaptacion al caso
esta es la direccion donde esta alojado
http://www.4shared.com/file/87786192/71a833b9/faypert.html?dirPwdVerified=19d53165
Device 16F877A
All_Digital TRUE
Xtal 20
TRISA = %00000000
TRISD = %00000000
TRISB = %11111111
OPTION_REG = %01000111
INTCON = %00010000
Declare SCL_Pin PORTC.3
Declare SDA_Pin PORTC.4
Dim dira As Word
Dim dirb As Word
Dim mostrar[32] As Byte
Dim dig1[5] As Byte
Dim dig2[5] As Byte
Dim dig3[5] As Byte
Dim dig4[5] As Byte
Dim puntos[2] As Byte
Dim digito1 As Byte
Dim digito2 As Byte
Dim digito3 As Byte
Dim digito4 As Byte
Dim cont As Byte
Dim i As Bit
PORTA = %00001110 'configura los bits de desplazamiento
PORTD = 0
'Grabar numeros en la eeprom
BStart
BusOut %10100000,[$00,$00,$83,$5D,$6D,$75,$83,$FF,$FF,$FF] 'numero 0
DelayMS 50
BusOut %10100000,[$00,$08,$7F,$7B,$01,$7F,$7F,$FF,$FF,$FF] 'numero 1
DelayMS 50
BusOut %10100000,[$00,$10,$7B,$3D,$5D,$6D,$73,$FF,$FF,$FF] 'numero 2
DelayMS 50
BusOut %10100000,[$00,$18,$BB,$7D,$7D,$6D,$93,$FF,$FF,$FF] 'numero 3
DelayMS 50
BusOut %10100000,[$00,$20,$E1,$EF,$EF,$EF,$01,$FF,$FF,$FF] 'numero 4
DelayMS 50
BusOut %10100000,[$00,$28,$A1,$6D,$6D,$6D,$9D,$FF,$FF,$FF] 'numero 5
DelayMS 50
BusOut %10100000,[$00,$30,$87,$6B,$6D,$6D,$9F,$FF,$FF,$FF] 'numero 6
DelayMS 50
BusOut %10100000,[$00,$38,$FD,$1D,$ED,$F5,$F9,$FF,$FF,$FF] 'numero 7
DelayMS 50
BusOut %10100000,[$00,$40,$93,$6D,$6D,$6D,$93,$FF,$FF,$FF] 'numero 8
DelayMS 50
BusOut %10100000,[$00,$48,$F3,$6D,$6D,$AD,$C3,$FF,$FF,$FF] 'numero 9
DelayMS 50
BStop
For cont = 0 To 31 'para que aparezcan todos los leds apagados
mostrar[cont]= $FF
Next
dira = 0 'Pone a cero las variables que vamos a usar
dirb = 0
digito1 = 0
digito2 = 0
digito3 = 0
digito4 = 0
dirb = 8*digito1 'Se multiplica por 8 por que en la memoria los numeros van de 8 en 8 bytes
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig1
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+3] = dig1[cont] 'digito 1
Next
dirb = 8*digito2
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig2
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+9] = dig2[cont] 'digito 2
Next
dirb = 8*digito3
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig3
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+18] = dig3[cont] 'digito 3
Next
dirb = 8*digito4
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig4
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+24] = dig4[cont] 'digito 4
Next
On Interrupt GoTo Incrementa
'inicio del programa
Inicio:
For cont = 0 To 31
If cont = 0 Then
PORTA.0 = 1
Else
PORTA.0 = 0
EndIf
PORTD = mostrar[cont]
PulsOut PORTA.1,1,High
DelayUS 500
PORTD = $FF
Next
GoTo Inicio
'cuando ocurre una interrucion...
Disable
Incrementa:
If digito4 = 9 Then
If digito3 = 9 Then
If digito2 = 9 Then
If digito1 = 9 Then
digito1 = 0
Else
Inc digito1
EndIf
dirb = 8*digito1 'Se multiplica por 8 por que en la memoria los numeros van de 8 en 8 bytes
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig1
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+3] = dig1[cont] 'digito 1
Next
digito2 = 0
DelayMS 10
Else
Inc digito2
EndIf
dirb = 8*digito2
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig2
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+9] = dig2[cont] 'digito 2
Next
digito3 = 0
DelayMS 10
Else
Inc digito3
EndIf
dirb = 8*digito3
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig3
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+18] = dig3[cont] 'digito 3
Next
digito4 = 0
DelayMS 10
Else
Inc digito4
EndIf
dirb = 8*digito4
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig4
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+24] = dig4[cont] 'digito 4
Next
OPTION_REG = %01000111
INTCON = %00010000
Resume
Enable
End
Bueno queda decir que en el display 7x64 que arme el consumo es minimo ya que hice la medicion con el amperimetro y apenas pude medir no mas de 0.5 A hay que aclarar que uso una configuracion de barrido por filas esto quiere decir que cada fila estara prendida 1/7 parte por un periodo de 1-2 mS que es como si se estuvieran encendiendo atraves de una especie de "PWM" lo que me lleva a cambiar las resistencias de 100 ohm de cada fila por la de 47 ohm para obtener un brillo mejor aún, he utilizado unos TIP 32 los he sensado y no caientan absolutamente nada no esta mal utilizar los BD 139 van sobrados para esta configuración aqui adjunto algunos archivos y un video de muestra para lo que estoy utilizando esta matriz de leds saludos ;-)
hola.. disculpen las molestias... soy algo nuevo en esto de la programación y ando con la idea de armarme unos de esos carteles para colocar en el negocio de mi vieja... les agradecería si pudieran subir algún cartel de matrices que se pueda escribir el texto sin necesidad de una pc, o indicarme donde puedo bajarlo porque desde hace una semana estoy dando vueltas por todas las paginas y no puedo encontrar nada que me convenza... lo que estoy buscando es alguno de 7x45 o similar....
Desde ya muchas gracias...
hola.. disculpen las molestias... soy algo nuevo en esto de la programación y ando con la idea de armarme unos de esos carteles para colocar en el negocio de mi vieja... les agradecería si pudieran subir algún cartel de matrices que se pueda escribir el texto sin necesidad de una pc, o indicarme donde puedo bajarlo porque desde hace una semana estoy dando vueltas por todas las paginas y no puedo encontrar nada que me convenza... lo que estoy buscando es alguno de 7x45 o similar....
Desde ya muchas gracias...
hola.. disculpen las molestias... soy algo nuevo en esto de la programación y ando con la idea de armarme unos de esos carteles para colocar en el negocio de mi vieja... les agradecería si pudieran subir algún cartel de matrices que se pueda escribir el texto sin necesidad de una pc, o indicarme donde puedo bajarlo porque desde hace una semana estoy dando vueltas por todas las paginas y no puedo encontrar nada que me convenza... lo que estoy buscando es alguno de 7x45 o similar....
Desde ya muchas gracias...
creo que la mejor manera sería con un teclado de pc, pero tienes que entrarle al código PS/2
saludos.
hola.. disculpen las molestias... soy algo nuevo en esto de la programación y ando con la idea de armarme unos de esos carteles para colocar en el negocio de mi vieja... les agradecería si pudieran subir algún cartel de matrices que se pueda escribir el texto sin necesidad de una pc, o indicarme donde puedo bajarlo porque desde hace una semana estoy dando vueltas por todas las paginas y no puedo encontrar nada que me convenza... lo que estoy buscando es alguno de 7x45 o similar....
Desde ya muchas gracias...
creo que la mejor manera sería con un teclado de pc, pero tienes que entrarle al código PS/2
saludos.
y como podría hacer alguno con teclado?? si tenes alguno por ahí a mano me lo podrías pasar?? muchas gracias...
hola.. disculpen las molestias... soy algo nuevo en esto de la programación y ando con la idea de armarme unos de esos carteles para colocar en el negocio de mi vieja... les agradecería si pudieran subir algún cartel de matrices que se pueda escribir el texto sin necesidad de una pc, o indicarme donde puedo bajarlo porque desde hace una semana estoy dando vueltas por todas las paginas y no puedo encontrar nada que me convenza... lo que estoy buscando es alguno de 7x45 o similar....
Desde ya muchas gracias...
creo que la mejor manera sería con un teclado de pc, pero tienes que entrarle al código PS/2
saludos.
y como podría hacer alguno con teclado?? si tenes alguno por ahí a mano me lo podrías pasar?? muchas gracias...
Utiliza el buscador del foro, hay hilos donde se explica como trabajar con el teclado. El proyecto completo de un cartel de leds comandado por un teclado no lo vas a encontrar, pero si las partes, solo queda el esfuerzo propio de entenderlo y combinarlos. ;-)
Saludos!
de momento les presento el 1er código que hice para el 16f88, para que talvez pueda servir a alguien, porque de momento, aunque me duele un poco decirlo, tengo que dejarlo pendiente esto del publik, porque se me presento un proyecto urgente para un amigo, aunque en ratos que pueda le dedicaré al publik :mrgreen:
acá les dejo el 1er código:Código: C
#include <16f88.h> #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #include <fonts.h> #include <string.h> #define clock PIN_A1 #define strobe PIN_A2 #define dato PIN_A0 #define size_matriz_col 8 //cantidad de columnas por matriz #define COLUMNAS 40 //Defino cantidad de columnas a usar #define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado #byte portb=6 int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel int Fila; //Fila actual a refrescar int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando... int Inhibit; //Impide que se produzcan cambios en el cartel. const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."}; const int num_msj=1; const int msj_length[num_msj]={31}; int carries[6],msj,letra,desplazos; void ShowFila(void); void cargar(int datob); void desplazar_izq(void); void load_letra(int caracter); //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque... #int_TIMER0 void TIMER0_isr(void){ ShowFila(); //Mostremos la fila actual... Fila++; if(Fila==8){ Fila=0; VSync=1; if(Inhibit!=0) Inhibit--; else desplazar_izq(); } else VSync=0; } void main(void){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); enable_interrupts(INT_TIMER0); clear_interrupt(INT_TIMER0); enable_interrupts(GLOBAL); setup_adc(adc_off); setup_adc_ports(no_analogs); set_tris_a(0); set_tris_b(0); output_b(0xFF); //Apago cartel output_low(CLOCK); //Aseguro inicialmente clock en bajo output_low(STROBE); Fila=0; //Comienzo por la 1er fila Inhibit=5; VSync=1; //Indico que comienzo con sync. desplazos=0; msj=0; while(true){} } void cargar(int datob){ int contador; delay_cycles(2); output_low(strobe); for(contador=0;contador<8;contador++){ output_bit(dato,(datob & 0x1)); datob>>=1; delay_cycles(1); } output_high(strobe); delay_cycles(1); output_low(strobe); } void ShowFila(void){ int i; output_b(0xFF); for(i=0;i<5;i++){ cargar(matriz[i][Fila]); } bit_clear(portb,fila); } void desplazar_izq(void){ int i,j,a; if(desplazos==8 || desplazos==0){ load_letra(mensaje[msj][letra]); desplazos=0; } for(i=0;i<8;i++){ for(j=0;j<6;j++){ a=matriz[j][i]; carries[j]=shift_left(&a,1,0); matriz[j][i]=a; } for(j=0;j<6;j++){ if(j!=5) matriz[j][i]|=carries[j+1]; else matriz[j][i]|=carries[0]; } } Inhibit=5; desplazos++; if(desplazos==8){ letra++; if(letra>msj_length[msj]) letra=0; } } void load_letra(int caracter){ int i,j; switch(caracter){ case 'A': i=0; break; case 'B': i=1; break; case 'C': i=2; break; case 'D': i=3; break; case 'E': i=4; break; case 'F': i=5; break; case 'G': i=6; break; case 'H': i=7; break; case 'I': i=8; break; case 'J': i=9; break; case 'K': i=10; break; case 'L': i=11; break; case 'M': i=12; break; case 'N': i=13; break; case 'O': i=14; break; case 'P': i=15; break; case 'Q': i=16; break; case 'R': i=17; break; case 'S': i=18; break; case 'T': i=19; break; case 'U': i=20; break; case 'V': i=21; break; case 'W': i=22; break; case 'X': i=23; break; case 'Y': i=24; break; case 'Z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letrasM[i][j]; } } else{ switch(caracter){ case 'a': i=0; break; case 'b': i=1; break; case 'c': i=2; break; case 'd': i=3; break; case 'e': i=4; break; case 'f': i=5; break; case 'g': i=6; break; case 'h': i=7; break; case 'i': i=8; break; case 'j': i=9; break; case 'k': i=10; break; case 'l': i=11; break; case 'm': i=12; break; case 'n': i=13; break; case 'o': i=14; break; case 'p': i=15; break; case 'q': i=16; break; case 'r': i=17; break; case 's': i=18; break; case 't': i=19; break; case 'u': i=20; break; case 'v': i=21; break; case 'w': i=22; break; case 'x': i=23; break; case 'y': i=24; break; case 'z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letras_m[i][j]; } } } else{ for(j=0;j<8;j++){ matriz[5][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break; //este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[5][j]=chars[i][j]; } } }
y el fonts.h:Código: C
const int letrasM[26][8]={{48,120,204,204,252,204,204,204}, //A {248,204,204,248,248,204,204,248}, //B {252,192,192,192,192,192,192,252}, //C {240,200,204,204,204,204,200,240}, //D {252,192,192,240,240,192,192,252}, //E {252,192,192,240,240,192,192,192}, //F {60,64,192,192,216,204,204,248}, //G {204,204,204,204,252,204,204,204}, //H {252,48,48,48,48,48,48,252}, //I {252,48,48,48,48,48,176,240}, //J {196,200,208,224,208,204,204,204}, //K {192,192,192,192,192,192,192,252}, //L {238,214,214,198,198,198,198,198}, //M {196,228,244,212,212,204,204,196}, //N {48,204,204,204,204,204,204,48}, //O {248,204,204,204,248,192,192,192}, //P {56,196,196,196,196,212,200,52}, //Q {248,204,204,204,248,208,200,196}, //R {120,204,192,192,120,12,12,248}, //S {252,48,48,48,48,48,48,48}, //T {204,204,204,204,204,204,204,120}, //U {204,204,204,204,204,204,72,48}, //V {198,198,198,198,198,214,214,238}, //W {132,132,72,48,48,72,132,132}, //X {204,204,204,120,48,48,48,48}, //Y {252,252,8,16,32,64,252,252}}; //Z const int letras_m[26][8]={{0,0,112,136,8,120,136,116}, //a {0,128,128,128,240,136,136,240}, //b {0,0,0,120,128,128,128,120}, //c {0,8,8,8,120,136,136,120}, //d {0,0,0,120,136,240,128,120}, //e {0,96,144,128,128,224,128,128}, //f {0,0,112,136,136,112,8,112}, //g {0,128,128,128,240,136,136,136}, //h {0,0,32,0,32,32,32,32}, //i {0,0,16,0,16,16,144,96}, //j {0,128,144,160,192,160,144,144}, //k {0,32,32,32,32,32,32,32}, //l {0,0,0,136,212,164,164,164}, //m {0,0,0,176,200,136,136,136}, //n {0,0,0,112,136,136,136,112}, //o {0,0,240,136,136,240,128,128}, //p {0,0,120,136,136,120,8,28}, //q {0,0,0,176,192,128,128,128}, //r {0,0,112,136,128,112,8,240}, //s {0,32,32,112,32,32,32,24}, //t {0,0,0,136,136,136,152,104}, //u {0,0,0,136,136,136,80,32}, //v {0,0,0,136,136,136,168,80}, //w {0,0,0,136,80,32,80,136}, //x {0,0,0,136,136,112,16,96}, //y {0,0,0,248,16,32,64,248}}; //z const int numeros[10][8]={{0,120,132,140,148,164,196,120}, //0 {0,16,48,80,16,16,16,124}, //1 {0,112,136,8,16,32,64,248}, //2 {0,112,136,8,48,8,136,112}, //3 {0,8,24,40,72,252,8,8}, //4 {0,124,128,128,120,4,4,248}, //5 {0,120,128,128,248,132,132,120}, //6 {0,252,132,8,16,32,64,64}, //7 {0,120,132,132,120,132,132,120}, //8 {0,120,132,132,124,4,4,120}}; //9 const int chars[31][8]={{0,0,0,0,0,0,0,0}, //space {0,32,32,32,32,32,0,32}, //! {0,40,40,40,0,0,0,0}, //" {0,36,36,254,40,252,80,80}, //# {0,120,148,144,120,20,148,120}, //$ {0,196,204,24,48,96,204,140}, //% {0,96,144,144,96,148,136,116}, //& {0,16,16,16,0,0,0,0}, //' {0,24,32,64,64,64,32,24}, //( {0,96,16,8,8,8,16,96}, //) {0,0,146,84,56,56,84,146}, //* {0,16,16,16,254,16,16,16}, //+ {0,0,0,0,0,96,32,64}, //, {0,0,0,0,252,0,0,0}, //- {0,0,0,0,0,0,96,96}, //. {0,4,12,24,48,96,192,128}, // / {0,0,96,96,0,0,96,96}, //: {0,0,96,96,0,96,32,64}, //; {0,0,192,48,12,48,192,0}, //> {0,0,0,252,0,252,0,0}, //= {0,0,12,48,192,48,12,0}, //< {0,120,132,4,24,16,0,16}, //? {0,56,32,32,32,32,32,56}, //[ {0,56,8,8,8,8,8,56}, //] {16,40,68,0,0,0,0,0}, //^ {0,0,0,0,0,0,0,254}, //_ {0,24,32,32,64,32,32,24}, //{ {0,32,32,32,32,32,32,32}, //| {0,96,16,16,8,16,16,96}, //} {56,68,146,170,170,148,64,60}, //@ {0,112,0,176,200,136,136,136}}; //ñ
un saludo, espero sirva por ahora
hola q tal......... bueno revise el codigo y creo q te falta esta linea.......
int carries[6] le cambias por int carries[7], intentalo ............ suerte.....
#include <Matriz.h>
#include <Fonts.c>
#use fast_io(ALL)
main(){
set_tris_b(0);
set_tris_a(0);
output_b(0);
output_a(0);
while(1)
//! Matrix_putc('h'); //Al descomentar esta linea y comentar la siguiente solo se mostrara la letra h
printf(Matrix_putc,"hola TODOPIC"); //Al descomentar esta linea y comentar la anterior se mostrara hola TODOPIC caracter
} //por caracter en la matriz de 7x5
//La siguiente matriz almacena los pixeles de cada carecter que sera impreso
const unsigned char Fonts[96][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00}, // Code for char
{0x00, 0x06, 0x5F, 0x06, 0x00}, // Code for char !
{0x07, 0x03, 0x00, 0x07, 0x03}, // Code for char "
{0x24, 0x7E, 0x24, 0x7E, 0x24}, // Code for char #
{0x24, 0x2B, 0x6A, 0x12, 0x00}, // Code for char $
{0x63, 0x13, 0x08, 0x64, 0x63}, // Code for char %
{0x36, 0x49, 0x56, 0x20, 0x50}, // Code for char &
{0x00, 0x07, 0x03, 0x00, 0x00}, // Code for char '
{0x00, 0x3E, 0x41, 0x00, 0x00}, // Code for char (
{0x00, 0x41, 0x3E, 0x00, 0x00}, // Code for char )
{0x08, 0x3E, 0x1C, 0x3E, 0x08}, // Code for char *
{0x08, 0x08, 0x3E, 0x08, 0x08}, // Code for char +
{0x00, 0xE0, 0x60, 0x00, 0x00}, // Code for char ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // Code for char -
{0x00, 0x60, 0x60, 0x00, 0x00}, // Code for char .
{0x20, 0x10, 0x08, 0x04, 0x02}, // Code for char /
{0x3E, 0x51, 0x49, 0x45, 0x3E}, // Code for char 0
{0x00, 0x42, 0x7F, 0x40, 0x00}, // Code for char 1
{0x62, 0x51, 0x49, 0x49, 0x46}, // Code for char 2
{0x22, 0x49, 0x49, 0x49, 0x36}, // Code for char 3
{0x18, 0x14, 0x12, 0x7F, 0x10}, // Code for char 4
{0x2F, 0x49, 0x49, 0x49, 0x31}, // Code for char 5
{0x3C, 0x4A, 0x49, 0x49, 0x30}, // Code for char 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // Code for char 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // Code for char 8
{0x06, 0x49, 0x49, 0x29, 0x1E}, // Code for char 9
{0x00, 0x6C, 0x6C, 0x00, 0x00}, // Code for char :
{0x00, 0xEC, 0x6C, 0x00, 0x00}, // Code for char ;
{0x08, 0x14, 0x22, 0x41, 0x00}, // Code for char <
{0x24, 0x24, 0x24, 0x24, 0x24}, // Code for char =
{0x00, 0x41, 0x22, 0x14, 0x08}, // Code for char >
{0x02, 0x01, 0x59, 0x09, 0x06}, // Code for char ?
{0x3E, 0x41, 0x5D, 0x55, 0x1E}, // Code for char @
{0x7E, 0x11, 0x11, 0x11, 0x7E}, // Code for char A
{0x7F, 0x49, 0x49, 0x49, 0x36}, // Code for char B
{0x3E, 0x41, 0x41, 0x41, 0x22}, // Code for char C
{0x7F, 0x41, 0x41, 0x41, 0x3E}, // Code for char D
{0x7F, 0x49, 0x49, 0x49, 0x41}, // Code for char E
{0x7F, 0x09, 0x09, 0x09, 0x01}, // Code for char F
{0x3E, 0x41, 0x49, 0x49, 0x7A}, // Code for char G
{0x7F, 0x08, 0x08, 0x08, 0x7F}, // Code for char H
{0x00, 0x41, 0x7F, 0x41, 0x00}, // Code for char I
{0x30, 0x40, 0x40, 0x40, 0x3F}, // Code for char J
{0x7F, 0x08, 0x14, 0x22, 0x41}, // Code for char K
{0x7F, 0x40, 0x40, 0x40, 0x40}, // Code for char L
{0x7F, 0x02, 0x04, 0x02, 0x7F}, // Code for char M
{0x7F, 0x02, 0x04, 0x08, 0x7F}, // Code for char N
{0x3E, 0x41, 0x41, 0x41, 0x3E}, // Code for char O
{0x7F, 0x09, 0x09, 0x09, 0x06}, // Code for char P
{0x3E, 0x41, 0x51, 0x21, 0x5E}, // Code for char Q
{0x7F, 0x09, 0x09, 0x19, 0x66}, // Code for char R
{0x26, 0x49, 0x49, 0x49, 0x32}, // Code for char S
{0x01, 0x01, 0x7F, 0x01, 0x01}, // Code for char T
{0x3F, 0x40, 0x40, 0x40, 0x3F}, // Code for char U
{0x1F, 0x20, 0x40, 0x20, 0x1F}, // Code for char V
{0x3F, 0x40, 0x3C, 0x40, 0x3F}, // Code for char W
{0x63, 0x14, 0x08, 0x14, 0x63}, // Code for char X
{0x07, 0x08, 0x70, 0x08, 0x07}, // Code for char Y
{0x71, 0x49, 0x45, 0x43, 0x00}, // Code for char Z
{0x00, 0x7F, 0x41, 0x41, 0x00}, // Code for char [
{0x02, 0x04, 0x08, 0x10, 0x20}, // Code for char BackSlash
{0x00, 0x41, 0x41, 0x7F, 0x00}, // Code for char ]
{0x04, 0x02, 0x01, 0x02, 0x04}, // Code for char ^
{0x80, 0x80, 0x80, 0x80, 0x80}, // Code for char _
{0x00, 0x03, 0x07, 0x00, 0x00}, // Code for char `
{0x20, 0x54, 0x54, 0x54, 0x78}, // Code for char a
{0x7F, 0x44, 0x44, 0x44, 0x38}, // Code for char b
{0x38, 0x44, 0x44, 0x44, 0x28}, // Code for char c
{0x38, 0x44, 0x44, 0x44, 0x7F}, // Code for char d
{0x38, 0x54, 0x54, 0x54, 0x08}, // Code for char e
{0x08, 0x7E, 0x09, 0x09, 0x00}, // Code for char f
{0x18, 0xA4, 0xA4, 0xA4, 0x7C}, // Code for char g
{0x7F, 0x04, 0x04, 0x78, 0x00}, // Code for char h
{0x00, 0x00, 0x7D, 0x40, 0x00}, // Code for char i
{0x40, 0x80, 0x84, 0x7D, 0x00}, // Code for char j
{0x7F, 0x10, 0x28, 0x44, 0x00}, // Code for char k
{0x00, 0x00, 0x7F, 0x40, 0x00}, // Code for char l
{0x7C, 0x04, 0x18, 0x04, 0x78}, // Code for char m
{0x7C, 0x04, 0x04, 0x78, 0x00}, // Code for char n
{0x38, 0x44, 0x44, 0x44, 0x38}, // Code for char o
{0xFE, 0x22, 0x22, 0x22, 0x1C}, // Code for char p
{0x1C, 0x22, 0x22, 0x22, 0xFE}, // Code for char q
{0x44, 0x78, 0x44, 0x04, 0x08}, // Code for char r
{0x08, 0x54, 0x54, 0x54, 0x20}, // Code for char s
{0x04, 0x3E, 0x44, 0x24, 0x00}, // Code for char t
{0x3C, 0x40, 0x20, 0x7C, 0x00}, // Code for char u
{0x1C, 0x20, 0x40, 0x20, 0x1C}, // Code for char v
{0x3C, 0x60, 0x30, 0x60, 0x3C}, // Code for char w
{0x6C, 0x10, 0x10, 0x6C, 0x00}, // Code for char x
{0x9C, 0xA0, 0x60, 0x3C, 0x00}, // Code for char y
{0x64, 0x54, 0x54, 0x4C, 0x00}, // Code for char z
{0x08, 0x3E, 0x41, 0x41, 0x00}, // Code for char {
{0x00, 0x00, 0x77, 0x00, 0x00}, // Code for char |
{0x00, 0x41, 0x41, 0x3E, 0x08}, // Code for char }
{0x02, 0x01, 0x02, 0x01, 0x00}, // Code for char ~
{0x3C, 0x26, 0x23, 0x26, 0x3C} // Code for char
};
//Esta funcion se encarga de imprimir un caracter en la matriz de led de 7x5
//Si se utiliza en conjunto con la funcion printf se pueden imprimir cadenas
void Matrix_putc(char letter){
int i,j,l,k=20; //declaramos i,j,l y k=20
letter-=' '; //Al valor de letter le restamos el valor ASCII de ' ' que es 32
//dandonos el puntero de la letra que sera impresa
while(--k){ //decrementamos k y mientras sea distinto de cero (20 Veces)
for(i=0,j=1;i<5;i++,j<<=1){ //Para i=0,j=1 mientras isea menor a 5 incrementamos i en 1
//y desplazamos el valor de j hacia la izquierda
l=Fonts[letter][i]; //l almacenara el arreglo de pixeles de la columna a mostrar
output_b(~l); //Negamos el valor de l y lo mostramos por el puerto B
delay_ms(5); //Un retraso de 5ms para hacer visible el caracter
output_a(j); //PORTA igual a j encendiendo una de las columnas
delay_us(1); //Retardo de 1us antes de apagar columnas
output_a(0); //Apagamos las columnas
}
}
delay_ms(100); //Retardo de 100ms antes de pasar al siguiente caracter.
}Hola amigos estoy haciendo una matriz 7 x 72, puedo escribir , pero quiero hacerlo atravez de el puerto serial.
he utilizado la base de programa y circuito de ucontrol, pero me falta hacer la comunicacion.
colocare programa para comunicarme con la pantalla.
bueno aqui les dejo el video del mismo cartel nadamas que con una eeprom externa
como veran lo unico que cambia es que el mensaje es un poco mas largo.
la fila de hasta abajo se ve encendida no por error si porque ese pin lo utilizo para el clock
ahora estoy investigando los de los registros.
entiendo como enviar ceros y unos de acuerdo a los programas de aitopes, pero no se como implementarlo a mi programa,
por cierto yo no lo hago como cryn que ya tiene fuentes, :(, solo lo hago leyendo direccion por direccion de la memoria.
ya saben la idea es poder enviar un texto desde la pc via rs232, creo que seria lo de menos. pero bueno paso a paso.
y gracias por las felicitaciones eso me da animos para seguir :-/
SALUDOS
hOLA Q TAL .... PRUEBA CON ESTE CODIGO, CON LA MISMA SIMULACION, ESTA AUMENTADO (EN CODIGO) PARA 8 MATRIZ LEDS..LO AUMENTAS EN LA SIMULACION LAS MATRICES Q FALTAN.... ME AVISAS CUALQUIER COSA............SUERT.........Código: C++
#include <16F628A.h>//cambio de libreria #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT #use delay(clock=20M) #use fast_io(a) #use fast_io(b) #include <fonts.h>//fonts #include <string.h> #define clock PIN_A1 #define strobe PIN_A2 #define dato PIN_A0 #define size_matriz_col 8 //cantidad de columnas por matriz #define COLUMNAS 56 //Defino cantidad de columnas a usar #define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado #byte portb=6 int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel int Fila; //Fila actual a refrescar int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando... int Inhibit; //Impide que se produzcan cambios en el cartel. int mensaje[1][20/*42*/]={"*** BIENVENIDOS ***"}; //{}; const int num_msj=1; const int msj_length[num_msj]={19};//31--33 int carries[8]/*6*/,msj,letra,desplazos; int i_desplazar_izq=0; int j_desplazar_izq=0; int a_desplazar_izq=0; int contador_cargar=0; int i,j; void ShowFila(void); void cargar(int datob); void desplazar_izq(void); void load_letra(int caracter); //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque... #int_TIMER0 void TIMER0_isr(void){ ShowFila(); //Mostremos la fila actual... Fila++; if(Fila==8){ Fila=0; VSync=1; if(Inhibit!=0) Inhibit--; else desplazar_izq(); } else VSync=0; } void main(void){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); enable_interrupts(INT_TIMER0); clear_interrupt(INT_TIMER0); enable_interrupts(GLOBAL); //setup_adc(adc_off); //setup_adc_ports(no_analogs); set_tris_a(0); set_tris_b(0); output_b(0x01); //Apago cartel output_low(CLOCK); //Aseguro inicialmente clock en bajo output_low(STROBE); Fila=0; //Comienzo por la 1er fila Inhibit=5; VSync=1; //Indico que comienzo con sync. desplazos=0; msj=0; while(true){}} void cargar(int datob){ //int contador; output_low(clock); delay_cycles(2); output_low(strobe); for(contador_cargar=0;contador_cargar<8;contador_cargar++){ output_bit(dato,(datob & 0x1)); datob>>=1; output_high(clock); delay_cycles(1); output_low(clock); } output_high(strobe); delay_cycles(1); output_low(strobe); } int i_showfila=0; void ShowFila(void){ //int i; output_b(0xFF);//*****0xFF for(i_showfila=0;i_showfila<7;i_showfila++){//5 6 cargar(matriz[i_showfila][Fila]); } bit_clear(portb,fila);//*****clear } void desplazar_izq(void){ //int i,j,a; if(desplazos==8 || desplazos==0){ load_letra(mensaje[msj][letra]); desplazos=0; } for(i_desplazar_izq=0;i_desplazar_izq<8;i_desplazar_izq++){ for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){ a_desplazar_izq=matriz[j_desplazar_izq][i_desplazar_izq]; carries[j_desplazar_izq]=shift_left(&a_desplazar_izq,1,0); matriz[j_desplazar_izq][i_desplazar_izq]=a_desplazar_izq; } for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){ if(j_desplazar_izq!=7)//5 matriz[j_desplazar_izq][i_desplazar_izq]|=carries[j_desplazar_izq+1]; else matriz[j_desplazar_izq][i_desplazar_izq]|=carries[0]; } } Inhibit=5; desplazos++; if(desplazos==8){ letra++; if(letra>msj_length[msj]) letra=0; } } void load_letra(int caracter){ //int i,j; if(isalnum(caracter)){ if(isalpha(caracter)){ if(isupper(caracter)){ switch(caracter){ case 'A': i=0; break; case 'B': i=1; break; case 'C': i=2; break; case 'D': i=3; break; case 'E': i=4; break; case 'F': i=5; break; case 'G': i=6; break; case 'H': i=7; break; case 'I': i=8; break; case 'J': i=9; break; case 'K': i=10; break; case 'L': i=11; break; case 'M': i=12; break; case 'N': i=13; break; case 'O': i=14; break; case 'P': i=15; break; case 'Q': i=16; break; case 'R': i=17; break; case 'S': i=18; break; case 'T': i=19; break; case 'U': i=20; break; case 'V': i=21; break; case 'W': i=22; break; case 'X': i=23; break; case 'Y': i=24; break; case 'Z': i=25; break; } for(j=0;j<8;j++){ matriz[7][j]=letrasM[i][j]; } } else{ switch(caracter){ case 'a': i=0; break; case 'b': i=1; break; case 'c': i=2; break; case 'd': i=3; break; case 'e': i=4; break; case 'f': i=5; break; case 'g': i=6; break; case 'h': i=7; break; case 'i': i=8; break; case 'j': i=9; break; case 'k': i=10; break; case 'l': i=11; break; case 'm': i=12; break; case 'n': i=13; break; case 'o': i=14; break; case 'p': i=15; break; case 'q': i=16; break; case 'r': i=17; break; case 's': i=18; break; case 't': i=19; break; case 'u': i=20; break; case 'v': i=21; break; case 'w': i=22; break; case 'x': i=23; break; case 'y': i=24; break; case 'z': i=25; break; } for(j=0;j<8;j++){ matriz[7/*5*/][j]=letras_m[i][j]; } } } else{ for(j=0;j<8;j++){ matriz[7][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break;//este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[7][j]=chars[i][j]; } } }
amigo la verdad no entendy algunas cosas de su codigo yo lo estoy haciendo en codewarrior pero necesito de su asesoria para cargar cada letra en un registro
aca envion el codigo
const char Transistores[5]={0b11110,0b11101,0b11011,0b10111,0b01111};
const char Letras[5]= { 0b10000001,
0b10111111,
0b10000001,
0b10111111,
0b10000001,};
char PunteroLetras=1;
char PunteroTransistores=0;
void Tarea2(char dato)
{
int i,j=1;
for (i=0;i<8;i++)
{
PTDD_PTDD1 = (j&dato)?1:0;
j=j<<1;
PTDD_PTDD0 = 1;
asm nop
asm nop
asm nop
PTDD_PTDD0 = 0;
}
}
void Tarea1(void)
{
PTBD = Transistores[PunteroTransistores];
Tarea2(Letras[PunteroLetras]);
PunteroLetras++;
if (Letras[PunteroLetras]==0) PunteroLetras=0;
PunteroTransistores++;
if (PunteroTransistores==5)PunteroTransistores=0;
}
interrupt 29 void RTCISR(void)
{
RTCSC_RTIF = 1;
Tarea1();
}
extern void _Startup(void);
/* User code */
void main(void)
{
SOPT1 = 0X20;
PTBDD=0B00011111;
PTDDD=0B00000111;
PTBD =0B00001111;
PTDD= 0B00000100;
PTDD_PTDD2 = 0;
asm nop
asm nop
asm nop
PTDD_PTDD2 = 1;
RTCMOD = 32 ;
RTCSC_RTCLKS = 2 ;
RTCSC_RTCPS = 8;
RTCSC_RTIF = 1;
RTCSC_RTIE = 1;
EnableInterrupts;
for(;;)
{
asm WAIT;
}
}
/*Dummy ISR */
interrupt void Dummy_ISR(void)
{
}
void (* volatile const _UserEntry[])()@0xFABC={
0x9DCC, // asm NOP(9D), asm JMP(CC)
_Startup
};
// redirect vector 0xFFC0-0xFFFD to 0xFBC0-0xFBFD
void (* volatile const _Usr_Vector[])()@0xFBC4= {
RTCISR, // Int.no.29 RTC (at FBC4) (at FFC4)
Dummy_ISR, // Int.no.28 IIC (at FBC6) (at FFC6)
Dummy_ISR, // Int.no.27 ACMP (at FBC8) (at FFC8)
Dummy_ISR, // Int.no.26 ADC (at FBCA) (at FFCA)
Dummy_ISR, // Int.no.25 KBI (at FBCC) (at FFCC)
Dummy_ISR, // Int.no.24 SCI2 Transmit (at FBCE) (at FFCE)
Dummy_ISR, // Int.no.23 SCI2 Receive (at FBD0) (at FFD0)
Dummy_ISR, // Int.no.22 SCI2 Error (at FBD2) (at FFD2)
Dummy_ISR, // Int.no.21 SCI1 Transmit (at FBD4) (at FFD4)
Dummy_ISR, // Int.no.20 SCI1 Receive (at FBD6) (at FFD6)
Dummy_ISR, // Int.no.19 SCI1 error (at FBD8) (at FFD8)
Dummy_ISR, // Int.no.18 TPM2 Overflow (at FBDA) (at FFDA)
Dummy_ISR, // Int.no.17 TPM2 CH1 (at FBDC) (at FFDC)
Dummy_ISR, // Int.no.16 TPM2 CH0 (at FBDE) (at FFDE)
Dummy_ISR, // Int.no.15 TPM1 Overflow (at FBE0) (at FFE0)
Dummy_ISR, // Int.no.14 TPM1 CH5 (at FBE2) (at FFE2)
Dummy_ISR, // Int.no.13 TPM1 CH4 (at FBE4) (at FFE4)
Dummy_ISR, // Int.no.12 TPM1 CH3 (at FBE6) (at FFE6)
Dummy_ISR, // Int.no.11 TPM1 CH2 (at FBE8) (at FFE8)
Dummy_ISR, // Int.no.10 TPM1 CH1 (at FBEA) (at FFEA)
Dummy_ISR, // Int.no.9 TPM1 CH0 (at FBEC) (at FFEC)
Dummy_ISR, // Int.no.8 Reserved (at FBEE) (at FFEE)
Dummy_ISR, // Int.no.7 USB Statue (at FBF0) (at FFF0)
Dummy_ISR, // Int.no.6 SPI2 (at FBF2) (at FFF2)
Dummy_ISR, // Int.no.5 SPI1 (at FBF4) (at FFF4)
Dummy_ISR, // Int.no.4 Loss of lock (at FBF6) (at FFF6)
Dummy_ISR, // Int.no.3 LVI (at FBF8) (at FFF8)
Dummy_ISR, // Int.no.2 IRQ (at FBFA) (at FFFA)
Dummy_ISR, // Int.no.1 SWI (at FBFC) (at FFFC)
};
#pragma CODE_SEG Bootloader_ROM
void Bootloader_Main(void);
void _Entry(void) {
PTGD = 0x00;
PTGDD = 0xF0; //PTG0-3 used for KBI input
PTGPE = 0x0F; //Pull-up enable
// MCG clock initialization, fBus=24MHz
MCGC2 = 0x36;
//MCGC2_EREFS=0;
while(!(MCGSC & 0x02)); //wait for the OSC stable
MCGC1 = 0x1B;
MCGC3 = 0x48;
while ((MCGSC & 0x48) != 0x48); //wait for the PLL is locked
// Flash clock
FCDIV=0x4E; // PRDIV8=1; DIV[5:0]=14, flash clock should be 150-200kHz
// bus clock=24M, flash clock=fbus/8/(DIV[5:0]+1)
// bus clock=24M, flash clock=fbus/8/(DIV[5:0]+1)
if(!PTGD_PTGD0)
{
SOPT1 = 0x20; // disable COP only if bootloader mod is requested
// PTG0 is pressed
USBCTL0=0x44;
USBCTL0_USBVREN=1;
Bootloader_Main(); // Bootloader mode
}
else
asm JMP _UserEntry; // Enter User mode
}
#pragma CODE_SEG default
de momento les presento el 1er código que hice para el 16f88, para que talvez pueda servir a alguien, porque de momento, aunque me duele un poco decirlo, tengo que dejarlo pendiente esto del publik, porque se me presento un proyecto urgente para un amigo, aunque en ratos que pueda le dedicaré al publik :mrgreen:
acá les dejo el 1er código:Código: C
#include <16f88.h> #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #include <fonts.h> #include <string.h> #define clock PIN_A1 #define strobe PIN_A2 #define dato PIN_A0 #define size_matriz_col 8 //cantidad de columnas por matriz #define COLUMNAS 40 //Defino cantidad de columnas a usar #define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado #byte portb=6 int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel int Fila; //Fila actual a refrescar int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando... int Inhibit; //Impide que se produzcan cambios en el cartel. const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."}; const int num_msj=1; const int msj_length[num_msj]={31}; int carries[6],msj,letra,desplazos; void ShowFila(void); void cargar(int datob); void desplazar_izq(void); void load_letra(int caracter); //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque... #int_TIMER0 void TIMER0_isr(void){ ShowFila(); //Mostremos la fila actual... Fila++; if(Fila==8){ Fila=0; VSync=1; if(Inhibit!=0) Inhibit--; else desplazar_izq(); } else VSync=0; } void main(void){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); enable_interrupts(INT_TIMER0); clear_interrupt(INT_TIMER0); enable_interrupts(GLOBAL); setup_adc(adc_off); setup_adc_ports(no_analogs); set_tris_a(0); set_tris_b(0); output_b(0xFF); //Apago cartel output_low(CLOCK); //Aseguro inicialmente clock en bajo output_low(STROBE); Fila=0; //Comienzo por la 1er fila Inhibit=5; VSync=1; //Indico que comienzo con sync. desplazos=0; msj=0; while(true){} } void cargar(int datob){ int contador; delay_cycles(2); output_low(strobe); for(contador=0;contador<8;contador++){ output_bit(dato,(datob & 0x1)); datob>>=1; delay_cycles(1); } output_high(strobe); delay_cycles(1); output_low(strobe); } void ShowFila(void){ int i; output_b(0xFF); for(i=0;i<5;i++){ cargar(matriz[i][Fila]); } bit_clear(portb,fila); } void desplazar_izq(void){ int i,j,a; if(desplazos==8 || desplazos==0){ load_letra(mensaje[msj][letra]); desplazos=0; } for(i=0;i<8;i++){ for(j=0;j<6;j++){ a=matriz[j][i]; carries[j]=shift_left(&a,1,0); matriz[j][i]=a; } for(j=0;j<6;j++){ if(j!=5) matriz[j][i]|=carries[j+1]; else matriz[j][i]|=carries[0]; } } Inhibit=5; desplazos++; if(desplazos==8){ letra++; if(letra>msj_length[msj]) letra=0; } } void load_letra(int caracter){ int i,j; switch(caracter){ case 'A': i=0; break; case 'B': i=1; break; case 'C': i=2; break; case 'D': i=3; break; case 'E': i=4; break; case 'F': i=5; break; case 'G': i=6; break; case 'H': i=7; break; case 'I': i=8; break; case 'J': i=9; break; case 'K': i=10; break; case 'L': i=11; break; case 'M': i=12; break; case 'N': i=13; break; case 'O': i=14; break; case 'P': i=15; break; case 'Q': i=16; break; case 'R': i=17; break; case 'S': i=18; break; case 'T': i=19; break; case 'U': i=20; break; case 'V': i=21; break; case 'W': i=22; break; case 'X': i=23; break; case 'Y': i=24; break; case 'Z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letrasM[i][j]; } } else{ switch(caracter){ case 'a': i=0; break; case 'b': i=1; break; case 'c': i=2; break; case 'd': i=3; break; case 'e': i=4; break; case 'f': i=5; break; case 'g': i=6; break; case 'h': i=7; break; case 'i': i=8; break; case 'j': i=9; break; case 'k': i=10; break; case 'l': i=11; break; case 'm': i=12; break; case 'n': i=13; break; case 'o': i=14; break; case 'p': i=15; break; case 'q': i=16; break; case 'r': i=17; break; case 's': i=18; break; case 't': i=19; break; case 'u': i=20; break; case 'v': i=21; break; case 'w': i=22; break; case 'x': i=23; break; case 'y': i=24; break; case 'z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letras_m[i][j]; } } } else{ for(j=0;j<8;j++){ matriz[5][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break; //este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[5][j]=chars[i][j]; } } }
y el fonts.h:Código: C
const int letrasM[26][8]={{48,120,204,204,252,204,204,204}, //A {248,204,204,248,248,204,204,248}, //B {252,192,192,192,192,192,192,252}, //C {240,200,204,204,204,204,200,240}, //D {252,192,192,240,240,192,192,252}, //E {252,192,192,240,240,192,192,192}, //F {60,64,192,192,216,204,204,248}, //G {204,204,204,204,252,204,204,204}, //H {252,48,48,48,48,48,48,252}, //I {252,48,48,48,48,48,176,240}, //J {196,200,208,224,208,204,204,204}, //K {192,192,192,192,192,192,192,252}, //L {238,214,214,198,198,198,198,198}, //M {196,228,244,212,212,204,204,196}, //N {48,204,204,204,204,204,204,48}, //O {248,204,204,204,248,192,192,192}, //P {56,196,196,196,196,212,200,52}, //Q {248,204,204,204,248,208,200,196}, //R {120,204,192,192,120,12,12,248}, //S {252,48,48,48,48,48,48,48}, //T {204,204,204,204,204,204,204,120}, //U {204,204,204,204,204,204,72,48}, //V {198,198,198,198,198,214,214,238}, //W {132,132,72,48,48,72,132,132}, //X {204,204,204,120,48,48,48,48}, //Y {252,252,8,16,32,64,252,252}}; //Z const int letras_m[26][8]={{0,0,112,136,8,120,136,116}, //a {0,128,128,128,240,136,136,240}, //b {0,0,0,120,128,128,128,120}, //c {0,8,8,8,120,136,136,120}, //d {0,0,0,120,136,240,128,120}, //e {0,96,144,128,128,224,128,128}, //f {0,0,112,136,136,112,8,112}, //g {0,128,128,128,240,136,136,136}, //h {0,0,32,0,32,32,32,32}, //i {0,0,16,0,16,16,144,96}, //j {0,128,144,160,192,160,144,144}, //k {0,32,32,32,32,32,32,32}, //l {0,0,0,136,212,164,164,164}, //m {0,0,0,176,200,136,136,136}, //n {0,0,0,112,136,136,136,112}, //o {0,0,240,136,136,240,128,128}, //p {0,0,120,136,136,120,8,28}, //q {0,0,0,176,192,128,128,128}, //r {0,0,112,136,128,112,8,240}, //s {0,32,32,112,32,32,32,24}, //t {0,0,0,136,136,136,152,104}, //u {0,0,0,136,136,136,80,32}, //v {0,0,0,136,136,136,168,80}, //w {0,0,0,136,80,32,80,136}, //x {0,0,0,136,136,112,16,96}, //y {0,0,0,248,16,32,64,248}}; //z const int numeros[10][8]={{0,120,132,140,148,164,196,120}, //0 {0,16,48,80,16,16,16,124}, //1 {0,112,136,8,16,32,64,248}, //2 {0,112,136,8,48,8,136,112}, //3 {0,8,24,40,72,252,8,8}, //4 {0,124,128,128,120,4,4,248}, //5 {0,120,128,128,248,132,132,120}, //6 {0,252,132,8,16,32,64,64}, //7 {0,120,132,132,120,132,132,120}, //8 {0,120,132,132,124,4,4,120}}; //9 const int chars[31][8]={{0,0,0,0,0,0,0,0}, //space {0,32,32,32,32,32,0,32}, //! {0,40,40,40,0,0,0,0}, //" {0,36,36,254,40,252,80,80}, //# {0,120,148,144,120,20,148,120}, //$ {0,196,204,24,48,96,204,140}, //% {0,96,144,144,96,148,136,116}, //& {0,16,16,16,0,0,0,0}, //' {0,24,32,64,64,64,32,24}, //( {0,96,16,8,8,8,16,96}, //) {0,0,146,84,56,56,84,146}, //* {0,16,16,16,254,16,16,16}, //+ {0,0,0,0,0,96,32,64}, //, {0,0,0,0,252,0,0,0}, //- {0,0,0,0,0,0,96,96}, //. {0,4,12,24,48,96,192,128}, // / {0,0,96,96,0,0,96,96}, //: {0,0,96,96,0,96,32,64}, //; {0,0,192,48,12,48,192,0}, //> {0,0,0,252,0,252,0,0}, //= {0,0,12,48,192,48,12,0}, //< {0,120,132,4,24,16,0,16}, //? {0,56,32,32,32,32,32,56}, //[ {0,56,8,8,8,8,8,56}, //] {16,40,68,0,0,0,0,0}, //^ {0,0,0,0,0,0,0,254}, //_ {0,24,32,32,64,32,32,24}, //{ {0,32,32,32,32,32,32,32}, //| {0,96,16,16,8,16,16,96}, //} {56,68,146,170,170,148,64,60}, //@ {0,112,0,176,200,136,136,136}}; //ñ
un saludo, espero sirva por ahora
hOLA Q TAL .... PRUEBA CON ESTE CODIGO, CON LA MISMA SIMULACION, ESTA AUMENTADO (EN CODIGO) PARA 8 MATRIZ LEDS..LO AUMENTAS EN LA SIMULACION LAS MATRICES Q FALTAN.... ME AVISAS CUALQUIER COSA............SUERT.........[quote author=fgaretto link=topic=19091.msg262510#msg262510 date=1280341306Código: C++
#include <16F628A.h>//cambio de libreria #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT #use delay(clock=20M) #use fast_io(a) #use fast_io(b) #include <fonts.h>//fonts #include <string.h> #define clock PIN_A1 #define strobe PIN_A2 #define dato PIN_A0 #define size_matriz_col 8 //cantidad de columnas por matriz #define COLUMNAS 56 //Defino cantidad de columnas a usar #define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado #byte portb=6 int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel int Fila; //Fila actual a refrescar int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando... int Inhibit; //Impide que se produzcan cambios en el cartel. int mensaje[1][20/*42*/]={"*** BIENVENIDOS ***"}; //{}; const int num_msj=1; const int msj_length[num_msj]={19};//31--33 int carries[8]/*6*/,msj,letra,desplazos; int i_desplazar_izq=0; int j_desplazar_izq=0; int a_desplazar_izq=0; int contador_cargar=0; int i,j; void ShowFila(void); void cargar(int datob); void desplazar_izq(void); void load_letra(int caracter); //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque... #int_TIMER0 void TIMER0_isr(void){ ShowFila(); //Mostremos la fila actual... Fila++; if(Fila==8){ Fila=0; VSync=1; if(Inhibit!=0) Inhibit--; else desplazar_izq(); } else VSync=0; } void main(void){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); enable_interrupts(INT_TIMER0); clear_interrupt(INT_TIMER0); enable_interrupts(GLOBAL); //setup_adc(adc_off); //setup_adc_ports(no_analogs); set_tris_a(0); set_tris_b(0); output_b(0x01); //Apago cartel output_low(CLOCK); //Aseguro inicialmente clock en bajo output_low(STROBE); Fila=0; //Comienzo por la 1er fila Inhibit=5; VSync=1; //Indico que comienzo con sync. desplazos=0; msj=0; while(true){}} void cargar(int datob){ //int contador; output_low(clock); delay_cycles(2); output_low(strobe); for(contador_cargar=0;contador_cargar<8;contador_cargar++){ output_bit(dato,(datob & 0x1)); datob>>=1; output_high(clock); delay_cycles(1); output_low(clock); } output_high(strobe); delay_cycles(1); output_low(strobe); } int i_showfila=0; void ShowFila(void){ //int i; output_b(0xFF);//*****0xFF for(i_showfila=0;i_showfila<7;i_showfila++){//5 6 cargar(matriz[i_showfila][Fila]); } bit_clear(portb,fila);//*****clear } void desplazar_izq(void){ //int i,j,a; if(desplazos==8 || desplazos==0){ load_letra(mensaje[msj][letra]); desplazos=0; } for(i_desplazar_izq=0;i_desplazar_izq<8;i_desplazar_izq++){ for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){ a_desplazar_izq=matriz[j_desplazar_izq][i_desplazar_izq]; carries[j_desplazar_izq]=shift_left(&a_desplazar_izq,1,0); matriz[j_desplazar_izq][i_desplazar_izq]=a_desplazar_izq; } for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){ if(j_desplazar_izq!=7)//5 matriz[j_desplazar_izq][i_desplazar_izq]|=carries[j_desplazar_izq+1]; else matriz[j_desplazar_izq][i_desplazar_izq]|=carries[0]; } } Inhibit=5; desplazos++; if(desplazos==8){ letra++; if(letra>msj_length[msj]) letra=0; } } void load_letra(int caracter){ //int i,j; if(isalnum(caracter)){ if(isalpha(caracter)){ if(isupper(caracter)){ switch(caracter){ case 'A': i=0; break; case 'B': i=1; break; case 'C': i=2; break; case 'D': i=3; break; case 'E': i=4; break; case 'F': i=5; break; case 'G': i=6; break; case 'H': i=7; break; case 'I': i=8; break; case 'J': i=9; break; case 'K': i=10; break; case 'L': i=11; break; case 'M': i=12; break; case 'N': i=13; break; case 'O': i=14; break; case 'P': i=15; break; case 'Q': i=16; break; case 'R': i=17; break; case 'S': i=18; break; case 'T': i=19; break; case 'U': i=20; break; case 'V': i=21; break; case 'W': i=22; break; case 'X': i=23; break; case 'Y': i=24; break; case 'Z': i=25; break; } for(j=0;j<8;j++){ matriz[7][j]=letrasM[i][j]; } } else{ switch(caracter){ case 'a': i=0; break; case 'b': i=1; break; case 'c': i=2; break; case 'd': i=3; break; case 'e': i=4; break; case 'f': i=5; break; case 'g': i=6; break; case 'h': i=7; break; case 'i': i=8; break; case 'j': i=9; break; case 'k': i=10; break; case 'l': i=11; break; case 'm': i=12; break; case 'n': i=13; break; case 'o': i=14; break; case 'p': i=15; break; case 'q': i=16; break; case 'r': i=17; break; case 's': i=18; break; case 't': i=19; break; case 'u': i=20; break; case 'v': i=21; break; case 'w': i=22; break; case 'x': i=23; break; case 'y': i=24; break; case 'z': i=25; break; } for(j=0;j<8;j++){ matriz[7/*5*/][j]=letras_m[i][j]; } } } else{ for(j=0;j<8;j++){ matriz[7][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break;//este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[7][j]=chars[i][j]; } } }
Código: C
#include <16f88.h> #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #include <fonts.h> #include <string.h> #define clock PIN_A1 #define strobe PIN_A2 #define dato PIN_A0 #define size_matriz_col 8 //cantidad de columnas por matriz #define COLUMNAS 40 //Defino cantidad de columnas a usar #define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado #byte portb=6 int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel int Fila; //Fila actual a refrescar int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando... int Inhibit; //Impide que se produzcan cambios en el cartel. const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."}; const int num_msj=1; const int msj_length[num_msj]={31}; int carries[6],msj,letra,desplazos; void ShowFila(void); void cargar(int datob); void desplazar_izq(void); void load_letra(int caracter); //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque... #int_TIMER0 void TIMER0_isr(void){ ShowFila(); //Mostremos la fila actual... Fila++; if(Fila==8){ Fila=0; VSync=1; if(Inhibit!=0) Inhibit--; else desplazar_izq(); } else VSync=0; } void main(void){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); enable_interrupts(INT_TIMER0); clear_interrupt(INT_TIMER0); enable_interrupts(GLOBAL); setup_adc(adc_off); setup_adc_ports(no_analogs); set_tris_a(0); set_tris_b(0); output_b(0xFF); //Apago cartel output_low(CLOCK); //Aseguro inicialmente clock en bajo output_low(STROBE); Fila=0; //Comienzo por la 1er fila Inhibit=5; VSync=1; //Indico que comienzo con sync. desplazos=0; msj=0; while(true){} } void cargar(int datob){ int contador; delay_cycles(2); output_low(strobe); for(contador=0;contador<8;contador++){ output_bit(dato,(datob & 0x1)); datob>>=1; delay_cycles(1); } output_high(strobe); delay_cycles(1); output_low(strobe); } void ShowFila(void){ int i; output_b(0xFF); for(i=0;i<5;i++){ cargar(matriz[i][Fila]); } bit_clear(portb,fila); } void desplazar_izq(void){ int i,j,a; if(desplazos==8 || desplazos==0){ load_letra(mensaje[msj][letra]); desplazos=0; } for(i=0;i<8;i++){ for(j=0;j<6;j++){ a=matriz[j][i]; carries[j]=shift_left(&a,1,0); matriz[j][i]=a; } for(j=0;j<6;j++){ if(j!=5) matriz[j][i]|=carries[j+1]; else matriz[j][i]|=carries[0]; } } Inhibit=5; desplazos++; if(desplazos==8){ letra++; if(letra>msj_length[msj]) letra=0; } } void load_letra(int caracter){ int i,j; switch(caracter){ case 'A': i=0; break; case 'B': i=1; break; case 'C': i=2; break; case 'D': i=3; break; case 'E': i=4; break; case 'F': i=5; break; case 'G': i=6; break; case 'H': i=7; break; case 'I': i=8; break; case 'J': i=9; break; case 'K': i=10; break; case 'L': i=11; break; case 'M': i=12; break; case 'N': i=13; break; case 'O': i=14; break; case 'P': i=15; break; case 'Q': i=16; break; case 'R': i=17; break; case 'S': i=18; break; case 'T': i=19; break; case 'U': i=20; break; case 'V': i=21; break; case 'W': i=22; break; case 'X': i=23; break; case 'Y': i=24; break; case 'Z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letrasM[i][j]; } } else{ switch(caracter){ case 'a': i=0; break; case 'b': i=1; break; case 'c': i=2; break; case 'd': i=3; break; case 'e': i=4; break; case 'f': i=5; break; case 'g': i=6; break; case 'h': i=7; break; case 'i': i=8; break; case 'j': i=9; break; case 'k': i=10; break; case 'l': i=11; break; case 'm': i=12; break; case 'n': i=13; break; case 'o': i=14; break; case 'p': i=15; break; case 'q': i=16; break; case 'r': i=17; break; case 's': i=18; break; case 't': i=19; break; case 'u': i=20; break; case 'v': i=21; break; case 'w': i=22; break; case 'x': i=23; break; case 'y': i=24; break; case 'z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letras_m[i][j]; } } } else{ for(j=0;j<8;j++){ matriz[5][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break; //este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[5][j]=chars[i][j]; } } }Código: C
const int letrasM[26][8]={{48,120,204,204,252,204,204,204}, //A {248,204,204,248,248,204,204,248}, //B {252,192,192,192,192,192,192,252}, //C {240,200,204,204,204,204,200,240}, //D {252,192,192,240,240,192,192,252}, //E {252,192,192,240,240,192,192,192}, //F {60,64,192,192,216,204,204,248}, //G {204,204,204,204,252,204,204,204}, //H {252,48,48,48,48,48,48,252}, //I {252,48,48,48,48,48,176,240}, //J {196,200,208,224,208,204,204,204}, //K {192,192,192,192,192,192,192,252}, //L {238,214,214,198,198,198,198,198}, //M {196,228,244,212,212,204,204,196}, //N {48,204,204,204,204,204,204,48}, //O {248,204,204,204,248,192,192,192}, //P {56,196,196,196,196,212,200,52}, //Q {248,204,204,204,248,208,200,196}, //R {120,204,192,192,120,12,12,248}, //S {252,48,48,48,48,48,48,48}, //T {204,204,204,204,204,204,204,120}, //U {204,204,204,204,204,204,72,48}, //V {198,198,198,198,198,214,214,238}, //W {132,132,72,48,48,72,132,132}, //X {204,204,204,120,48,48,48,48}, //Y {252,252,8,16,32,64,252,252}}; //Z const int letras_m[26][8]={{0,0,112,136,8,120,136,116}, //a {0,128,128,128,240,136,136,240}, //b {0,0,0,120,128,128,128,120}, //c {0,8,8,8,120,136,136,120}, //d {0,0,0,120,136,240,128,120}, //e {0,96,144,128,128,224,128,128}, //f {0,0,112,136,136,112,8,112}, //g {0,128,128,128,240,136,136,136}, //h {0,0,32,0,32,32,32,32}, //i {0,0,16,0,16,16,144,96}, //j {0,128,144,160,192,160,144,144}, //k {0,32,32,32,32,32,32,32}, //l {0,0,0,136,212,164,164,164}, //m {0,0,0,176,200,136,136,136}, //n {0,0,0,112,136,136,136,112}, //o {0,0,240,136,136,240,128,128}, //p {0,0,120,136,136,120,8,28}, //q {0,0,0,176,192,128,128,128}, //r {0,0,112,136,128,112,8,240}, //s {0,32,32,112,32,32,32,24}, //t {0,0,0,136,136,136,152,104}, //u {0,0,0,136,136,136,80,32}, //v {0,0,0,136,136,136,168,80}, //w {0,0,0,136,80,32,80,136}, //x {0,0,0,136,136,112,16,96}, //y {0,0,0,248,16,32,64,248}}; //z const int numeros[10][8]={{0,120,132,140,148,164,196,120}, //0 {0,16,48,80,16,16,16,124}, //1 {0,112,136,8,16,32,64,248}, //2 {0,112,136,8,48,8,136,112}, //3 {0,8,24,40,72,252,8,8}, //4 {0,124,128,128,120,4,4,248}, //5 {0,120,128,128,248,132,132,120}, //6 {0,252,132,8,16,32,64,64}, //7 {0,120,132,132,120,132,132,120}, //8 {0,120,132,132,124,4,4,120}}; //9 const int chars[31][8]={{0,0,0,0,0,0,0,0}, //space {0,32,32,32,32,32,0,32}, //! {0,40,40,40,0,0,0,0}, //" {0,36,36,254,40,252,80,80}, //# {0,120,148,144,120,20,148,120}, //$ {0,196,204,24,48,96,204,140}, //% {0,96,144,144,96,148,136,116}, //& {0,16,16,16,0,0,0,0}, //' {0,24,32,64,64,64,32,24}, //( {0,96,16,8,8,8,16,96}, //) {0,0,146,84,56,56,84,146}, //* {0,16,16,16,254,16,16,16}, //+ {0,0,0,0,0,96,32,64}, //, {0,0,0,0,252,0,0,0}, //- {0,0,0,0,0,0,96,96}, //. {0,4,12,24,48,96,192,128}, // / {0,0,96,96,0,0,96,96}, //: {0,0,96,96,0,96,32,64}, //; {0,0,192,48,12,48,192,0}, //> {0,0,0,252,0,252,0,0}, //= {0,0,12,48,192,48,12,0}, //< {0,120,132,4,24,16,0,16}, //? {0,56,32,32,32,32,32,56}, //[ {0,56,8,8,8,8,8,56}, //] {16,40,68,0,0,0,0,0}, //^ {0,0,0,0,0,0,0,254}, //_ {0,24,32,32,64,32,32,24}, //{ {0,32,32,32,32,32,32,32}, //| {0,96,16,16,8,16,16,96}, //} {56,68,146,170,170,148,64,60}, //@ {0,112,0,176,200,136,136,136}}; //ñ
Para mi proyecto me base en ese código y utilice un 16f877A +4 matrices 8x8 + 8 – bc327+
4 74HC164
El proyecto en sí funciona perfecto, el único defecto que veo es que alcanza a parpadear un poco
Sera que hay alguna forma para reducir este parpadeo
Y otra cosa para que sirve el strobe porque para mis 74HC164 no lo utilizo
Utiliza un registro de desplazamiento con latches, como el 74HC595, en vez del 74HC164, y no tendrás esos problemas.
Strobe (en el chip 4094), es la patilla que controla el latch.
El latch controla un registro de almacenamiento intermedio que carga los bits que va recibiendo, en cuanto has cargado los 8 bits, les das salida a los 8 a la vez poniendo la patilla Strobe a nivel alto (Strobe en el 4094, STCP en el 74HC595).
Entonces STROBE en un nivel alto mientras enviamos los datos. Con ello garantizamos que el display no muestre valores “extraños” hasta que no pongamos STROBE en bajo, instante que se transferirán los 8 bits completos a los latches de salida."
Aqui un video de como se ve esto (para el caso de las columnas)... Poco, pero se ve como digo.Hola amigo disculpa yo también are una matriz de esa dimencion pero no tengo ni idea de como hacer la programación crees que podrías ayudarme sólo tengo los conceptos básicos de programacion
Finalmente, decir que para el aumento de filas para estas matrices, almenos yo, NO recomiento el 74LS164 :5] Ah! y tampoco estoy usando transistores, aunque en caso de que se aumente MAS las filas, creo que ya seria necesario, desde ahora, siento que la intensidad ha bajado regularmente, pero bueno.
Por otro lado, el PIC (18F2550) se calienta regularmente, cosa rara :?
Epa, aqui el video:
[/youtube]
Salu2.