Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
if boton0 = 1 then
pause 10
if boton0 = 1 then
while boton0 = 1
I = I + 1
como podria hacer si le quisiera agregar 1 o 2 pulsadores mas cada uno con su respectivo led y que funcione de la misma manera que el primer pulsador con el primer led. tendria que agregarle 2 variables mas o podria trabajar con la misma en este caso la I.if boton0 = 1 then ;activo boton
WHILE boton0 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica
endif
FLAG0 = 120 'PARA UN TIEMPO DE 2min
toggle led_0
I = 0
ENDIF
FLAG0 = 60 'PARA UN TIEMPO DE 1min
toggle led_0
I = 0
ENDIF
MAIN:
IF BOTON0 = 1 THEN GOTO UNO
IF BOTON1 = 1 THEN GOTO DOS
GOTO MAIN
UNO:
if boton0 = 1 then
WHILE boton0 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica
endif
if led_0 = 0 and led_1 = 0 and led_2 = 0 then
goto UNO
else
goto temporiza
endif
verifica:
if i => 256 then
i = 0
goto UNO
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG0 = 5 'PARA UN TIEMPO DE 10 SEG
toggle led_0
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for aux = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 10 'PARA UN TIEMPO DE 1min
toggle led_0
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for aux = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 15 'PARA UN TIEMPO DE 2min
toggle led_0
I = 0
ENDIF
DOS:
if boton1 = 1 then
WHILE boton1 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica1
endif
if led_1 = 0 and led_0 = 0 and led_2 = 0 then
goto DOS
else
goto temporiza
endif
verifica1:
if i => 256 then
i = 0
goto DOS
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG1 = 5 'PARA UN TIEMPO DE 10 SEG
toggle led_1
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for aux = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG1 = 10 'PARA PRUEBA 10 SEG
toggle led_1
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for aux = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG1 = 15 'PARA UN TIEMPO DE 15 SEG PRUEBA
toggle led_1
I = 0
ENDIF
temporiza:
IF MILISEGUNDO => 78 THEN '998.4 MILISEGUNDOS + 1.14 = 999.54 ML = 1 SEG APORX.
MILISEGUNDO = 0
IF led_0 = 1 AND TLed1 < FLAG0 THEN
TLed1 = TLed1 + 1
ELSE
TLed1 = 0
FLAG0 = 0
Led_0 = 0
endif
GOTO UNO
IF led_1 = 1 AND TLed2 < FLAG1 THEN
TLed2 = TLed2 + 1
ELSE
TLed2 = 0
FLAG1 = 0
Led_1 = 0
ENDIF
endif
GOTO DOS
Disable
MI_INTERRUPCION:
PAUSEUS 13 'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS
'EL VALOR DEL TMR0 ES DE 206 Y EL DEL PREESCALER DE 256
'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
MILISEGUNDO = MILISEGUNDO + 1
TMR0 = 206
INTCON = %10100000
Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP
END
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
Esto no responde la pregunta de cesarim, es una aclaración sobre el uso del bucle For... Nextsaludos amigo cesarim, viendo tu código puedo notar un error al momento en el que usas la instrucción for- next, y además lo usas varias veces en tu código; para explicarte mejor, tú lo usas así :
El error tuyo está en que, en la parte de "next" la forma correcta sería "next aux", y así sucesivamente a lo largo del código. Espero haberme hecho entender, saludos!Código:FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS PAUSEUS 10 NEXT
MAIN:
IF BOTON0 = 1 THEN GOTO UNO ;aca le indico que lea boton0 si no esta presionado
IF BOTON1 = 1 THEN GOTO DOS ;entonces pase a leer boton1 y si detecta que se
GOTO MAIN ;presiono cualquiera de estos dos entonces salta a su rutina adecuada
;o si no sigue leyendo hasta que detecte el boton activado
UNO:
if boton0 = 1 then
WHILE boton0 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica
endif
if led_0 = 0 and led_1 = 0 and led_2 = 0 then
goto UNO
else
goto temporiza
endif
verifica:
if i => 256 then
i = 0
goto UNO
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG0 = 5 'PARA UN TIEMPO DE 10 SEG
toggle led_0
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for aux = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 10 'PARA UN TIEMPO DE 1min
toggle led_0
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for aux = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 15 'PARA UN TIEMPO DE 2min
toggle led_0
I = 0
ENDIF
;el punto es que al pulsar un boton cualquiera de los dos se encienden los dos leds y no
;deveria hacer eso deveria solamente prender un led y al activar el otro boton encender
;el otro led es lo que me marea que manera adecuada podria hacerlo con dos o tres o hasta
; cuatro pulsadores mas
DOS:
if boton1 = 1 then
WHILE boton1 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica1
endif
if led_1 = 0 and led_0 = 0 and led_2 = 0 then
goto DOS
else
goto temporiza
endif
verifica1:
if i => 256 then
i = 0
goto DOS
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG1 = 5 'PARA UN TIEMPO DE 10 SEG
toggle led_1
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for aux = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG1 = 10 'PARA PRUEBA 10 SEG
toggle led_1
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for aux = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG1 = 15 'PARA UN TIEMPO DE 15 SEG PRUEBA
toggle led_1
I = 0
ENDIF
temporiza:
IF MILISEGUNDO => 78 THEN '998.4 MILISEGUNDOS + 1.14 = 999.54 ML = 1 SEG APORX.
MILISEGUNDO = 0
IF led_0 = 1 AND TLed1 < FLAG0 THEN
TLed1 = TLed1 + 1
ELSE
TLed1 = 0
FLAG0 = 0
Led_0 = 0
endif
GOTO UNO
IF led_1 = 1 AND TLed2 < FLAG1 THEN
TLed2 = TLed2 + 1
ELSE
TLed2 = 0
FLAG1 = 0
Led_1 = 0
ENDIF
endif
GOTO DOS
Disable
MI_INTERRUPCION:
PAUSEUS 13 'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS
'EL VALOR DEL TMR0 ES DE 206 Y EL DEL PREESCALER DE 256
'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
MILISEGUNDO = MILISEGUNDO + 1
TMR0 = 206
INTCON = %10100000
Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP
END
ADCON1 = %10000010
TrisB = %00000001
TrisC = %00000000
TrisD = %00000001
PortB = %00000000
PortC = %00000000
LPV con 70 'Porcentaje minimo de bateria
LB var word
adVal var word
aVal var word
aACC var byte
L var byte
Lcdout $fe, 1
Lcdout "Lubeck "
Pause 50
aval=0
Inicio:
'Inserta tu codigo Aqui...
gosub ACC
gosub adc
Goto inicio
End
ACC:
if aacc<>portb.0 then ; en esta parte dicen que aacc no es igual a portb.0
LCDOUT $FE,64 ; cargan en en la memoria CG RAM
LCDOUT $1F,$11,$1B,$E,$4,$4,$4,$4 ; mostrar el carácter personalizado de un enchufe
LCDOUT $A,$1F,$11,$1B,$E,$4,$4,$4
LCDOUT $0,$A,$1F,$11,$1B,$E,$4,$4
LCDOUT $0,$0,$A,$1F,$11,$1B,$E,$4
LCDOUT $0,$0,$0,$A,$1F,$11,$1B,$E
LCDOUT $0,$0,$0,$0,$A,$1F,$11,$1B
LCDOUT $0,$0,$0,$0,$0,$A,$1F,$11
LCDOUT $0,$0,$0,$0,$0,$0,$A,$1F
if not PortB.0 then ; esta parte no la se expresar bien y no se lo que hace
for L=7 to 0 step-1 ; hace que se muestre el carácter como si estuviera
lcdout $FE,$8F,l ; desconectando de la luz.
pause 50
next L
else ;
for L=0 to 7
lcdout $FE,$8F,l
pause 50
next L
endif
LCDOUT $FE,$8F,"E"
pause 2000
aacc= portb.0
endif
return
ADC:
ADCIN 0, adval
lb=(1024/100)*LPV;LB = 717
L=(adval-lb)/((1024-lb)/7)
if aacc=0 or l+1<7 then
if aval<>adval then
LCDOUT $FE,64
lcdout $0E,$11,$1B,$15,$1B,$11,$1F,$1F
lcdout $0E,$11,$11,$11,$11,$11,$11,$1F
lcdout $0E,$11,$11,$11,$11,$11,$1F,$1F
lcdout $0E,$11,$11,$11,$11,$1F,$1F,$1F
lcdout $0E,$11,$11,$11,$1F,$1F,$1F,$1F
lcdout $0E,$11,$11,$1F,$1F,$1F,$1F,$1F
lcdout $0E,$11,$1F,$1F,$1F,$1F,$1F,$1F
lcdout $0E,$1F,$1F,$1F,$1F,$1F,$1F,$1F
LCDOUT $FE,$8F,l+1
pause 2000
endif
else
LCDOUT $FE,$8F,"C"
endif
aval=adval
Return
end
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0 'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4 'EN EL BIT A.4
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3 'EN EL BIT B.3
TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500 ' PAUSE DE MEDIO SEGUNDO
;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0 ; BOTON DE AJUSTE PARA HORA
IF PULSADOR = 1 THEN
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
LCDOUT $FE, $0C 'APAGAR EL CURSOR
ENDIF
IF PULSADOR = 0 THEN
LCDOUT $FE, 1 ' LIMPIAR VISOR
ENDIF
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0 'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4 'EN EL BIT A.4
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3 'EN EL BIT B.3
TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500 ' PAUSE DE MEDIO SEGUNDO
;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0 ; BOTON DE AJUSTE PARA HORA
CONTADOR VAR BYTE
INICIO:
IF PULSADOR THEN
CONTADOR = CONTADOR + 1
GOSUB AUMENTAR
ENDIF
GOTO INICIO
AUMENTAR:
IF CONTADOR = 1 THEN
GOSUB PRENDER
ENDIF
IF CONTADOR = 2 THEN
GOSUB APAGAR
ENDIF
GOTO AUMENTAR
PRENDER:
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
LCDOUT $FE, $0C 'APAGAR EL CURSOR
GOTO AUMENTAR
APAGAR:
LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
END
Para el programa 1 puedes hacerlo de esta forma:En este primer programa mantengo presionado un pulsador y durante el tiempo que lo mantengo presionado el pulsador sale en pantalla un mensaje.
En el 2do programa, la idea es que al presionar 1 vez el pulsador, aparezca el mensaje, luego al presionar el pulsador por segunda vez, el mensaje desaparezca. No lo he podido lograr, una vez presionado el pulsador, sale un mensaje intermitente y el pulsador no responde mas. sin embargo lo coloco para que me ayuden, me corrijan y me expliquen
Symbol Pulsador = PORTB.0
Inicio:
LCDOut $FE,1 ; Inicializar la pantalla.
Programa:
If Pulsador Then ; Si Pulsador = 1
While Pulsador ; Mientras Pulsador = 1
LCDOut $FE,$80,"HOLA" ; Escribir en línea 1
LCDOut $FE,$C0,"ELECTRONICA" ; Escribir en línea 2
Pause 100
Wend ; Pulsador ahora está en 0
LCDOut $FE,1 ; Limpiar la pantalla
EndIf
GoTo Programa
Symbol Pulsador = PORTB.0
; Declaración de variables.
B0 Var Byte
Contador Var Byte
Inicio:
LCDOut $FE,1 ; Inicializar la pantalla.
Clear ; Limpiar variables.
Programa:
Button Pulsador,1,255,255,B0,0,Programa
Contador = Contador + 1 ; Incrementar Contador
If Contador = 1 Then ; Si Contador llegó a 1...
LCDOut $FE,$80,"HOLA" ; Escribir en línea 1
LCDOut $FE,$C0,"ELECTRONICA" ; Escribir en línea 2
Pause 100
Else ; Si es superior a 1...
LCDOut $FE,1 ; Borrar la pantalla.
Contador = 0 ; Regresar Contador a 0
EndIf
GoTo Programa
End
hola jesusmolo porque no ensayas en la etiqueta apagar colocar la bandera contador otra vez en cero y en inicio en la parte de if pulsador colocale si pulsador=1 ó pulsador=0 según como tengas el pulsador configurado si con resistencia pull-up ó pull-down.
DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS
DEFINE LCD_DBIT 0 'DESDE EL BIT A.0 AL BIT A.3
DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO A
DEFINE LCD_RSBIT 4 'EN EL BIT A.4
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3 'EN EL BIT B.3
TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA
TRISB=1 ; RB0,RB1 SON ENTRADAS
PAUSE 500 ' PAUSE DE MEDIO SEGUNDO
;CONFIGURACION DE ENTRADAS AL PIC 16F84a
Symbol PULSADOR = PORTB.0 ; BOTON DE AJUSTE PARA HORA
CONTADOR VAR BYTE
INICIO:
IF PULSADOR = 1 THEN
CONTADOR = CONTADOR + 1
GOSUB AUMENTAR
ENDIF
GOTO INICIO
AUMENTAR:
IF CONTADOR = 1 THEN
GOSUB PRENDER
ENDIF
IF CONTADOR = 2 THEN
GOSUB APAGAR
ENDIF
GOTO AUMENTAR
PRENDER:
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
LCDOUT $FE, $0C 'APAGAR EL CURSOR
GOTO AUMENTAR
APAGAR:
CONTADOR = 0
LCDOUT $FE, 1 ' LIMPIAR VISOR
GOTO AUMENTAR
END
Para el programa 1 puedes hacerlo de esta forma:
Para el segundo programa de esta otra forma:Código:Symbol Pulsador = PORTB.0 Inicio: LCDOut $FE,1 ; Inicializar la pantalla. Programa: If Pulsador Then ; Si Pulsador = 1 While Pulsador ; Mientras Pulsador = 1 LCDOut $FE,$80,"HOLA" ; Escribir en línea 1 LCDOut $FE,$C0,"ELECTRONICA" ; Escribir en línea 2 Pause 100 Wend ; Pulsador ahora está en 0 LCDOut $FE,1 ; Limpiar la pantalla EndIf GoTo Programa
Nota que estás usando el pin RA4 para el pin RS de la pantalla y el pin RA4 es con drenador abierto.Código:Symbol Pulsador = PORTB.0 ; Declaración de variables. B0 Var Byte Contador Var Byte Inicio: LCDOut $FE,1 ; Inicializar la pantalla. Clear ; Limpiar variables. Programa: Button Pulsador,1,255,255,B0,0,Programa Contador = Contador + 1 ; Incrementar Contador If Contador = 1 Then ; Si Contador llegó a 1... LCDOut $FE,$80,"HOLA" ; Escribir en línea 1 LCDOut $FE,$C0,"ELECTRONICA" ; Escribir en línea 2 Pause 100 Else ; Si es superior a 1... LCDOut $FE,1 ; Borrar la pantalla. Contador = 0 ; Regresar Contador a 0 EndIf GoTo Programa End
Para utilizar ese pin y obtener los dos estados lógicos que se requieren, debes colocar una resistencia Pull-Up.
Adjunto los códigos y la simulación por si requieres saber la conexión.
Saludos.
hola juancaca, de antemano gracias por tu pronta respuesta, te comento que siguiendo tus indicaciones o corrígeme si me equivoque en algo, hice lo siguiente:
Código:DEFINE LCD_DREG PORTA 'UTILIZAR 4 BITS DEL PUERTO A PARA TX DE DATOS DEFINE LCD_DBIT 0 'DESDE EL BIT A.0 AL BIT A.3 DEFINE LCD_RSREG PORTA 'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO A DEFINE LCD_RSBIT 4 'EN EL BIT A.4 DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B DEFINE LCD_EBIT 3 'EN EL BIT B.3 TRISA=0 'ESTABLECER EL PUERTO A COMO SALIDA TRISB=1 ; RB0,RB1 SON ENTRADAS PAUSE 500 ' PAUSE DE MEDIO SEGUNDO ;CONFIGURACION DE ENTRADAS AL PIC 16F84a Symbol PULSADOR = PORTB.0 ; BOTON DE AJUSTE PARA HORA CONTADOR VAR BYTE INICIO: IF PULSADOR = 1 THEN CONTADOR = CONTADOR + 1 GOSUB AUMENTAR ENDIF GOTO INICIO AUMENTAR: IF CONTADOR = 1 THEN GOSUB PRENDER ENDIF IF CONTADOR = 2 THEN GOSUB APAGAR ENDIF GOTO AUMENTAR PRENDER: LCDOUT $FE, 1 ' LIMPIAR VISOR LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA LCDOUT $FE, $0C 'APAGAR EL CURSOR GOTO AUMENTAR APAGAR: CONTADOR = 0 LCDOUT $FE, 1 ' LIMPIAR VISOR GOTO AUMENTAR END
La resistencia es PULL DOWN en PORTB.0, me sigue apareciendo el mensaje intermitente.
Probare ahora como me indica D@rkbytes y les comentaré.
De todas maneras muchas gracias juancaca por tu tiempo.
Adjunto el diagrama en proteus.
INICIO:
IF PULSADOR = 1 THEN
while pulsador=1
wend
pause 200
CONTADOR = CONTADOR + 1
GOSUB AUMENTAR
ENDIF
GOTO INICIO
AUMENTAR:
IF CONTADOR = 1 THEN
GOSUB PRENDER
ENDIF
IF CONTADOR = 2 THEN
GOSUB APAGAR
ENDIF
GOTO inicio
PRENDER:
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
'LCDOUT $FE, $0C 'APAGAR EL CURSOR
return
APAGAR:
CONTADOR = 0
LCDOUT $FE, 1 ' LIMPIAR VISOR
return
END
INICIO:
IF PULSADOR = 1 THEN
while pulsador=1
wend
pause 200
CONTADOR = CONTADOR + 1
if contador=1 then
LCDOUT $FE, 1 ' LIMPIAR VISOR
LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA
LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA
else
contador=2
LCDOUT $FE, 1 ' LIMPIAR VISOR
CONTADOR = 0
endif
ENDIF
GOTO INICIO
end
Para la primer pregunta mira por aquí: Instrucción Button PBPsi no es molestia me gustaría que me explicaras 2 dudas que tengo:
1.- esta instrucción del 2do programa.
Button Pulsador,1,255,255,B0,0,Programa
2.- La función del pulsador de reset en el pin MCRL, del pic es borrar todo rastro de programa grabado, para poder grabar otros programas? o tiene otra función? es necesario colocarlo en todos los ejercicios que quiera hacer? o al momento que yo quiera montar el ejercicio físicamente no lo coloco para no borrar por accidente el programa?
De nada.hola D@rkbytes buenas tardes, muchas gracias por tan pronta, corta y acertada respuesta, hermanazo , con respuestas como estas, haces que los que apenas empezamos y veíamos la programación de pic como algo muy complejo; le tomemos empeño y ganas de seguir explorando.
hola jesusmolo mirando tu codigo le hice unas modificaciones y ya me funciona e hice otro muy parecido al de D@rkbytes y tambien funciona
codigo 1
Código:INICIO: IF PULSADOR = 1 THEN while pulsador=1 wend pause 200 CONTADOR = CONTADOR + 1 GOSUB AUMENTAR ENDIF GOTO INICIO AUMENTAR: IF CONTADOR = 1 THEN GOSUB PRENDER ENDIF IF CONTADOR = 2 THEN GOSUB APAGAR ENDIF GOTO inicio PRENDER: LCDOUT $FE, 1 ' LIMPIAR VISOR LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA 'LCDOUT $FE, $0C 'APAGAR EL CURSOR return APAGAR: CONTADOR = 0 LCDOUT $FE, 1 ' LIMPIAR VISOR return END
codigo 2
espero te sirvaCódigo:INICIO: IF PULSADOR = 1 THEN while pulsador=1 wend pause 200 CONTADOR = CONTADOR + 1 if contador=1 then LCDOUT $FE, 1 ' LIMPIAR VISOR LCDOUT $FE, 1, "HOLA" 'ESCRIBIR EN LA PRIMER LÍNEA LCDOUT $FE, $C0, "ELECTRONICA" 'ESCRIBIR EN LA SEGUNDA LÍNEA else contador=2 LCDOUT $FE, 1 ' LIMPIAR VISOR CONTADOR = 0 endif ENDIF GOTO INICIO end
cordial saludo
@ DEVICE PIC16F628A
@ DEVICE INTRC_OSC_CLKOUT
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_ON
@ DEVICE PROTECT_ON
DEFINE OSC 4
CMCON = 7
TRISB = %00000000
TRISA = %11110001
PORTA = %00000000
PORTB = %00000000
TLED1 VAR word
TLED2 VAR word
TLED3 VAR WORD
MinutO var byte
Segundo Var Byte
MAS_TIEMPO VAR BYTE
INITIO VAR BYTE
I var byte
FLAG VAR WORD
FLAG0 VAR word
FLAG1 VAR word
FLAG2 VAR word
AUX VAR BYTE
MILISEGUNDO var byte
;******POTENCIA******///////******
LED_0 var PORTB.0
LED_1 VAR PORTB.1
LED_2 VAR PORTB.2
LED_3 VAR PORTB.3
Trbuz VAR PORTB.7
;********************///////******
;******PULSADORES****///////******
BOTON0 VAR PortA.0
BOTON1 VAR PortA.6
BOTON2 VAR PortA.7
;********************///////******
TMR0 = 206
OPTION_REG = %10000111 'preescaller 256
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000
FLAG0=0
FLAG1=0
flag2=0
i=0
INICIO:
if boton0 = 1 then ;activo boton
WHILE boton0 = 1
I = I + 1
FOR AUX = 0 TO 1000 'ESTO ES IGUAL A PAUSE 10 OSEA 10MS
PAUSEUS 10
NEXT
WEND
WRITE 00,I
goto verifica
endif
if led_0 = 0 and led_1 = 0 and led_2 = 0 then
goto inicio
else
goto temporiza
endif
verifica:
if i => 256 then
i = 0
goto inicio
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG0 = 10 'PARA UN TIEMPO DE 10 SEG
toggle led_0
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for aux = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 60 'PARA UN TIEMPO DE 1min
toggle led_0
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for aux = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 120 'PARA UN TIEMPO DE 2min
toggle led_0
I = 0
ENDIF
temporiza:
IF MILISEGUNDO => 78 THEN '998.4 MILISEGUNDOS + 1.14 = 999.54 ML = 1 SEG APORX.
MILISEGUNDO = 0
IF led_0 = 1 AND TLed1 < FLAG0 THEN
TLed1 = TLed1 + 1
ELSE
TLed1 = 0
FLAG0 = 0
Led_0 = 0
ENDIF
endif
GOTO INICIO
Disable
MI_INTERRUPCION:
PAUSEUS 13 'DIFERENCIA EN TIEMPO 13 * 78 = 1014 US = 1.14 MILISEGUNDOS
'EL VALOR DEL TMR0 ES DE 206 Y EL DEL PREESCALER DE 256
'ESO DA UN VALOR DE 12800uSEG OSEA 12.8SEG
'ESO MULTIPLICADO POR 78, 12.8 * 78 = 998.4 PARA APROXIMARLO MAS
'SE COMPENSO CON UNA PAUSA DE 13uSEG POR CADA MILISEGUNDO
MILISEGUNDO = MILISEGUNDO + 1
TMR0 = 206
INTCON = %10100000
Resume 'VUELVE DESDE DONDE FUE INTERRUNPIDA
Enable 'INTERRUMPE DESPUES DE LA CABECERA SEGUN MANUAL PBP
END
TMR0 = 206
OPTION_REG = %10000111 'preescaller 256
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000
FLAG0=0
FLAG1=0
FLAG2=0
i=0
MAIN:
IF BOTON0 = 1 THEN
GOTO UNOOO
endif
IF BOTON1 = 1 THEN
GOsub DOS
endif
GOTO MAIN
UNOOO:
IF BOTON0 = 1 THEN
WHILE BOTON0 = 1
I = I + 1
FOR AUX0 = 0 TO 1000
PAUSEUS 10
NEXT
WEND
goto verifica
endif
if LED_0 = 0 then
goto UNOOO
else
goto temporiza
endif
return
verifica:
if i => 256 then
i = 0
goto UNOOO
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
toggle LED_0
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for AUX0 = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 10 'PARA UN TIEMPO DE 10 seg
toggle LED_0
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for AUX0 = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 15 'PARA UN TIEMPO DE 15 seg
toggle LED_0
I = 0
ENDIF
return
DOS:
if BOTON1 = 1 then
WHILE BOTON1 = 1
I = I + 1
FOR AUX1 = 0 TO 1000
PAUSEUS 10
NEXT
WEND
goSUB verifica1
endif
if LED_0 = 0 then
goto DOS
else
goto temporiza
endif
return
verifica1:
if i => 256 then
i = 0
goto DOS
endif
IF I <= 50 THEN
SOUND Trbuz,[110,5]
Trbuz = 0
FLAG0 = 5 'PARA UN TIEMPO DE 5 SEG
toggle LED_1
I = 0
ENDIF
IF I <= 150 and i > 50 THEN
for AUX0 = 0 to 1
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 10 'PARA UN TIEMPO DE 10seg
toggle LED_1
I = 0
ENDIF
IF I <= 200 and i > 150 THEN
for AUX0 = 0 to 2
SOUND Trbuz,[110,5]
pause 300
next
Trbuz = 0
FLAG0 = 15 'PARA UN TIEMPO DE 15 seg
toggle LED_1
I = 0
ENDIF
return
temporiza:
IF MILISEGUNDO => 78 THEN '
MILISEGUNDO = 0
IF LED_0 = 1 AND TLed1 < FLAG0 THEN
TLed1 = TLed1 + 1
ELSE
TLed1 = 0
FLAG0 = 0
LED_0 = 0
I = 0
endif
GOTO UNOOO
IF LED_1 = 1 AND TLed2 < FLAG1 THEN
TLed2 = TLed2 + 1
ELSE
TLed2 = 0
FLAG1 = 0
LED_1 = 0
I = 0
ENDIF
endif
GOTO DOS
Disable
MI_INTERRUPCION:
PAUSEUS 13
MILISEGUNDO = MILISEGUNDO + 1
TMR0 = 206
INTCON = %10100000
Resume
Enable
END