Autor Tema: Matriz leds  (Leído 1668 veces)

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

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Matriz leds
« en: 25 de Febrero de 2012, 18:19:27 »
Estoy intentando controlar una matriz de leds en pic simulator con un registro de desplazamiento 74ls164 y controlada con puladores.
Dependiendo que pulsador se active deben encenderse o apagarse los leds de la matriz independientemente y mantenerse encendidos y apagados hasta que se vuelva a pulsar.
Hay varios ejemplos por la red y en el foro sobre matriz de leds. El problema que tengo es que no sé en que estado van a estar los leds,dependerá del botón pulsado en cada momento.
En los ejemplos que he visto utilizan una variable ,por ejemplo, de la forma dato=%10100000 siendo los unos y ceros el estado encendido o apagado del led correspondiente de la fila que se activa.
Para acceder a los bits individuales puedo hacer dato.0 dato.1 etc. Pero ¿cómo se hace si a partir de los bits individuales quiero formar el byte?. De esta forma puedo almacenar el estado de los botones en bit y después juntarlos para mandarlos al registro de desplazamiento.
Muchas gracias

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Matriz leds
« Respuesta #1 en: 04 de Marzo de 2012, 15:44:44 »
Buscando encontré la ampliación de salidas con un cd 4094 .
Con este programa consigo encender o apagar los leds según necesite.Lo que hago es definir variables tipo byte y asignar el valor 0 ó 1 a cada uno de los ocho bit de las variables. Después lo que hago es mandar los bits a los cd4094.
Código: [Seleccionar]
Define CONF_WORD = 0x3d31

'PIC: 16F876 - 4Mhz XTAL,



'----- CONFIGURO PUERTOS-----
PORTA = 0

'Configuro el portA:
TRISC.1 = 0  'Salida CLOCK
TRISC.0 = 0  'Salida DATA
TRISC.2 = 0  'salida load
TRISA.2 = 1  'Entrada Dip 0
TRISA.3 = 1  'Entrada Dip 1
TRISA.4 = 1  'Entrada Dip 2
TRISA.5 = 1  'Entrada Dip 3

'Configuro el portB:
TRISB.0 = 0  'Salida (Fila 1)
TRISB.1 = 0  'Salida (Fila 2)
TRISB.2 = 0  'Salida (Fila 3)
TRISB.3 = 0  'Salida (Fila 4)
TRISB.4 = 0  'Salida (Fila 5)
TRISB.5 = 0  'Salida (Fila 6)
TRISB.6 = 0  'Salida (Fila 7)
TRISB.7 = 0  'Salida (Fila 8)

'Simbolos
Symbol clk_4094 = PORTC.1
Symbol data_cd4094 = PORTC.0
Symbol load_cd4094 = PORTC.2
Symbol fila1 = PORTB.0
Symbol fila2 = PORTB.1
Symbol fila3 = PORTB.2
Symbol fila4 = PORTB.3
Symbol fila5 = PORTB.4
Symbol fila6 = PORTB.5
Symbol fila7 = PORTB.6
Symbol fila8 = PORTB.7
Dim u As Byte
Dim i As Byte
Dim dato As Byte
dato.0 = 1
dato.1 = 1
dato.2 = 1
dato.3 = 0
dato.4 = 0
dato.5 = 0
dato.6 = 1
dato.7 = 1
Dim dato1 As Byte
dato1.0 = 0
dato1.1 = 0
dato1.2 = 0
dato1.3 = 0
dato1.4 = 0
dato1.5 = 0
dato1.6 = 0
dato1.7 = 1
Dim dato2 As Byte
dato2.0 = 0
dato2.1 = 0
dato2.2 = 0
dato2.3 = 0
dato2.4 = 0
dato2.5 = 0
dato2.6 = 0
dato2.7 = 0
Dim dato3 As Byte
dato3.0 = 0
dato1.1 = 0
dato3.2 = 0
dato3.3 = 0
dato3.4 = 0
dato3.5 = 0
dato3.6 = 0
dato3.7 = 0



Dim data As Bit

Dim pp1 As Bit
pp1 = 0
Dim pp2 As Bit
Dim pp3 As Byte
Dim pp As Byte



data = 0

'Declaracion de variables
Dim col As Byte
Dim aux As Word

PORTB = 255  'Apago todas las filas antes de comenzar




'****Solo simulacion****
'Ejemplo 32'By COS, 12/08
'Devuelve el valor de un bit determinado
'de una varia de hasta 32Bits.
Dim entradas As Byte  'word  'byte
Dim datos As Bit
entradas = dato1
datos = v_bit(entradas, 2)  'Selecciona el bit
If datos = 01 Then pp = 2




main:


fila8 = 0
load_cd4094 = 0

data_cd4094 = dato.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = dato1.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0


load_cd4094 = 1
load_cd4094 = 0
Goto main
End                                               



'**** Subrutinas ****
'V_BIT es uan funcion que nos devuelve el estado
'de un bit de una variable determinada
'ARG1 es la variable de entrda, hasta 32bit
'ARG2 es el numero de orden del bit deseado, de 0 a 31
'Mediante V_BIT transferimos el valor del bit deseado
'esta es la parte de la rutina que no entiendo
Function v_bit(arg1 As Byte, arg2 As Byte) As Bit
arg1 = ShiftRight(arg1, arg2)
arg2 = arg1 And 1
v_bit = arg2.0
End Function                                     



Supongo que habrá una manera más elegante de hacerlo.
Estoy dando vueltas a una función de Carlos que extrae el estado de un bit de una variable.La he modificado un poco y parece que funciona, pero no sé porqué.
No sé que hacen las líneas
arg1 = ShiftRight(arg1, arg2)
arg2 = arg1 And 1
v_bit = arg2.0
¿Me lo podeis aclarar?


 

anything