Matriz de Leds PIC16f628a Controlada por Teclado PS2 - Consulta

Hola, bueno les comento, estoy cursando la carrera electrónica, y para fin de año tengo que presentar un proyecto. Elegí hacer una matriz de leds 7x80 controlada por un teclado PS2, exactamente igual a esta :
Lamentablemente no pude contactarme con la persona que hizo esa matriz, y no pude sacarme un par de dudas.

Todas mis dudas son sobre la parte de software, ya que la parte de la matriz, multiplexado, y registros, esta terminada y probada. Dada la conexion del hardware, para que encienda un led debe ingresarse un 1 en la fila y columna respectivamente. Ya averigue como funciona el teclado, como son sus secuencias.

Mi primer duda era sobre la eleccion del micro, no por la cantidad de pines de E/S, sino por la MEMORIA.

¿Cómo calculo la memoria que necesito? Tanto para la matriz como para la decodificacion del teclado. ¿El pic16f628a me alcanza tiene suficiente memoria?.

En cuanto a la programacion, tengo pensada hacerla en C. Ya que tengo mas conocimientos de C que Assembler. Mis dudas eran sobre como realizo las rutinas, o funciones de cada letra.
Mejor si alguien tiene alguna rutina en C, o algun codigo que ustedes creen que me serviria, desde ya se los agradeceria.


Como es un proyecto, tengo pensado mostrar todos los avances que realize.
 
Sobre el teclado para que no te hagas tantos líos que tal si usas el Compilador MikroC for PIC que tiene una librería para teclado PS2.
Sobre la memoria, que tal si pones en una sola tabla las letras minúsculas por ejemplo 26 letras de 5*7 = 130 caracteres en ingles, igual para mayúsculas y números. Luego una rutina que según la letra ingresada por el teclado, busque la unión de 5 caracteres que represente la letra para luego mostrar en la matriz... Es un idea que fácilmente cabe en el PIC que sugieres ya que tiene 2K de memoria de otro modo el PIC16F648A de 4K. O usar una memoria aparte controlada por I2C o SPI.

Un saludo.
 
Sobre el teclado para que no te hagas tantos líos que tal si usas el Compilador MikroC for PIC que tiene una librería para teclado PS2.
Sobre la memoria, que tal si pones en una sola tabla las letras minúsculas por ejemplo 26 letras de 5*7 = 130 caracteres en ingles, igual para mayúsculas y números. Luego una rutina que según la letra ingresada por el teclado, busque la unión de 5 caracteres que represente la letra para luego mostrar en la matriz... Es un idea que fácilmente cabe en el PIC que sugieres ya que tiene 2K de memoria de otro modo el PIC16F648A de 4K. O usar una memoria aparte controlada por I2C o SPI.

Un saludo.

Muchísimas gracias por la info del MikroC, había escuchado de alguna librería que era para PS2, pero pensé que lo tenia el CCS.
Después me fijo como son las funciones y como trabajan.

Cuando decís que busque la unión de 5 caracteres, a que caracteres te referís ?
Osea detecta la tecla presionada, busca la rutina de la letra o tecla presionada, y esa rutina se tiene que encargar de enviar al Registro los 5 bits de la primera fila, después activar la primer fila, y así con las 7 filas.


Otra duda, para escribir un mensaje completo en la matriz, por ejemplo:
"TU"

La secuencia de envío de datos seria:
.Envío primera fila de la "U" al registro de desplazamiento
.Envío primera fila de la "T" al registro de desplazamiento
.Enciendo 20mS la primera fila
.Apago primera fila
.Reseteo Registro
.Vuelvo a repetir el proceso para las filas restantes.

Corrijan me si me equivoco por favor, Gracias !
 
Es un ejemplo, digamos que una sola letra cabe en una matriz de 5x7, entonces se sabe que 5 son los bytes a representar en la matriz para que dibuje una letra, entonces cuando la letra a mostrar ingrese por el teclado, el programa debe de coger esos 5 bytes de una tabla y ponerlo en la matriz para así representar la letra.

Ahora sobre escribir el mensaje se me ocurre dos métodos:
1) Modo espejo (Invento mio ya que no se como decirlo, similar a lo que hace un LCD...), donde el PIC debe tener libre una misma cantidad de RAM que la longitud de la matriz y una rutina que siempre haga el multiplexado usando los datos que se escriban en la RAM. Entonces si algo varias en la RAM será reflejado en la matriz. Esto no te libera de tener tablas con las letras y números.
2) Con las mismas tablas, almacenar en un array en ASCII las letras que ingresan por el teclado; luego en la rutina de multiplexado...
> Coger un ASCII
> Con el ascii, buscar en las tablas los 5 byte que representen la letra
> y mostrar uno a uno en la matriz
cosa algo complicada y redundante ya que usarías varios contadores, punteros y algunas variables de almacenamiento para cada letra en un momento determinado hasta terminar de mostrar todos los ASCII y volver a iniciar... (se usa menos RAM).

Cada método depende bastante de la velocidad del PIC y en la práctica habría que ver cual de los dos se ejecuta más rápido.

Sigo pensando

Un saludo.
 
Última edición:
Dejo el conexionado de la matriz de leds solamente, ahí se muestra que se necesita un 1 en la fila y en la columna, ya que cuando el ULN2003 recibe un 1, en la salida muestra un 0, cerrando el cto del led. (Disculpas por la desprolijidad)

La rutina de la muestra del mensaje voy a analizar tu primer opcion. Lo que mas me importaba era la elección del PIC, supongo que con el 16f648a me alcanza no?

img023nf.jpg
 
Claro... y el PIC está bien...
Es una opinión pero que tal si revisas un par de librerías del PICC CCS "GLCD.c" y "GRAPHICS.c" la función 'void glcd_text57(...)'. te puede dar una idea para convertir el ASCII en valores para el matricial.

Un saludo
 
hola, yo tambien estoy haciendo el mismo proyecto, solo que no se mucho de programacion de pics, me podrias ayudar?


te agradeceria toda la ayuda que me pudieras brindar....

si entiendo lo que han puesto aqui y la logica que tiene, pero no se mucho de programacion de pics asi que me resulta un poco complicado...


ojala que me puedas ayudar
gracias..



PD. ya tienes algun codigo simulado o algo?
 
hola yo estoy haciendo mi matris ya he conseguido hacer algunos ejemplos de efectos
ya hice una matris para leer un sensor ds18b20 tambien pienso hacerla con reloj y pues los led me salieron baratos porque he estado comprando series navideñas de leds si necesitan los pcb avisenme y se los paso estas hechos con uln2008 y cmos4094 tengo varios tamaños a y los programas estan en assembler
 
hola aqui tienes los esquemas del pcb el diagrama no lo tengo solo lo hice asi tambien te adjunto el de proteus y un pequeño efecto que hace que las letras se derrumben y tambien tiene el efecto inverso estos programas estan en asm y el muestreo es por columnas estoy trabajando en como hacerlo por filas pero nadie rola el codigo. tambien voy a hacer que lea un reloj ds1307 y con teclado ps2 pero eso sera despues porque solo cuento con un pic16f84a
 

Adjuntos

  • matris 8x24.png
    matris 8x24.png
    310.8 KB · Visitas: 697
  • matris 8x24_2.png
    matris 8x24_2.png
    307.5 KB · Visitas: 474
  • matris Derrumbe 4.rar
    88 KB · Visitas: 1,884
Matriz de leds 7X32.
Pic 16f628a + 74lc164


Mi contribucion al foro por toda la ayuda brindada y espero que les sirva.

Proyecto completo codigo fuente + simulacion + proteus.

Descarga link https://www.forosdeelectronica.com/attachment.php?attachmentid=64789&d=1324675703

video corriendo:


Código:
DEFINE OSC 4


LINEA            var byte[32]
CHAR             VAR BYTE[7]
CHAR_ACT         VAR BYTE ' puntero de caracter
CHAR_LENGTH_ACT  VAR BYTE 'puntero de la longitud del caracter
CHAR_LENGTH      var byte ' longitud de la longitud
Caracter         var byte
Counter1         var byte
Counter2         var byte
Counter3         var byte
Counter4         var byte



'declaracion de alias

DATOS            var PORTA.0
CLOCK            var PORTA.1

'Inicializacion de los datos


TRISB = 0
TRISA = 0

linea[1]=$FF
linea[2]=$FF
linea[3]=$FF
linea[4]=$FF
linea[5]=$FF
linea[6]=$FF
linea[7]=$FF
linea[8]=$FF
linea[9]=$FF
linea[10]=$FF
linea[11]=$FF
linea[12]=$FF
linea[13]=$FF
linea[14]=$FF
linea[15]=$FF
linea[16]=$FF
linea[17]=$FF
linea[18]=$FF
linea[19]=$FF
linea[20]=$FF
linea[21]=$FF
linea[22]=$FF
linea[23]=$FF
linea[24]=$FF
linea[25]=$FF
linea[26]=$FF
linea[27]=$FF
linea[28]=$FF
linea[29]=$FF
linea[30]=$FF
linea[31]=$FF
linea[32]=$FF

char_act=0
counter3=0
counter4=0
counter2=1
char_length_act = 1
low clock
low datos

DATA @0,"CRISTO VIENE PRONTO PREPARATE      FELIZ NAVIDAD 2011 FOROS UCONTROL  " 'aca guardamos nuetro programa, es modificable al gusto
read char_act,caracter
gosub tabla_char

'inicio del programa
Inicio:

MENSAJE:
        linea[1]=char[char_length_act]
        IF CHAR_LENGTh_act = char_length  then
           char_act = char_act + 1  
Mens_Salto1:
           read char_act,caracter
           if caracter=$FF then 
              char_act=0
              goto mens_salto1
           endif   
           gosub tabla_char
           char_length_act=0
        endif   
Img:
        counter1=0
                
LineH:
         PORTB = $FF
         counter1 = counter1 + 1      'envia LA ACTIVACION del registro
         if counter1 = counter2 then  'serial paralelo
            gosub send_data0          'para activar la linea vertical
         else
             gosub send_data1
         endif
         if counter1 = 32 then goto LineV
         goto lineh
LineV:
      PORTB = LINEA[COUNTER2]    'determina la posicion activa horizontal
      pauseus 500              'y genera la activacion de los leds verticales
      if counter2 = 32 then
           counter2 = 1
         gosub send_data0   
      ELSE
            counter2 = counter2 + 1
            gosub send_data1
      endif
 
      
Shift_Left:
           if counter3 = 35 then
                counter3 = 0
                COUNTER4 = COUNTER4 + 1
                if counter4 = 2 then ' 250 del counter3 *4 del 
                
                   linea[32]=linea[31]'                   
		           linea[31]=linea[30]'
                   linea[30]=linea[29]'counter4 es aprox 0.5seg
                   linea[29]=linea[28]'si hay mas lineas 
                   linea[28]=linea[27]'hay q agrandar losvectores
                   linea[27]=linea[26]'y cambiar por un for   
                   linea[26]=linea[25]  
                   linea[25]=linea[24]  
                   linea[24]=linea[23]
                   linea[23]=linea[22]'counter4 es aprox 0.5seg
                   linea[22]=linea[21]'si hay mas lineas 
                   linea[21]=linea[20]
                   linea[20]=linea[19]'y cambiar por un for   
                   linea[19]=linea[18]  
                   linea[18]=linea[17]  
                   linea[17]=linea[16]    
       			   linea[16]=linea[15]'
                   linea[15]=linea[14]'counter4 es aprox 0.5seg
                   linea[14]=linea[13]'si hay mas lineas 
                   linea[13]=linea[12]'hay q agrandar losvectores
                   linea[12]=linea[11]'y cambiar por un for   
                   linea[11]=linea[10]  
                   linea[10]=linea[9]  
                   linea[9]=linea[8]  
                   linea[8]=linea[7]'counter4 es aprox 0.5seg
                   linea[7]=linea[6]'si hay mas lineas 
                   linea[6]=linea[5]'hay q agrandar los vectores
                   linea[5]=linea[4]'y cambiar por un for   
                   linea[4]=linea[3]  
                   linea[3]=linea[2]  
                   linea[2]=linea[1]
                   counter4 = 0
                   char_length_act = char_length_act+1
                   GOTO INICIO
                endif
            ELSE
                counter3 = counter3 + 1
            endif
            goto IMG
                      
SEND_DATA0:
           low datos
           pauseus 2
           low clock
           pauseus 2
           high clock
           RETURN

SEND_DATA1:
           HIGH DATOS
           pauseus 2
           low clock
           pauseus 2
           high clock
           RETURN

'tabla de seleccion de caracter
           
TABLA_CHAR:
    select case caracter
            case " "
                char_LENGTH=5
                char[5]=$FF
                char[4]=$FF
                char[3]=$FF
                char[2]=$FF
                char[1]=$FF
            
            
            
           
           case "C"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%1011101
                char[3]=%0111110
                char[2]=%0111110
                char[1]=%1000001 
            
                
              
            case "R"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%1001000
                char[3]=%0110111
                char[2]=%0110111
                char[1]=%0000000  
                
            
            
            case "I"
                char_LENGTH=4
                char[4]=$FF
                char[3]=%0111110
                char[2]=%0000000
                char[1]=%0111110
                
            
            case "T"
                char_LENGTH=5
                char[5]=$FF
                char[4]=%0111111
                char[3]=%0000000
                char[2]=%0000000
                char[1]=%0111111
                       
                     
                
            
            case "O"
                char_LENGTH=6
                char[6]=$FF
                char[5]=%1000001
                char[4]=%0111110
                char[3]=%0111110
                char[2]=%0111110
                char[1]=%1000001
            
             ...........caracteres del A a la Z + numeros 
           
                
            case else
                char_LENGTH=5
                CHAR[1]=$FF
                CHAR[2]=$FF
                CHAR[3]=$FF
                CHAR[4]=$FF
                CHAR[5]=$FF

    end select
    return
             
                 
END
 
me parese muy interesante tu aporte pero tengo una pregunta en que vercion del proteus diseñastes tu circuito por que cuando lo deseo abrir me salta como un pequeño error.
 
yo hice esta simulación en el proteus es de una matrix de 7 x 40 con memoria i2c y se graba por el puerto serial de la pc es solo un ejemplo creo que no quedaria muy bien si la arman por que el barrido no es por filas les dejo un video y el material para que prueben
ya tengo una armada con teclado pero es en ccs
 

Adjuntos

  • matrix_tecni_basic.rar
    398.5 KB · Visitas: 1,123
Última edición por un moderador:
yo hice esta simulación en el proteus es de una matrix de 7 x 40 con memoria i2c y se graba por el puerto serial de la pc es solo un ejemplo creo que no quedaria muy bien si la arman por que el barrido no es por filas les dejo un video y el material para que prueben
http://www.youtube.com/watch?v=drRo6ICWYcU&
http://www.4shared.com/rar/_tfcSkDx/matrix_tecni_basic.html
ya tengo una armada con teclado pero es en ccs

Exelente aporte amigo, lo he probado y funciona (y) :aplauso: la verdad, me asombra la simpleza del codigo comparado con lo que es capaz de hacer :eek:
saludosss
 
Exelente aporte amigo, lo he probado y funciona (y) :aplauso: la verdad, me asombra la simpleza del codigo comparado con lo que es capaz de hacer :eek:
saludosss
hasta yo me asombre cuando me funciono la simulacion el codigo del pic es simple por que no hace mucho solo recibe y transmite bytes el verdadero trabajo lo hace la pc en el programa vb.net que transforma las letras en bytes
 
hasta yo me asombre cuando me funciono la simulacion el codigo del pic es simple por que no hace mucho solo recibe y transmite bytes el verdadero trabajo lo hace la pc en el programa vb.net que transforma las letras en bytes
es un trabajo exelente amigo, te felicito :) . ahora, digamos que yo hago el diseño en la vida real, el programa en visual basic que realizaste ¿puede utilizar el puerto serie fisico de la pc para programarlo?
saludosss
 
Atrás
Arriba