TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: alexandervr92 en 06 de Junio de 2017, 13:00:29

Título: Matriz led con botones
Publicado por: alexandervr92 en 06 de Junio de 2017, 13:00:29
Hola a todos, soy nuevo en este foro. He empezado a estudiar hace poco sobre los microncontroladores (en especial los pic) y me parece un mundo fascinante, he hecho algunos proyectos sencillos por mi cuenta, y ahora estoy en un proyecto que he visto es bastante popular. Se trata de una matriz de leds 8x40, uso un pic16f876 y registros de desplazamiento con latch, es parecido a un proyecto que encontre por internet. Quiero darle un poco de complejidad y he decidido añadir 3 botones, con los cuales poder elejir el texto que se desee mostrar. Mi idea es hacer una matriz bidimensional que contenga el abecedario, y con los botones <<+>>,<<->> ir navegando por la matriz hasta seleccionar una letra con el boton <<MODE>>. Pero no se muy bien como implmentarlo, alguien me podria ayudar con el codigo, o con nuevas ideas.
Muchas gracias por vuestra atencion
Aqui dejo el programa con la matriz bidimensional.


#include <16F876.h>
#FUSES NOWDT, HS
#use delay(clock=20M)

#define DATA   PIN_C5
#define CLOCK  PIN_C3
#define LATCH  PIN_C2
#define MAS PIN_A2
#define MODE PIN_A3
#define MENOS PIN_A4



int letras [27][7] = {{254,17,17,17,254,0,0},              //A1
                     {129,255,145,145,145,110,0},       //B2
                     {126,129,129,129,66,0,0},            //C3
                     {129,255,129,129,66,60,0},         //D4
                     {255,145,145,145,129,0,0},           //E5
                     {255,17,17,17,1,0,0},                //F6
                     {255,129,153,137,241,0,0},           //G7
                     {255,16,16,16,255,0,0},              //H8
                     {129,129,255,129,129,0,0},           //I9
                     {96,129,129,255,1,1,0},            //J10
                     {255,24,36,194,129,0,0},             //K11
                     {255,128,128,128,128,0,0},           //L12
                     {255,6,8,6,255,0,0},                 //M13
                     {255,6,24,96,255,0,0},               //N14
                     {255,25,49,193,253,0,0},             //Ñ15
                     {126,129,129,129,126,0,0},           //O16
                     {255,17,17,17,14,0,0},               //P17
                     {126,129,177,65,190,128,0},        //Q18
                     {255,17,17,241,142,0,0},             //R19
                     {142,145,145,145,97,0,0},            //S20
                     {1,1,255,1,1,0,0},                   //T21
                     {127,128,128,128,127,0,0},           //U22
                     {31,96,128,96,31,0,0},               //V23
                     {255,64,32,64,255,0,0},              //W24
                     {195,36,24,36,195,0,0},              //X25
                     {7,12,248,12,7,0,0},                 //Y26
                     {193,161,145,137,135,0,0 }};         //Z27

void reloj (int x){

   output_bit(DATA,2^x);
   output_bit(CLOCK,1);
   output_bit(CLOCK,0);
   output_bit(LATCH,1);
   output_bit(LATCH,0);
}

void main(){
   int i,j,k,l;                         //Variables contadores
   while(TRUE){                       //Ciclo infinito
      for(l=0;l<7;l++){           //Recorrido de tabla
         for(k=0;k<velocidad;k++){           //Refresco de matriz(velocidad)
            for(i=0;i<10;i++){         //Barrido de columnas
               for(j=0;j<7;j++){
                  reloj(j);              //Columnas ponderadas
                  output_b(letras[i+l][j+l]);  //Desplazamiento de tabla
                  delay_ms(1);           //Demora de multiplexado
               }
            } 
         }
      }
   } 
}   


Título: Re:Matriz led con botones
Publicado por: KILLERJC en 06 de Junio de 2017, 14:53:50
Te lo voy a plantear de esta forma.

En estos momentos tu forma de actualizar y mostrar en el display esta realizado en el loop principal, el problema esta en que si agregas codigo en el loop principal vas a tener problemas porque vas a demorar tu codigo de mostrar y esta demora se nota.

Una forma "sencilla" de hacer la muestra es utilizar un Timer, y que cada tanto actualize una linea. Lo que te permite mover la muestra a la interrupcion y no usar delays (como el delay_ms) tambien hace que sea cual sea la linea siempre se haga en tiempos constantes.

Por otra parte deberias utilizar el SPI para enviar los datos a los registros de desplazamiento, facilita mas las cosas.

Teniendo eso funcionando en las interrupciones ya te deja libre el loop principal para que agregues cualquier boton y que demore todo lo que quiera, ya que la muestra va a seguir funcionando aparte.
Una de las cosas que esta implicito en lo que dije es que el mostrar en el display sea totalmente independiente de lo que hagas en el loop principal.
Título: Re:Matriz led con botones
Publicado por: alexandervr92 en 08 de Junio de 2017, 16:20:21
podrias ayudarme a implementarlo con interrupciones, he estado leyendo un poco pero no termino de enterderlo bien, como podria hacerlo con mi proyecto.
Gracias por tu atencion.