Autor Tema: Dudas para implementar una funcion en C, y desplazar texto de una Matriz de Led  (Leído 5430 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Bueno, despues de ver la magnifica matriz de led de Cryn, he empezado a trastear un poco con proteus y CSS, y he conseguido que salga la letra que yo quiero en la matriz de 8x8, vale ahora os presento el problemilla que tengo.

Para mostrar la letra llamo a una funcion escribir(), a la cual no le tienes que dar ningun parametro y tampoco devuelve ningun parametro, pero para representar la letra, tengo que tenerla en la misma funcion

Código: C
  1. void escribir(void){
  2.    int i;
  3.    
  4.    for (i=0;i<=4;i++){
  5.       output_bit(data,bit_test(M[i],fila));
  6.       output_low(clock);
  7.       output_high(clock);
  8. }
  9. i=0;
  10. while (i<x){
  11. output_high(data);
  12. output_low(clock);
  13. output_high(clock);
  14. i++;
  15. }

Ahora lo que yo quiero hacer es lo siguiente, como podeis ver hay un trozo de la funcion escribir que pone: 
Código: C
  1. output_bit(data,bit_test(M[i],fila));
donde pone M, es la letra que yo quiero representar en la matriz y (i) es el numero de casillas que tiene la letra. Entonces lo que yo quiero hacer es que al poner
Código: [Seleccionar]
escribir(M[i]); en mi código, llame a la funcion escribir y me represente la letra, pero el problema que tengo es que no se como definir dicha función, yo intenté definirla así:

Código: C
  1. void escribir(int letra[int n]);
  2.  
  3. void escribir(int letra[int n]){
  4.    int i;
  5.    
  6.    for (i=1;i<=n;i++){
  7.       output_bit(data,bit_test(letra[i],fila));
  8.       output_low(clock);
  9.       output_high(clock);
  10.    }
  11. i=0;
  12.    while (i<x){
  13.       output_high(data);
  14.       output_low(clock);
  15.       output_high(clock);
  16.       i++;
  17.    }

Pero es incorrecto esta manera de definir la funcion, la verdad es que no se como implementar la funcion, a ver si me podeis ayudar.
Si hay alguna cosa que no queda clara no dudeis en consultarmelo.
De mientras voy a seguir mirando en San Google a ver si encuentro algo, gracias.

Salu2.
« Última modificación: 12 de Febrero de 2009, 13:50:51 por jim_17 »
Share the world !

Blog's

http://www.area0x33.com

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Implementar una funcion en C
« Respuesta #1 en: 04 de Febrero de 2009, 14:18:30 »
Bueno he investigado un poco por google y me he dado cuenta que a las tablas, se les llama arrays y en el foro hay bastante info asi que sigo buscando... :D.
Share the world !

Blog's

http://www.area0x33.com

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Implementar una funcion en C
« Respuesta #2 en: 04 de Febrero de 2009, 15:11:07 »
Hola jim_17 dejé el código que hice para mi publik, si queres lo ves en el hilo, talvez pueda ayudarte

un saludo
.

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Implementar una funcion en C
« Respuesta #3 en: 04 de Febrero de 2009, 16:00:49 »
Pues muchas gracias cryn, intentaré mirar el código en caso de que no tenga otra opción jeje, prefiero romperme el coco yo, y luego mirar otros codigos para mejorarlo, pero primero hacer yo el primer intento, asi que ya me ha salido lo que queria hacer !!!

Y....  me sigo autorespondiendo, primeramente antes de iniciar el post no sabía que a las tablas de datos, se les llamaba arrays y la informacion que obtenia en el buscador google cuando ponia la palabra funcion con tablas, pues era escasa, despues buscando por el foro la palabra arrays y funciones, obtuve informacion bastante valiosa, encontré que no se puede pasar un array directamente a una funcion en C, que tienes que hacerlo con punteros. Como no sabía lo que eran los punteros pues continué buscando información. Despues de un par de horas buscando información he aconseguido mi propósito, que es el de hacer una funcion en C utilizando arrays, en la cual le meto un puntero jeje. Bueno, posteo aquí mi código completo y la simulacion el proteus. Gracias a los post del foro y a SanGoogle, amén. :D.

Código: C
  1. #include <16f877a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
  3. #USE DELAY(clock=4MHZ)
  4. #define data PIN_C0
  5. #define clock PIN_C1
  6. #define strobe PIN_C2
  7. #define show PIN_C3
  8. #byte port_b=0X06
  9.  
  10. void escribir(int *letra,int n,int time);
  11. int M[8]={  0b00000000,
  12.             0b00000000,
  13.             0b11111001,
  14.             0b11110011,
  15.             0b11110011,
  16.             0b11111001,
  17.             0b00000000,
  18.             0b00000000};
  19. int J[8]={  0b00111100,
  20.             0b00111100,
  21.             0b00111100,
  22.             0b00000000,
  23.             0b10000000,
  24.             0b11111100,
  25.             0b11111100,
  26.             0b11111100};
  27.            
  28. int I[8]={  0b11111111,
  29.             0b11111111,
  30.             0b01111110,
  31.             0b00000000,
  32.             0b00000000,
  33.             0b01111110,
  34.             0b11111111,
  35.             0b11111111};
  36.          
  37.          
  38.          
  39.  
  40.            
  41. int *p;
  42.            
  43.  
  44. void main(){
  45.  
  46. SET_TRIS_B(0x00);
  47. SET_TRIS_C(0X00);
  48. output_low(show);
  49. output_low(data);
  50. output_low(strobe);
  51. output_low(clock);
  52. port_b=0x00;
  53.  
  54.  
  55.    while (true){
  56.       p=J;
  57.       escribir(p,7,30);
  58.       p=I;
  59.       escribir(p,7,30);
  60.       p=M;
  61.       escribir(p,7,30);
  62. }
  63. }
  64.  
  65. void escribir(int *letra,int n,int time){
  66.    int col;
  67.    int fila;
  68.    output_high(strobe);
  69. while (time>0){
  70.    for (fila=0;fila<=7;fila++){
  71.       for (col=0;col<=n;col++){
  72.          output_bit(data,bit_test(letra[col],fila));
  73.          output_low(clock);
  74.          output_high(clock);
  75.          }
  76.       output_high(show);
  77.       bit_set(port_b,fila);
  78.       delay_us(400);
  79.       bit_clear(port_b,fila);
  80.       }
  81.       time--;
  82.    }
  83. }

El circuito en Isis, de proteus no tiene transistores ni resistencias, pues la simulacion se hace mas lenta con esos componentes ;). Os adjunto los archivos para que podais simularlo, porque si solo os enseño fotos pues, no tiene tanta gracia jeje.

El código muestra las letras J, I, M, mas tarde intentare que las muestre como un texto de izquierda a derecha.

Share the world !

Blog's

http://www.area0x33.com

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Implementar una funcion en C
« Respuesta #4 en: 04 de Febrero de 2009, 16:22:37 »
hola jim si se pueden pasar vectores estaticos en una funcion (pero no como lo definiste) , pero ocupa mas recursos ya que se le pasa una copia del vector a la funcion por eso siempre es conveniente utilizar punteros a datos (*) o bien la direccion de memoria (&) dependiendo del uso.
 Saludos
LAS MALVINAS SON ARGENTINAS!

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Implementar una funcion en C
« Respuesta #5 en: 05 de Febrero de 2009, 16:47:30 »
Mmmmmmmmm, me está costando intentar implementar el desplazamiento jeje, de momento tengo solo el intento pq no logro hacerlo jaja. Alguna idea ?


Salu2.
Share the world !

Blog's

http://www.area0x33.com

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Implementar una funcion en C
« Respuesta #6 en: 05 de Febrero de 2009, 18:04:19 »
yo hice algo nose, talvez complicado o fácil, mi idea era esta:

tener una matriz (array bidimencional) de la cantidad de matrices +1 que tengas en tu hard

por ejemplo si tienes una, el 8 son las columnas

matriz[2][8]={"\0"} // esta también representa al hard, es +1 porque no me acuerdo, creo para que en la +1 (que es virtual) solo esta en soft, para cargarle ahi primero toda la letra y sea más facil el rotar, sino tendrías que preocuparte de cargar columna por columna

para una matriz hago un shift_left guardando los "carries" y después hago un OR del carrie con el valor de la matriz siguiente

y así para cada fila

quieres ver código?, ahi esta en mi link anterior :mrgreen:

un saludo
.

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Implementar una funcion en C
« Respuesta #7 en: 05 de Febrero de 2009, 19:01:09 »
Pues ya me miré tu código, cogí alguna idea a ver si me sale jeje.
Share the world !

Blog's

http://www.area0x33.com

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Implementar una funcion en C
« Respuesta #8 en: 11 de Febrero de 2009, 14:03:10 »
Bien, intentando e intentando, no consigo desplazar el texto de derecha a izquierda, expongo lo que tengo porque no encuentro el fallo :S,

1º Utilizo dos matrizes que contienen la letra anterior y la siguiente (la letra que desplazaremos).
2º Lo que hago para desplazar la letra es: cargar en la matriz a mostrar la letra anterior y luego modificar los bits de la letra anterior introduciendo poco a poco los bits de la letra siguiente.
3º Una vez tengo modificados los bits de la matriz a mostrar voy cargando los datos en el registro de desplazamiento y activando las respectivas salidas del puerto b.

Código: [Seleccionar]
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#USE DELAY(clock=4MHZ)
#define data PIN_C0
#define clock PIN_C1
#define strobe PIN_C2
#define show PIN_C3
#byte port_b=0X06

void escribir(int *letra,int time);
void cargar_dato(int dato);
void muestra_fila(int fila);
void desplazar_(int *letra,int velocidad);
void desplazar_izq (int *m_actual,int *m_siguiente,int refresh);  //variables globales
int *m_actual,*m_anterior,desplazamiento,matriz_mostrar[8];
int *p,*p2,col,fila;


int M[8]={  0b00111100,             //letras a utilizar
            0b00011000,
            0b00000000,
            0b00100100,
            0b00111100,
            0b00111100,
            0b00111100,
            0b00111100};
           
int J[8]={  0b00000000,
            0b00000000,
            0b11100111,
            0b11100111,
            0b11100111,
            0b11100111,
            0b00000111,
            0b00001111};
          
int I[8]={  0b11000011,
            0b11100111,
            0b11100111,
            0b11100111,
            0b11100111,
            0b11100111,
            0b11100111,
            0b11000011};
           
int Null[8]={0xFF,
               0xFF,
               0xFF,
               0xFF,
               0xFF,
               0xFF,
               0xFF,
               0xFF};

        
        
        

           

           

void main(){

SET_TRIS_B(0x00);
SET_TRIS_C(0X00);
output_low(show);
output_low(data);
output_low(strobe);
output_low(clock);
port_b=0x00;


   while (true){
p=Null;
p2=J;
desplazar_izq(p,p2,10);
p=p2;
p2=I;
desplazar_izq(p,p2,10);
p=p2;
p2=M;
desplazar_izq(p,p2,10);
}
}


void escribir(int *letra,int time){
   while (time>0){
      for (fila=0;fila<8;fila++){
         cargar_dato(letra[fila]);
         muestra_fila(fila);
         }
         time--;
      }
}

void muestra_fila(int fila){
   output_high(show);
   bit_set(port_b,fila);
   delay_us(400);
   bit_clear(port_b,fila);
}


void cargar_dato(int dato){
   output_high(strobe);
   for(col=0;col<8;col++){
         output_bit(data,(dato & 0x1));
         dato=dato>>1;
         output_low(clock);
         output_high(clock);
   }
}

void desplazar_izq (int *m_actual,int *m_siguiente,int refresh){
escribir(m_actual,20);                                       
for (fila=0;fila<8;fila++){                        //escribo en la matriz lo que necesito escribir
        matriz_mostrar[fila]=m_actual[fila];        //asi solo modifico la matriz a desplazar.
        }
desplazamiento=8;
while (desplazamiento!=0){

for (fila=0;fila<8;fila++){                        //modifico la matriz a mostrar
matriz_mostrar[fila]=(matriz_mostrar[fila]<<1)+(bit_test(m_siguiente,desplazamiento)); //lo que hago aqui es desplazar la matriza mostrar ej. 0b11111111<<1.

}                                                                                             // quiero que haga 0b11111110; luego si le sumo el bit que quiero mostrar.
p=matriz_mostrar;                                                                  //0b11111110 +1 = 0b11111111; 0b11111110+0= 0b11111110.
escribir(p,refresh);
desplazamiento--;
}

}

Aquí está el código, tengo varias funciones implementadas, la funcion cargar dato, escribir y mostrar fila funcionan bien, la funcion desplazar_izq me hace cosas raras, desplaza cosas pero no desplaza las letras que yo quiero que desplaze, a ver si podeis ayudarme a solucionar el pequeño problema que tengo.

Os adjunto el proyecto de proteus para que podais ver lo que sucede.

« Última modificación: 12 de Febrero de 2009, 13:54:28 por jim_17 »
Share the world !

Blog's

http://www.area0x33.com

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Dudas para implementar una funcion en C, y desplazar texto de una Matriz de Led
« Respuesta #9 en: 12 de Febrero de 2009, 21:40:22 »
Me Vuelvo a autoresponder yo solo, en el foro de Ucontrol me ayudaron a solucionar el problema, modificandome la funcion desplazar_izq, pero yo descontento con eso me puse a repasar todos y cadauno de los trozos de código de mi funcion y tras repasar y mirar y modificar me he dado cuenta de que hay un trozo en el que me había dejado una cosa.

yo hacía:

Código: C++
  1. matriz_mostrar[fila]=(matriz_mostrar[fila]<<1)+(bit_test(m_siguiente,desplazamiento));

Claro pero donde pone m_siguiente, que es un array, no defino que byte cojo, falta poner m_siguiente[fila], pues esa tontería hacía que el código no funcionara. Tambien hace falta modificar desplazamiento=8, por desplazamiento=7. o modificar en bit_test(m_siguiente[fila],desplazamiento-1)

Cryn te voy pillando poco a poco jeje, espero que mi matriz pueda llegarle a la suela de los zapatos de la tuya :D.
Share the world !

Blog's

http://www.area0x33.com

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Dudas para implementar una funcion en C, y desplazar texto de una Matriz de Led
« Respuesta #10 en: 12 de Febrero de 2009, 21:57:22 »
Hola jim, estaba viendo tu código de pasadita, vi muchos punteros y me asuste, jeje se que es una de las mejores formas manejarlo de esa manera, pero no sabía donde meterle, quizá la costumbre me gana, muy rara vez uso punteros.

Déjeme estudiarlo un poco más vale? y muchas gracias por el elogio a mi minipublk :mrgreen: y seguro que te saldrá muy bueno el tuyo :-/ :-/

un saludo
.

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Dudas para implementar una funcion en C, y desplazar texto de una Matriz de Led
« Respuesta #11 en: 13 de Febrero de 2009, 18:13:26 »
Pues si, el código esta muy desordenado, y tampoco quiero ordenarlo demasiado porque esta en modo "PRUEBA", muchos de los punteros los puedo quitar, lo que estaba aprendiendo a usarlos y me hacia gracia utilizarlos. Lo que todavía tengo que pensar como utilizar la funcion desplazar_izq sin utilizar los punteros y definiendo los arrays como constantes, pero eso es algo que haré poco a poco jeje, de momento estoy muy satisfecho de que me haya salido el desplazamiento y tambien me ha ayudado algo tu código, inconscientemente siempre se copian ideas jeje.


Salu2.
Share the world !

Blog's

http://www.area0x33.com