# consulta y ayuda con vb6 y lpt1



## rc_77_2000 (Ago 3, 2011)

Hola a todos primero quiero decir que no se programacion, pero e leido y visto un par de tutoriales sobre vb6 y lpt1. y segui el tutorial basico vb6 lpt1 de esta pagina que pongo a continuacion.
http://electronicaayroboticaa.blogspot.com/2011/06/control-puerto-paralelo-con-visual.html
ya que lo que estoy buscando es algo así un boton de encendido y otro de apagado, en cada uno de los bit de salida el lpt osea d0,d1,d2,d3,d4,d5,d6,d7   pero al hacer como dice en la web. Si funciona pero con un solo bit esplico como ise, dos botones este codigo mas el modulo.
Private Sub Command1_Click() 
          Out &H378, 0 
          End Sub 
Private Sub Command2_Click() 
          Out &H378, 1 
          End Sub

y funciona de 10 prende y apaga el led, ahora para probar mas botones puse 6 botones 
con en sigiente codigo.
Private Sub Command1_Click() 
          Out &H378, 0 
          End Sub 
Private Sub Command2_Click() 
          Out &H378, 1 
          End Sub
Private Sub Command3_Click() 
          Out &H378, 0 
          End Sub 
Private Sub Command4_Click() 
          Out &H378, 2 
          End Sub
Private Sub Command5_Click() 
          Out &H378, 0 
          End Sub 
Private Sub Command6_Click() 
          Out &H378, 4 
          End Sub
Lo que paso fueron 2 cosas, una es que cuando toco un boton prende un led y cuando toco otro boton obio prende otro led, pero me apaga el que estaba prendido y no es lo que busco. La otra cosa es que el boton de apagado apaga cualquier led no el que esta en las lineas de su comando, osea que es como si apagado sea un solo boton que deja en cero todo el puerto.
yo lo que quiero es 16 botones 8 de encendido 8 de apagado y que cada bon apage y prenda su respectivo dato.
espero me ayuden esde ya muchas Gracias


----------



## rc_77_2000 (Ago 6, 2011)

Vamos muchachos que alguno me de una mano con el codigo.
muchas Gacias


----------



## IMASDPIC (Ago 6, 2011)

me parece que tu problema es que debes enseñarte el codigo binario y convertirlo a decimal
que traba el visual por ejemplo si quieres prender un led escribes out 888,1
si quieres prender 8 a la vez 11111111 que  son 255
si quieres tener uno encendido y prender otro tienes que mandar el codigo que refiera al que tienes ya 
prendido y al que quieres prender  si tienes 8 led y quieres y quieres prender el 1 envias 1 
y si ademas quieres prender el 8 esto en codigo binario 10000001 y en decimal 129,no se si es lo que buscas pero cojete la hoja de codigo binario y con la calculadore cientifica lo conviertes
un saludo

te explico para hacer encendido y apagado con el mismo y lo otro te lo calientas tu la cabeza a ver que tal te va 
dim dato as byte      "esto es declaracion general"
dato = dato + 1                              "  para el command button 
if dato = 1 then shape1.fillstyle = true ut 888,1 else dato<>1 then shape1.fillstyle = false :dato= 0

if dato= 1 then
out 888, 1 
elseif
dato<> 1 then
out 888,0   " si tu en la parte del apagado pones un cero esto lo apaga todo ten en cuenta que 
si quieres apagar 1 debes poner el codigo binario que corresponda a ese en apagado


----------



## rc_77_2000 (Ago 6, 2011)

Hola imasdpic gracias por responder, como dige no se nada de programacion y me tire aver si podia hacer este programita. hay un par de cosas que no me quedan claras, se que para prender dos led hay que sumar ej: 2 y el 4 2+4=6 binario 110 esto se pone un boto con ese codigo y al precionar prende los dos bit. pero yo no quiero un boton 2y4, se entiende?
otra cosa me podes explicar un poco mejor esto.





> te explico para hacer encendido y apagado con el mismo y lo otro te lo calientas tu la cabeza a ver que tal te va
> dim dato as byte      "esto es declaracion general"
> dato = dato + 1                              "  para el command button
> if dato = 1 then shape1.fillstyle = true ut 888,1 else dato<>1 then shape1.fillstyle = false :dato= 0
> ...


gracias.


----------



## IMASDPIC (Ago 7, 2011)

Dim dato as byte   "esto declara que la palabra dato en un numero entre 0 y 255 (byte)es una forma de 
                           guardar un espacio para tu numero en la memoria del programa y lo asignamos ese
                           espacio con el nombre de dato igual da dato que otro nombre es solo una forma de  
                            guardar un codigo
dato = dato + 1  "esto en el boton cundo lo pulses dato valdra 1,y significa cuando dato sea 1 
if dato = 1 then  " que que el puerto lpt 888 osea el lpt1 = el bit 1 sea 1
out888 ,1          " 
elseif                 " pero 
dato <> 1 then    " si dato es distinto de 1 que
out888, 0           " el puerto 888 bit 1 sea 0 
dato = 0             "  y dato vuelva a valer 0 (esto es para que cuando pulses 1 boton mandes 1 y 
                         "cuando lo vuelvas a pulsar mandes 1)

para hacer lo que tu quieres es algo mas complejo porque tienes ademas de asignarle a cada boton+
que vale un numero ese numero se ha de guardar en un espacio de la memoria recuerda dim dato as byte 
o dim dato as variant (variant numero que cambia pero mas grande que un byte para hacer calculos mas grandes)
luego como tienes varios botones y cada uno tiene un numero diferente debes hacer operaciones aritmeticas o sea suma o resta y utilizar condiciones if por ejemplo tu pulsas el 1 eso se carga en dato
pulsas el el 2 y eso se carga en dato2  
una condicion
dato4 = 10
dato5 =1
" if dato = 1 and dato2 = 1 then dato3 = dato4+dato5
eso significa que si pulsas el boton 1 y pulsas el boton 2 el dato 3   vale el valor en decimal que le hayas 
asignado a dato3 y dato 4
out888,dato3
bueno si tengo un rato te lo paso el preograma hecho pero te dire que tienes que leerte
algun manual de visual basic 6 o visual studio (descargatelo)
luego leer declaracion de constantes y variables 
operaciones aritmeticas con numeros 
bloques condicionales if else elseif 
addemas de saber estructurar un programa mira aqui tienes de todo
http://www.canalvisualbasic.net/
un saludo esto cuando le pilles el gusto luego no lo soltaras porque ahora quieres encender eso pero mas adelante querras controlar un ploter x,y,z como hice yo o controlar motores paso a paso 
y ahi se lia mucho mas la cosa pero ten en cuenta que todos empezamor igual y hay mucho que leer y probar 
un saludo


----------



## Meta (Ago 7, 2011)

Hola:

Quizás te pueda ayudar este manual sobre puerto paralelo con VB .net.
http://electronica-pic.blogspot.com/2010/07/interfaz-puerto-paralelo-lpt.html






Saludo.


----------



## retrofit (Ago 7, 2011)

rc_77_2000 dijo:


> Hola a todos primero quiero decir que no se programacion, pero e leido y visto un par de tutoriales sobre vb6 y lpt1. y segui el tutorial basico vb6 lpt1 de esta pagina que pongo a continuacion.
> http://electronicaayroboticaa.blogspot.com/2011/06/control-puerto-paralelo-con-visual.html
> ya que lo que estoy buscando es algo así un boton de encendido y otro de apagado, en cada uno de los bit de salida el lpt osea d0,d1,d2,d3,d4,d5,d6,d7   pero al hacer como dice en la web. Si funciona pero con un solo bit esplico como ise, dos botones este codigo mas el modulo.
> Private Sub Command1_Click()
> ...



Buenas noches.
Tienes que tener en cuenta que el número que mandas al puerto de 8 bit es en realidad en binario... me esplico si envias un 0 pones todas las salidas a 0, si envias un 1 pones el bit 1 (pata 2) a 1, si envias un 2 pones el bit 2 (pata 3) a 1, si envias un 3 pones los bits 1 y 2 a 1
(patas 2 y 3) ten en cuenta que un tres en binario es 11.
creo lo que he explicado hasta ahora está claro.
el código que tienes es correcto pero....

Ten en cuenta lo siguiente
Tienes que ver el puerto  como una palabra Binaria de 8 bit...
Todas las salidas a "0" =  00000000 = 0 en Decimal
Todas las salidas a "1" =  11111111 = 255 en Decimal
Solo tienes que enviar el número que quieras al puerto
Esa libreria tambien permite enviar el número en binario, creo recdordar que era algo así...

Out &H378, "11111111"; Pon a "1" el bit que quieras que se encienda o a "0" para apagarlo

Espero que esto te ayude.
Saludos


----------



## Chico3001 (Ago 7, 2011)

Mas simple... realiza sumas y restas aritmeticas en potencias de 2 (1, 2, 4, 8, 16 ,32 etc)

Salida = Salida + 1 (activa primer bit respetando los anteriores)
Salida = Salida + 2 (activa segundo bit respetando los anteriores)
Salida = Salida + 4 (activa segundo bit respetando los anteriores)
etc....


----------



## IMASDPIC (Ago 8, 2011)

sinceramente lee un manual de visual por lo menos lo que te comente 
declaracion de variables ,strings,bytes etc,
operaciones aritmeticas con numeros 
condiciones if,else,elseif,do, while
no es que sea complicado lo que quieres hacer pero para un principiante si y encima si no entiendes nada ,pues aun peor .haz como todos lee un manual de visual y empieza con lo basico y veras como en breve entenderas mas cosas ,es una opinion y ahora ten en cuenta la tabla binaria y conviertela a decimal  y tui mismo veras lo que haces mal te pongo un ejemplo simple si mandas 1 enciendes el 1
si mandas  101 enciendes el 5 , si quieres apagar todo manadas un 0 si quieres encender 1 y 5 mandas 17
si quieres apagar el 5 y que se quede el 1 manda 1 si quieres apagar el 1 y que se quede el 5 manda 16
como veras si cojes la calculadora cientifica del pc y conviertes de binario a decimal podras observar que te hace falta sumar y restar eso  se hace con operaciones aritmeticas 
un saludo


----------



## Meta (Ago 8, 2011)

Si, mejor leer.

if

else

elseif

do

while

etc lo puedes ver aquí.

http://msdn.microsoft.com/es-es/library/ksh7h19t(v=VS.80).aspx

Saludo.


----------



## rc_77_2000 (Ago 8, 2011)

miren amigos, perdon primero gracias por su ayuda con distintas alternativas, despues de tanto buscar y preguntar lo que hice es modificar un programa que esta en la pagina de pablin.com que se llama panel32 es para manejar una controladora que multiplica lo 8 bit a 32.
Bueno creo que la conocen, lo que hice es eliminar en el modulo1 este codigo 
	
	



```
'Si esta la llave encendida la apaga.
If Bit1(Index) = True Then
    Bit1(Index) = False
    Mod1(Index).Picture = LoadPicture(App.Path + "\llave0.bmp")
    Call Envia(1)
    Exit Sub
    End If

End Sub
```
y en el modulo 2 eliminar este codigo 
	
	



```
'Si esta la llave apagada la enciende.
If Bit1(Index) = False Then
    Bit1(Index) = True
    Mod1(Index).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Call Envia(1)
    Exit Sub
    End If

End Sub
```
y que esto sea bit1, call envia(1)  en los dos modulos 

 If Bit2(Index) = False Then     
    Bit2(Index) = True
    Mod2(Index).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Call Envia(2)
    Exit Sub
    End If
y funciono de 10 las 8 teclas de arriba solo prende y las 8 de abajo solo apagan.

hola de nuevo, primero quiero mostrar como que el codigo completo y de ahí que me digan si a estos botones se le puede poner un comando para que tambiem funcione con el teclado y no solo con el mouse, no se ya que son 16  utilizar alt+ las letras del adcdario.
desde ya muchisimas gracias.


```
Dim Bit1(0 To 7) As Integer
Dim Bit2(0 To 7) As Integer
Dim Bit3(0 To 7) As Integer
Dim Bit4(0 To 7) As Integer
Dim Titulo1(0 To 7) As String
Dim Titulo2(0 To 7) As String
Dim Titulo3(0 To 7) As String
Dim Titulo4(0 To 7) As String
Dim Puerto As Integer
Dim Delay As Long

Private Sub ARCSAL_Click()
'Finaliza el programa
End

End Sub

Private Sub BOR1_Click()
'Borra la memoria.
Open App.Path + "\MEMORIA1.INI" For Output As #1
Print #1, Chr$(27)
Close

'Cambia los títulos de la memoria.
CAR1.Caption = "Memoria &1 - Vacía"
SAV1.Caption = "Memoria &1 - Vacía"
BOR1.Caption = "Memoria &1 - Vacía"

'Desactiva las opciones de Menú.
BOR1.Enabled = False
CAR1.Enabled = False

End Sub

Private Sub BOR2_Click()
'Borra la memoria.
Open App.Path + "\MEMORIA2.INI" For Output As #1
Print #1, Chr$(27)
Close

'Cambia los títulos de la memoria.
CAR2.Caption = "Memoria &2 - Vacía"
SAV2.Caption = "Memoria &2 - Vacía"
BOR2.Caption = "Memoria &2 - Vacía"

'Desactiva las opciones de Menú.
BOR2.Enabled = False
CAR2.Enabled = False

End Sub

Private Sub BOR3_Click()
'Borra la memoria.
Open App.Path + "\MEMORIA3.INI" For Output As #1
Print #1, Chr$(27)
Close

'Cambia los títulos de la memoria.
CAR3.Caption = "Memoria &3 - Vacía"
SAV3.Caption = "Memoria &3 - Vacía"
BOR3.Caption = "Memoria &3 - Vacía"

'Desactiva las opciones de Menú.
BOR3.Enabled = False
CAR3.Enabled = False

End Sub

Private Sub BOR4_Click()
'Borra la memoria.
Open App.Path + "\MEMORIA4.INI" For Output As #1
Print #1, Chr$(27)
Close

'Cambia los títulos de la memoria.
CAR4.Caption = "Memoria &4 - Vacía"
SAV4.Caption = "Memoria &4 - Vacía"
BOR4.Caption = "Memoria &4 - Vacía"

'Desactiva las opciones de Menú.
BOR4.Enabled = False
CAR4.Enabled = False

End Sub

Private Sub BOR5_Click()
'Borra la memoria.
Open App.Path + "\MEMORIA5.INI" For Output As #1
Print #1, Chr$(27)
Close

'Cambia los títulos de la memoria.
CAR5.Caption = "Memoria &5 - Vacía"
SAV5.Caption = "Memoria &5 - Vacía"
BOR5.Caption = "Memoria &5 - Vacía"

'Desactiva las opciones de Menú.
BOR5.Enabled = False
CAR5.Enabled = False

End Sub

Private Sub CAR1_Click()
Dim Ciclo As Integer

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA1.INI" For Input As #1
Input #1, Temp
For Ciclo = 0 To 7
    Input #1, X
    Bit1(Ciclo) = X
    If X = False Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit2(Ciclo) = X
    If X = False Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit3(Ciclo) = X
    If X = False Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit4(Ciclo) = X
    If X = False Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Next Ciclo
Close

'Envia los nuevos parametros a la plaqueta.
For Ciclo = 1 To 4
    Envia (Ciclo)
    Next Ciclo

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub CAR2_Click()
Dim Ciclo As Integer

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA2.INI" For Input As #1
Input #1, Temp
For Ciclo = 0 To 7
    Input #1, X
    Bit1(Ciclo) = X
    If X = False Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit2(Ciclo) = X
    If X = False Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit3(Ciclo) = X
    If X = False Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit4(Ciclo) = X
    If X = False Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Next Ciclo
Close

'Envia los nuevos parametros a la plaqueta.
For Ciclo = 1 To 4
    Envia (Ciclo)
    Next Ciclo

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub CAR3_Click()
Dim Ciclo As Integer

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA3.INI" For Input As #1
Input #1, Temp
For Ciclo = 0 To 7
    Input #1, X
    Bit1(Ciclo) = X
    If X = False Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit2(Ciclo) = X
    If X = False Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit3(Ciclo) = X
    If X = False Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit4(Ciclo) = X
    If X = False Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Next Ciclo
Close

'Envia los nuevos parametros a la plaqueta.
For Ciclo = 1 To 4
    Envia (Ciclo)
    Next Ciclo

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub CAR4_Click()
Dim Ciclo As Integer

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA4.INI" For Input As #1
Input #1, Temp
For Ciclo = 0 To 7
    Input #1, X
    Bit1(Ciclo) = X
    If X = False Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit2(Ciclo) = X
    If X = False Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit3(Ciclo) = X
    If X = False Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit4(Ciclo) = X
    If X = False Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Next Ciclo
Close

'Envia los nuevos parametros a la plaqueta.
For Ciclo = 1 To 4
    Envia (Ciclo)
    Next Ciclo

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub CAR5_Click()
Dim Ciclo As Integer

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA5.INI" For Input As #1
Input #1, Temp
For Ciclo = 0 To 7
    Input #1, X
    Bit1(Ciclo) = X
    If X = False Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit2(Ciclo) = X
    If X = False Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit3(Ciclo) = X
    If X = False Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit4(Ciclo) = X
    If X = False Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave0.bmp")
    If X = True Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Next Ciclo
Close

'Envia los nuevos parametros a la plaqueta.
For Ciclo = 1 To 4
    Envia (Ciclo)
    Next Ciclo

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub CFGDLY_Click()
X = Val(InputBox("Iteraciones del ciclo For/Next ?", "Delay...", Trim(Str(Delay))))
If X = 0 Then Exit Sub
Delay = X
Open App.Path + "\DELAY.INI" For Output As #1
Print #1, Delay
Close

End Sub

Private Sub Envia(Modulo As Integer)
'Calcula el valor a enviar.
Dato = 0
If Modulo = 1 Then
    If Bit1(0) = True Then Dato = Dato + 128
    If Bit1(1) = True Then Dato = Dato + 64
    If Bit1(2) = True Then Dato = Dato + 32
    If Bit1(3) = True Then Dato = Dato + 16
    If Bit1(4) = True Then Dato = Dato + 8
    If Bit1(5) = True Then Dato = Dato + 4
    If Bit1(6) = True Then Dato = Dato + 2
    If Bit1(7) = True Then Dato = Dato + 1
    Latch = 10          'Establece el dato para latch.
    End If
If Modulo = 2 Then
    If Bit2(0) = True Then Dato = Dato + 128
    If Bit2(1) = True Then Dato = Dato + 64
    If Bit2(2) = True Then Dato = Dato + 32
    If Bit2(3) = True Then Dato = Dato + 16
    If Bit2(4) = True Then Dato = Dato + 8
    If Bit2(5) = True Then Dato = Dato + 4
    If Bit2(6) = True Then Dato = Dato + 2
    If Bit2(7) = True Then Dato = Dato + 1
    Latch = 9           'Establece el dato para latch.
    End If
If Modulo = 3 Then
    If Bit3(0) = True Then Dato = Dato + 128
    If Bit3(1) = True Then Dato = Dato + 64
    If Bit3(2) = True Then Dato = Dato + 32
    If Bit3(3) = True Then Dato = Dato + 16
    If Bit3(4) = True Then Dato = Dato + 8
    If Bit3(5) = True Then Dato = Dato + 4
    If Bit3(6) = True Then Dato = Dato + 2
    If Bit3(7) = True Then Dato = Dato + 1
    Latch = 15          'Establece el dato para latch.
    End If
If Modulo = 4 Then
    If Bit4(0) = True Then Dato = Dato + 128
    If Bit4(1) = True Then Dato = Dato + 64
    If Bit4(2) = True Then Dato = Dato + 32
    If Bit4(3) = True Then Dato = Dato + 16
    If Bit4(4) = True Then Dato = Dato + 8
    If Bit4(5) = True Then Dato = Dato + 4
    If Bit4(6) = True Then Dato = Dato + 2
    If Bit4(7) = True Then Dato = Dato + 1
    Latch = 3           'Establece el dato para latch.
    End If

'Coloca el dato en el puerto.
Out Puerto, Dato

'Espera que los datos se establezcan.
For Ciclo = 1 To Delay
Next Ciclo

'Activa el latch correspondiente.
Out Puerto + 2, Latch

'Espera que los datos se establezcan.
For Ciclo = 1 To Delay
Next Ciclo

'Desactiva el latch.
Out Puerto + 2, 11

End Sub

Private Sub Form_Load()
'Coloca el reloj en el puntero.
Screen.MousePointer = 11

Dim Ciclo As Integer

'Lee el puerto paralelo a usar.
Open App.Path + "\PUERTO.INI" For Input As #1
Input #1, X
Close
If X = 1 Then Puerto = &H378: LPT1.Checked = True
If X = 2 Then Puerto = &H278: LPT2.Checked = True
If X = 3 Then Puerto = &H3BC: LPT3.Checked = True

'Lee el delay para los latch's.
Open App.Path + "\DELAY.INI" For Input As #1
Input #1, Delay
Close

'Carga los títulos de las teclas.
Open App.Path + "\TITULOS.INI" For Input As #1
Line Input #1, Temp 'Saltea las líneas de encabezado.
Line Input #1, Temp
For Ciclo = 0 To 7
Line Input #1, Temp: Titulo1(Ciclo) = Temp
Line Input #1, Temp: Titulo2(Ciclo) = Temp
Line Input #1, Temp: Titulo3(Ciclo) = Temp
Line Input #1, Temp: Titulo4(Ciclo) = Temp
Next Ciclo
Close

'Activa las memorias disponibles.
Open App.Path + "\MEMORIA1.INI" For Input As #1
Line Input #1, Titulo
Close
If Titulo = Chr(27) Then
    CAR1.Enabled = False
    BOR1.Enabled = False
Else
    CAR1.Caption = Titulo
    SAV1.Caption = Titulo
    BOR1.Caption = Titulo
    End If
Open App.Path + "\MEMORIA2.INI" For Input As #1
Line Input #1, Titulo
Close
If Titulo = Chr(27) Then
    CAR2.Enabled = False
    BOR2.Enabled = False
Else
    CAR2.Caption = Titulo
    SAV2.Caption = Titulo
    BOR2.Caption = Titulo
    End If

Open App.Path + "\MEMORIA3.INI" For Input As #1
Line Input #1, Titulo
Close
If Titulo = Chr(27) Then
    CAR3.Enabled = False
    BOR3.Enabled = False
Else
    CAR3.Caption = Titulo
    SAV3.Caption = Titulo
    BOR3.Caption = Titulo
    End If

Open App.Path + "\MEMORIA4.INI" For Input As #1
Line Input #1, Titulo
Close
If Titulo = Chr(27) Then
    CAR4.Enabled = False
    BOR4.Enabled = False
Else
    CAR4.Caption = Titulo
    SAV4.Caption = Titulo
    BOR4.Caption = Titulo
    End If

Open App.Path + "\MEMORIA5.INI" For Input As #1
Line Input #1, Titulo
Close
If Titulo = Chr(27) Then
    CAR5.Enabled = False
    BOR5.Enabled = False
Else
    CAR5.Caption = Titulo
    SAV5.Caption = Titulo
    BOR5.Caption = Titulo
    End If

    'Carga la memoria de arranque.
Open App.Path + "\ARRANQUE.INI" For Input As #1
For Ciclo = 0 To 7
    Input #1, X
    Bit1(Ciclo) = X
    If X = True Then Mod1(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit2(Ciclo) = X
    If X = True Then Mod2(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit3(Ciclo) = X
    If X = True Then Mod3(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Input #1, X
    Bit4(Ciclo) = X
    If X = True Then Mod4(Ciclo).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Next Ciclo
Close
For Ciclo = 1 To 4
    Call Envia(Ciclo)
    Next Ciclo


'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Limpia el display.
Display = ""

End Sub

Private Sub LPT1_Click()
'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Tilda el item.
LPT1.Checked = True
LPT2.Checked = False
LPT3.Checked = False

'Guarda la configuración.
Open App.Path + "\PUERTO.INI" For Output As #1
Print #1, 1
Close

'Establece el puerto a utilizar.
Puerto = &H378

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub LPT2_Click()
'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Tilda el item.
LPT1.Checked = False
LPT2.Checked = True
LPT3.Checked = False

'Guarda la configuración.
Open App.Path + "\PUERTO.INI" For Output As #1
Print #1, 2
Close

'Establece el puerto a utilizar.
Puerto = &H278

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub LPT3_Click()
'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Tilda el item.
LPT1.Checked = False
LPT2.Checked = False
LPT3.Checked = True

'Guarda la configuración.
Open App.Path + "\PUERTO.INI" For Output As #1
Print #1, 3
Close

'Establece el puerto a utilizar.
Puerto = &H3BC

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub MEMARR_Click()
'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Guarda la conf. de arranque.
Open App.Path + "\ARRANQUE.INI" For Output As #1
For Ciclo = 0 To 7
Print #1, Bit1(Ciclo)
Print #1, Bit2(Ciclo)
Print #1, Bit3(Ciclo)
Print #1, Bit4(Ciclo)
Next Ciclo
Close

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub Mod1_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Si pulsa el 2do. botón permite definir el título de la tecla.
If Button = 2 Then
    Temp = Trim(InputBox("Título de la tecla " + Trim(Str(Index + 1)), "Módulo 1", Titulo1(Index)))
    If Temp = "" Then Exit Sub
    Titulo1(Index) = Temp
    Display = Temp
    Exit Sub
    End If

'Si esta la llave apagada la enciende.
If Bit1(Index) = False Then
    Bit1(Index) = True
    Mod1(Index).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Call Envia(1)
    Exit Sub
    End If



End Sub

Private Sub Mod1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Coloca el título de la tecla en el display.
Display = Titulo1(Index)

End Sub

Private Sub Mod2_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Si pulsa el 2do. botón permite definir el título de la tecla.
If Button = 2 Then
    Temp = Trim(InputBox("Título de la tecla " + Trim(Str(Index + 1)), "Módulo 2", Titulo2(Index)))
    If Temp = "" Then Exit Sub
    Titulo2(Index) = Temp
    Display = Temp
    Exit Sub
    End If



'Si esta la llave encendida la apaga.
If Bit1(Index) = True Then
    Bit1(Index) = False
    Mod1(Index).Picture = LoadPicture(App.Path + "\llave0.bmp")
    Call Envia(1)
    Exit Sub
    End If

End Sub

Private Sub Mod2_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Coloca el título de la tecla en el display.
Display = Titulo2(Index)

End Sub

Private Sub Mod3_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Si pulsa el 2do. botón permite definir el título de la tecla.
If Button = 2 Then
    Temp = Trim(InputBox("Título de la tecla " + Trim(Str(Index + 1)), "Módulo 3", Titulo3(Index)))
    If Temp = "" Then Exit Sub
    Titulo3(Index) = Temp
    Display = Temp
    Exit Sub
    End If

'Si esta la llave apagada la enciende.
If Bit2(Index) = False Then
    Bit2(Index) = True
    Mod2(Index).Picture = LoadPicture(App.Path + "\llave1.bmp")
    Call Envia(2)
    Exit Sub
    End If



End Sub

Private Sub Mod3_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Coloca el título de la tecla en el display.
Display = Titulo3(Index)

End Sub

Private Sub Mod4_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Si pulsa el 2do. botón permite definir el título de la tecla.
If Button = 2 Then
    Temp = Trim(InputBox("Título de la tecla " + Trim(Str(Index + 1)), "Módulo 4", Titulo4(Index)))
    If Temp = "" Then Exit Sub
    Titulo4(Index) = Temp
    Display = Temp
    Exit Sub
    End If


'Si esta la llave encendida la apaga.
If Bit2(Index) = True Then
    Bit2(Index) = False
    Mod2(Index).Picture = LoadPicture(App.Path + "\llave0.bmp")
    Call Envia(2)
    Exit Sub
    End If


End Sub

Private Sub Mod4_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
'Coloca el título de la tecla en el display.
Display = Titulo4(Index)

End Sub

Private Sub SAV1_Click()
'Obtiene el título de la memoria.
If CAR1.Enabled = False Then Titulo = "" Else Titulo = SAV1.Caption
Temp = Trim(InputBox("Título de la memoria 1", "Guardar memoria...", Titulo))

'Cancela si no le pone título.
If Temp = "" Then
    MsgBox "Para almacenar una memoria es necesario definirle un título...", 16, "MEMORIA NO GUARDADA"
    Exit Sub
    End If

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA1.INI" For Output As #1
Print #1, Temp
For Ciclo = 0 To 7
    Print #1, Bit1(Ciclo)
    Print #1, Bit2(Ciclo)
    Print #1, Bit3(Ciclo)
    Print #1, Bit4(Ciclo)
    Next Ciclo
Close

'Activa las opciones del menú.
BOR1.Enabled = True
CAR1.Enabled = True

'Cambia los títulos de las opciones.
CAR1.Caption = Temp
SAV1.Caption = Temp
BOR1.Caption = Temp

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub SAV2_Click()
'Obtiene el título de la memoria.
If CAR2.Enabled = False Then Titulo = "" Else Titulo = SAV2.Caption
Temp = Trim(InputBox("Título de la memoria 2", "Guardar memoria...", Titulo))

'Cancela si no le pone título.
If Temp = "" Then
    MsgBox "Para almacenar una memoria es necesario definirle un título...", 16, "MEMORIA NO GUARDADA"
    Exit Sub
    End If

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA2.INI" For Output As #1
Print #1, Temp
For Ciclo = 0 To 7
    Print #1, Bit1(Ciclo)
    Print #1, Bit2(Ciclo)
    Print #1, Bit3(Ciclo)
    Print #1, Bit4(Ciclo)
    Next Ciclo
Close

'Activa las opciones del menú.
BOR2.Enabled = True
CAR2.Enabled = True

'Cambia los títulos de las opciones.
CAR2.Caption = Temp
SAV2.Caption = Temp
BOR2.Caption = Temp

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub SAV3_Click()
'Obtiene el título de la memoria.
If CAR3.Enabled = False Then Titulo = "" Else Titulo = SAV3.Caption
Temp = Trim(InputBox("Título de la memoria 3", "Guardar memoria...", Titulo))

'Cancela si no le pone título.
If Temp = "" Then
    MsgBox "Para almacenar una memoria es necesario definirle un título...", 16, "MEMORIA NO GUARDADA"
    Exit Sub
    End If

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA3.INI" For Output As #1
Print #1, Temp
For Ciclo = 0 To 7
    Print #1, Bit1(Ciclo)
    Print #1, Bit2(Ciclo)
    Print #1, Bit3(Ciclo)
    Print #1, Bit4(Ciclo)
    Next Ciclo
Close

'Activa las opciones del menú.
BOR3.Enabled = True
CAR3.Enabled = True

'Cambia los títulos de las opciones.
CAR3.Caption = Temp
SAV3.Caption = Temp
BOR3.Caption = Temp

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub SAV4_Click()
'Obtiene el título de la memoria.
If CAR4.Enabled = False Then Titulo = "" Else Titulo = SAV4.Caption
Temp = Trim(InputBox("Título de la memoria 4", "Guardar memoria...", Titulo))

'Cancela si no le pone título.
If Temp = "" Then
    MsgBox "Para almacenar una memoria es necesario definirle un título...", 16, "MEMORIA NO GUARDADA"
    Exit Sub
    End If

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA4.INI" For Output As #1
Print #1, Temp
For Ciclo = 0 To 7
    Print #1, Bit1(Ciclo)
    Print #1, Bit2(Ciclo)
    Print #1, Bit3(Ciclo)
    Print #1, Bit4(Ciclo)
    Next Ciclo
Close

'Activa las opciones del menú.
BOR4.Enabled = True
CAR4.Enabled = True

'Cambia los títulos de las opciones.
CAR4.Caption = Temp
SAV4.Caption = Temp
BOR4.Caption = Temp

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub SAV5_Click()
'Obtiene el título de la memoria.
If CAR5.Enabled = False Then Titulo = "" Else Titulo = SAV5.Caption
Temp = Trim(InputBox("Título de la memoria 5", "Guardar memoria...", Titulo))

'Cancela si no le pone título.
If Temp = "" Then
    MsgBox "Para almacenar una memoria es necesario definirle un título...", 16, "MEMORIA NO GUARDADA"
    Exit Sub
    End If

'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Graba la memoria.
Open App.Path + "\MEMORIA5.INI" For Output As #1
Print #1, Temp
For Ciclo = 0 To 7
    Print #1, Bit1(Ciclo)
    Print #1, Bit2(Ciclo)
    Print #1, Bit3(Ciclo)
    Print #1, Bit4(Ciclo)
    Next Ciclo
Close

'Activa las opciones del menú.
BOR5.Enabled = True
CAR5.Enabled = True

'Cambia los títulos de las opciones.
CAR5.Caption = Temp
SAV5.Caption = Temp
BOR5.Caption = Temp

'Restaura el puntero.
Screen.MousePointer = 0

End Sub

Private Sub SAVTIT_Click()
'Coloca el reloj en el puntero.
Screen.MousePointer = 11

'Genera el archivo de títulos.
Open App.Path + "\TITULOS.INI" For Output As #1
Print #1, "Este archivo contiene los títulos de las llaves."
Print #1, "Debe medir si o si 34 líneas incluyendo estas dos."
For Ciclo = 0 To 7
Print #1, Titulo1(Ciclo)
Print #1, Titulo2(Ciclo)
Print #1, Titulo3(Ciclo)
Print #1, Titulo4(Ciclo)
Next Ciclo
Close

'Restaura el puntero.
Screen.MousePointer = 0

End Sub
```


----------



## rc_77_2000 (Ago 11, 2011)

Hola amigos despues de aver modificado un poco el programa, me encuentro con que apasar de tener lo que buscaba no me sirve. por que mi objeivo era pa utilizaro con comando de voz.
voy a poner algo que abia puesto en otro foro para que entiendan para que quiero esto.
*Muchas gracias por tu explicacion xxxxx, te explico por que  quiero 2 botones para cada led. el proyecto es comandar por comando de  voz, lo e logrado con un programa gratis de 8 botones y cuando digo  encender led uno el soft por medio de voces loquendo me responde,  encendiendo led uno.
Pero como es un solo boton para apagarlo tengo que volver a decir  encender led uno y el soft vuelve a decir encendiendo led uno, apesar  que lo esta apagando. entonces lo que busco son dos botones para el  comando de voz, encener led1, apagar led1 con la voz loquendo apagando  led1 encendiendo led1.
se entiende mi explicacion? digo esto por que e an dicho que no me se  expresar ben jajaja y aveces no entienden lo qe quiero decir.
desde ya muchas gracias.*El caso es que si el programa no puede tambien funcionar con algunas teclas de teclado, el soft de reconocimiento de voz no lo maneja.
A ese codigo que puse anterior se le puede agregar funciones de teclado. les voy a poner una imagen de como me quedo, esteticamente no es una maravilla pero bueno que va hacer jajajja.


----------

