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.
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?