Ante todo un gran saludo a todos los que hacen parte de este foro. Felicitar
a BigLuis por sus aportes me han servido mucho.
Bueno mi consulta es la siguiente:
Estoy utilizando un pic 16f877 , tengo tres pulsadores(puertos A) y tres leds(puertos B). Cada pulsador debe pagar y encender un led respectivamente, a su vez cuando encieda un led debe aparecer el mensaje en un lcd de 16x4 de "led1 on", y cuando lo apague "led1 off"; y asi sucesivamente con los demás leds. Tomando parte del codigo de BigLuis, logré aplicar el problema de rebote....creo.
Sin embargo me encuentro con las siguientes dificultades:
1. Cuando me ubico al final del tercer if, escribo "goto conteo", solo puedo encender y apagar los leds...solo funciona apagar y encender sin mostrar ningun mensaje en el lcd, a pesar que estan declarados como funciones en el programa.
2. Cuando voy al final del tercer if, escribo "goto inicio", me muestra el mensaje de las tres opciones, pero cuando le doy click en un pulsador toma la condicion de la primera condicional, y se queda alli, no evalua las demás condicionales....he querido anidar las tres if, con ifelse, pero me genera error(es probable que sea algun detalle, pero me tiene atascado).
3. No he podido resolver lo siguiente: cuando le dé click en el pulsaodr led0 se enciende , me salga su estado de on en el lcd. Si le doy nuevamente click en el mismo pulsador debe se apagarse el led0 y imprima su estado en el lcd de su estado en off y se mantenga el mensaje de led0 on u off, led1 on u offí.
Si por ejemplo, le doy click en otro led2, y cambie su estado a on, debe mantener en pantalla si el led0 esta en on u off, o el led1 está en off u on, y asi sucesivamente.
gracias.
anexo codigo e imagen.
Device =16F877
Xtal = 4
Dim secuencia As Byte
Dim aux As Byte
TRISA=1
TRISB=0
Symbol uno=PORTA.0
Symbol dos=PORTA.1
Symbol tres=PORTA.2
Symbol led0=PORTB.0
Symbol led1=PORTB.1
Symbol led2=PORTB.2
Input PORTA
Output PORTB
LCD_DTPin = PORTD.4
LCD_RSPin = PORTD.2
LCD_ENPin = PORTD.3
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0
All_Digital = On
TRISB=0
conteo:
'While PORTA= 1
Print At 2,1, "led0 : ON OFF "
Print At 3,-3, "led1 : ON OFF "
Print At 4,-3, "led2 : ON OFF "
While PORTA=0 'mientras no presionen ningun pulsador el PIC se mantendra en este bucle, hasta que se presionen alguno de ellos
Wend
DelayMS 40 'Tiempo necesario para evitar rebotes
aux = PORTA ^ aux 'recordemos que 1 xor 1=0, 0 xor 1 = 1 y 0 xor 0 = 0, se encenderian los pines que estan apagados y apagaria los encendidos.
'es decir al presionar un pulsador se produce un cambio de estado en las salidas
If (aux.0+aux.1+aux.2)<=3 Then
'Contamos cuantas salidas deberian estar activas, si son menos de 2.
PORTB=aux 'En el puerto B se encenderan los pines necesarios
Else 'de lo contrario
aux=PORTB 'se guradara el estado anterior de PORTB en aux
End If
While PORTA<>0 'El PIC se mantendra en este bucle hasta que se suelten todos los pulsadores.
Wend
'Wend
'End
inicio:
If uno=0 And dos=1 And tres=0 Then op2
'goto inicio
If uno=1 And dos=0 And tres=0 Then op1
'goto inicio
If uno=0 And dos=0 And tres=1 Then op3
Print At 2,1, "led0 : ON -OFF- "
Print At 3,-3, "led1 : ON -OFF- "
Print At 4,-3, "led2 : -ON- OFF "
DelayMS 300
'goto conteo
GoTo inicio
op1:
PORTB.0=1
PORTB.1=0
PORTB.2=0
Print At 2,1, "led0 : -ON- OFF "
Print At 3,-3, "led1 : ON -OFF-"
Print At 4,-3, "led2 : ON -OFF-"
DelayMS 300
Stop
DelayMS 300
Cls
GoTo inicio
op2:
PORTB.0=0
PORTB.1=1
PORTB.2=0
Cls
Print At 2,1, "led0: ON OFF "
Print At 3,-3, "led1: -ON- OFF "
Print At 4,-3, "led2 : ON -OFF-"
Stop
DelayMS 300
GoTo inicio
op3:
PORTB.0=0
PORTB.1=0
PORTB.2=1
Cls
Print At 2,1, "led0 : ON -OFF- "
Print At 3,-3, "led1 : ON -OFF- "
Print At 4,-3, "led2 : -ON- OFF "
Stop
DelayMS 300
Cls
GoTo inicio
End