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.
Creo que no probaste el código que puse, ese programa eso es lo que hace.Gracias amigos. Una última duda: En el caso de querer hacer que el led titile o centelle.
¿Cómo sería para hacer que al pulsar el sw titile y al volver a pulsar el mismo sw se apague?
; Declaración de variables.
B0 Var Byte
Flag Var Bit
; Nombres para los pines.
Symbol LED = PORTB.4
Symbol Pulsador = PORTB.0
Inicio:
; CMCON = 7 ; Comparadores analógicos OFF
OPTION_REG = 0 ; Pull-Ups (PORTB) y Falling edge (INT-RB0)
INTCON = %11010000 ; Habilitar interrupción por RB0
; Activar el servicio de interrupciones.
On Interrupt GoTo SDI_RB0
Flag = 1 ; "Flag" en 1 al iniciar.
Low LED ; "LED" en 0 al iniciar.
Programa:
Button Pulsador,0,127,255,B0,0,Programa
Pause 50
While Flag = 0 ; Mientras "Flag" es 0...
Toggle LED ; Cambiar de estado "LED"
Pause 50 ; Hacer un retardo. (Aquí se cambia el tiempo del destello)
Wend ; Salir del bucle cuando "Flag" cambie a 1
Low LED ; "LED" en 0
While Pulsador = 1 ; Mientras "Pulsador" esté en 1...
Pause 20 ; Hacer un retardo de 20ms.
Wend ; Salir cuando "Pulsador" sea 0
Flag = 0 ; Establecer "Flag" en 0
GoTo Programa
; Servicio de interrupción por RB0
SDI_RB0:
Disable ; Desactivar interrupciones.
If INTCON.1 = 1 Then ; Si es interrupción por RB0, entonces...
If Flag = 0 Then ; Si "Flag" está en 0, entonces...
Flag = 1 ; Establecer "Flag" en 1
EndIf
INTCON.1 = 0 ; Limpiar flag INTF
EndIf
Resume ; Retornar al programa (RETFIE)
Enable ; Volver a activar interrupciones.
End
OK. Para que eso no te vuelva a suceder, debes analizar los parámetros de la instrucción "Button"Hola Darkbytes. Si lo probé.
El problema que tuve fue que no me fijé con que lógica tenías tú el pulsador en el código que me enviaste.
Yo lo tenía con lógica Activo-Alto, y por eso no me funciono la primera vez.
También está la configuración del registro OPTION_REG que en el comentario dice lo siguiente:La ayuda de PBP dijo:Down State of pin when button is pressed (1..0)
DEFINE LCD_DREG PORTB ' Indica que el Bus estará conectado en el Puerto B
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 3 ' "RS" estará conectado en RB3
DEFINE LCD_EREG PORTB ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 2 ' "E" estará conectado en RB2
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = $FF ' Configura el puerto A como entrada.
TRISB = $00 ' Configura el puerto B como salida.
Dato Var Byte ' Declaración de la Variable "Dato" tipo Byte.
Dato = 25 ' Inicializa la Variable Dato = 25.
Lcdout $fe, 1 ' Limpia la pantalla
Inicio:
Lcdout $fe,2 ' Inicio de la primera línea.
Lcdout "P1 Suma P2 Resta" ' Escribe mensaje en la primera línea.
Lcdout $fe,$C0,"Dato: ",Dec Dato," " ' Escribe el mensaje en la 2da línea
' seguido del valor cargado en la
' variable "Dato" en Decimal.
If PORTA.1 = 1 And Dato < 50 Then Call Suma
' La siguiente instrucción pregunta si hay un "1" en RA1 y si la variable
' "Dato" es menor a 50. Si se cumplen estas dos condiciones, hace un salto
' con retorno a la subrutina "Suma".
If PORTA.3 = 1 And Dato > 0 Then Call Resta ' La siguiente instrucción pregunta si hay un "1" en RA3 y si la variable
' "Dato" es mayor a 0. Si se cumplen estas dos condiciones, hace un salto
' con retorno a la subrutina "Resta".
GoTo Inicio ' Salta a la etiqueta "Inicio".
Suma:
Dato = Dato + 1 ' Incrementa en una unidad la variable "Dato".
Pause 350 ' Realiza una pausa de 350 milisegundos para evitar
' que el incremento de la variable sea muy acelerado
' mientras el pulsador "P1" esté presionado.
Return ' Retorna una línea después del llamado "Call Suma".
Resta:
Dato = Dato - 1 ' Decrementa en una unidad la variable "Dato".
Pause 350 ' Realiza una pausa de 350 milisegundos para evitar
' que el decremento de la variable sea muy acelerado
' mientras el pulsador "P2" esté presionado.
Return ' Retorna una línea después del llamado "Call Resta".
End
If a pound sign (#) precedes an Item, the ASCII representation for each digit is sent to the LCD.
Hola.Edit:
Mejoras para eliminar rebotes del pulsador...
Si, así es, y sobre este tema ya se ha hablado anteriormente unas páginas atrás.Quiero recordar que el método Button ya tiene un procedimiento antirebote.
De la documentación:
BUTTONBUTTON Pin,Down,Delay,Rate,BVar,Action,Label
; Declaración de variables.
Flag Var Bit
; Nombres para los pines.
Symbol LED = PORTB.4
Inicio:
OPTION_REG = 0 ; Pull-Ups (PORTB) y Falling edge (INT-RB0)
INTCON = %11010000 ; Habilitar interrupción por RB0
; Activar el servicio de interrupciones.
On Interrupt GoTo SDI_RB0
Low LED: Flag = 0 ; "LED" y "Flag" en 0 al iniciar.
Programa:
While Flag = 1 ; Mientras "Flag" sea 1...
Toggle LED ; Cambiar de estado "LED"
Pause 50 ; Cambiar el tiempo del destello aquí
Wend ; Salir del bucle cuando "Flag" sea 0
Low LED ; Apagar el LED
GoTo Programa
; Servicio de interrupción por RB0
SDI_RB0:
Disable ; Desactivar interrupciones.
If INTCON.1 = 1 Then ; Si es interrupción por RB0, entonces...
If Flag = 0 Then ; Si "Flag" está en 0, entonces...
Flag = 1 ; Establecer "Flag" en 1
Else ; Caso contrario...
Flag = 0 ; Establecer "Flag" en 0
EndIf
INTCON.1 = 0 ; Limpiar flag INTF
EndIf
Resume ; Retornar al programa (RETFIE)
Enable ; Volver a activar interrupciones.
End
en la ayuda dice:
si un signo # antecede a un elemento, la representacion ASCII para cada digito se envia al LCD
asi que prueba asi:
Lcdout $fe,$C0,"Dato: ",#Dato
jesusmolo ya puso el código que hizo, pero ha comentado que no le funciona.¿Quieres saber como se hace o quieres que te lo hagan? es diferente...
Al usar los operadores que propones, lo que se obtendrá será un número y no una letra.Al código que pusiste en donde dice:
Lcdout $fe,$C0,"Dato: ",DEC Dato
Le pruebas poniendo:
Lcdout $fe,$C0,"Dato: ",#Dato
Que es lo que indiqué en el mensaje anterior y delimitas con la condición "if" el rango de la A a la Z.
Letra Var Byte
LCDOut $FE,1," Abecedario"
Letra = 65
Programa:
If PORTB.2 = 0 Then
Letra = Letra + 1
If Letra >90 Then Letra = 90
EndIf
If PORTB.3 = 0 Then
Letra = Letra - 1
If Letra <65 Then Letra = 65
EndIf
LCDOut $FE,$C0,"Letra: ",Letra
Pause 250
GoTo Programa
End
jesusmolo ya puso el código que hizo, pero ha comentado que no le funciona.
la verdad no me acuerdo, pero ahora que mencionas y seguramente lo tienes mas fresco si, con solo mandar el codigo ascii es suficiente..pero por ahi iba XDAl usar los operadores que propones, lo que se obtendrá será un número y no una letra
Para mostrar letras ninguno funcionaría, ambos convierten un número a cadena para poder ser visualizado.Para serte honesto me queda la duda del #, o sea, que sea lo mismo el # que el DEC, el dec si estoy seguro que no funcionaría.
La principal diferencia se notará cuando se escriba en la pantalla LCDOut $FE,$80,#123 y después se escriba LCDOut $FE,$80, #5Cuando tenga un poco de tiempo lo checo para ver si es lo mismo o que diferencia hay, si la hay entre esos.
jesusmolo ya puso el código que hizo, pero ha comentado que no le funciona.
Al usar los operadores que propones, lo que se obtendrá será un número y no una letra.
Lo que jesusmolo quiere hacer es algo muy sencillo.
Si tomamos como base la Tabla ASCII, veremos que la letra A mayúscula equivale al número 65 y así sucesivamente hasta la Z que equivale al código ASCII 90.
Entonces mostrar cada letra en orden de abajo hacia arriba y viceversa, sería muy sencillo:
Así de fácil.PHP:Letra Var Byte LCDOut $FE,1," Abecedario" Letra = 65 Programa: If PORTB.2 = 0 Then Letra = Letra + 1 If Letra >90 Then Letra = 90 EndIf If PORTB.3 = 0 Then Letra = Letra - 1 If Letra <65 Then Letra = 65 EndIf LCDOut $FE,$C0,"Letra: ",Letra Pause 250 GoTo Programa End
cmcon=7
TRISA=%00000100
TRISB=%00000000
DEFINE LCD_DREG PORTB ' Set LCD Data port
DEFINE LCD_DBIT 0 ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA ' Set LCD Register Select port
DEFINE LCD_RSBIT 4 ' Set LCD Register Select bit
DEFINE LCD_EREG PORTA ' Set LCD Enable port
DEFINE LCD_EBIT 3 ' Set LCD Enable bit
DEFINE LCD_BITS 8 ' Set LCD bus size (4 or 8 bits)
'DEFINE LCD_LINES 2 ' Set number of lines on LCD
'DEFINE LCD_COMMANDUS 1500 ' Set command delay time in us
'DEFINE LCD_DATAUS 44 ' Set data delay time in us
pause 200 'LCD intializing pause
inicio:
lcdout $FE, 1, "Hola"
lcdout $FE, $C0, "YO SOY GROOT"
pause 1000
goto inicio
end
INCLUDE "modedefs.bas"
cmcon=7
TRISA=%00000100
TRISB=%00000000
DEFINE LCD_DREG PORTB ' Set LCD Data port
DEFINE LCD_DBIT 0 ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA ' Set LCD Register Select port
DEFINE LCD_RSBIT 4 ' Set LCD Register Select bit
DEFINE LCD_EREG PORTA ' Set LCD Enable port
DEFINE LCD_EBIT 3 ' Set LCD Enable bit
DEFINE LCD_BITS 8 ' Set LCD bus size (4 or 8 bits)
'DEFINE LCD_LINES 2 ' Set number of lines on LCD
'DEFINE LCD_COMMANDUS 1500 ' Set command delay time in us
'DEFINE LCD_DATAUS 44 ' Set data delay time in us
datos var word
pause 200 'LCD intializing pause
inicio:
serin porta.2, N2400, datos
lcdout $FE, 1, "Hola"
lcdout $FE, $C0, "YO SOY GROOT"
pause 1000
lcdout $FE, 1, "palabra"
lcdout $FE, $C0, datos
pause 1000
goto inicio
end
Mira por aquí: 16F628A LCD One Wire con 74HC595Hace un par de meses, construí un pequeño módulo para un LCD 16x2 usando un PIC16F628 que tenía un par de puertos dañados, y pensé que sería útil controlarlo con un solo pin.
Me explico: por ejemplo, usar un 12F629 para alguna aplicación y enviar por medio de un solo pin las instrucciones a otro PIC que se encarga exclusivamente de manejar el LCD.