TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: TREMENS en 29 de Noviembre de 2006, 20:45:46
-
estaba queriendo usar un código de picbasic en protón, le hice varios cambios y y el unico error que me da es por las declaraciones de este tipo DIM A PORTC.0
Les muestro el programa completo:
Device = 16F877
XTAL = 4
LCD_TYPE = 0 ' Our LCD is the alphanumeric type
LCD_DTPIN = PORTB.4 ' For Proteus Virtual Hardware Board LCD Data is PORTB.4,5,6,7
LCD_RSPIN = PORTB.2 ' LCD RS pin
LCD_ENPIN = PORTB.1 ' LCD EN pin
LCD_INTERFACE = 4 ' We're using a 4-bit LCD interface
LCD_LINES = 2 ' We're using a 2-Line LCD
TRISB = 0 ; PUERTO B SALIDA
DIM A PORTC.0 ;nombres para los pines de las filas
DIM B PORTC.1
DIM C PORTC.2
DIM D PORTC.3
DIM UNO PORTC.4 ;nombres para los pines de las columnas
DIM DOS PORTC.5
DIM TRES PORTC.6
DIM CUATRO PORTC.7
BARRIDO:
LOW A ;hacer bajo la 1era fila
IF UNO = 0 THEN PRINT AT 1 , 1 ,"1" ;si 1ra tecla es presionada sacar 1,(línea1,columna1 del LCD)
IF DOS = 0 THEN PRINT AT 1 , 1," 2" ;si 2da tecla es presionada sacar 2
IF TRES = 0 THEN PRINT AT 1 , 1," 3" ;si 3ra tecla es presionada sacar 3
IF CUATRO = 0 THEN PRINT AT 1 , 1,"A" ;si 4ta tecla es presionada sacar 10
HIGH A ;poner en alto la 1era fila
LOW B ;hacer bajo la 2da fila
IF UNO = 0 THEN PRINT AT 1 , 1," 4" ;si 1ra tecla es presionada sacar 4
IF DOS = 0 THEN PRINT AT 1 , 1," 5" ; y así sucesivamente
IF TRES = 0 THEN PRINT AT 1 , 1," 6"
IF CUATRO = 0 THEN PRINT AT 1 , 1,"B"
HIGH B ;poner en alto la 2da fila
LOW C ;hacer bajo la 3ra fila
IF UNO = 0 THEN PRINT AT 1 , 1," 7" ;fila3,columna4
IF DOS = 0 THEN PRINT AT 1 , 1," 8"
IF TRES = 0 THEN PRINT AT 1 , 1," 9"
IF CUATRO = 0 THEN PRINT AT 1 , 1,"C"
HIGH C ;poner en alto la 3ra fila
LOW D ;hacer bajo la 4ta fila
IF UNO = 0 THEN PRINT AT 1 , 1,"*"
IF DOS = 0 THEN PRINT AT 1 , 1," 0"
IF TRES = 0 THEN PRINT AT 1 , 1,"#"
IF CUATRO = 0 THEN PRINT AT 1 , 1,"D"
HIGH D ;poner en alto la 4ta fila
DELAYMS 10 ;pausa de 10 milisegundos
GOTO BARRIDO ;continuar el barrido de teclas
END
-
Pues que no la sintaxis de los Alias es igual a la de las Variables:
DIM I As Tipo
DIM A As PORTX.X
-
Para asignar una etiqueta a un pin o un registro en protón hay que utilizar la instrucción
Symbol ejem:
Symbol clk portb.0
-
Hola:
TREMENS, olvidate de esas viejas rutinas de PBP, proton soporta una instruccion que se llama INKEY, todo lo que tienes que hacer es lo siguiente:
Syntax
Variable = INKEY
Overview
Scan a keypad and place the returned value into variable
Operators
Variable is a user defined variable of type bit, byte, byte array, word, word array, dword or float.
Example
DIM VAR1 as BYTE
VAR1 = INKEY ' Scan the keypad
DELAYMS 50 ' Debounce by waiting 50ms
PRINT @VAR1 , " " ' Display the result on the LCD
Notes
INKEY will return a value between 0 and 16. If no key is pressed, the value returned is 16. Using a LOOKUP command, the returned values can be re-arranged to correspond with the legends printed on the keypad: -
VAR1 = INKEY
KEY = LOOKUP VAR1, [255,1,4,7,"*",2,5,8,0,3,6,9,"#",0,0,0]
The above example is only a demonstration, the values inside the LOOKUP command will need to be re-arranged for the type of keypad used, and it's connection configuration.
Declares
DECLARE KEYPAD_PORT PORT
Assigns the Port that the keypad is attached to.
The keypad routine requires pull-up resistors, therefore, the best Port for this device is PORTB, which comes equipped with internal pull-ups. If the DECLARE is not used in the program, then PORTB is the default Port.
Para mas informacion mira la ayuda, busca la funcion INKEY, te explico rapidamente:
Necesitas declarar el puerto en el cual conectaras el teclado, lo haces de la siguiente manera:
DECLARE KEYPAD_PORT PORTC
Asi por ejemplo declaras para conectar el teclado en el puerto C del pic
Y para leer el valor asi:
dim var as byte
var=inkey
donde inkey te dara valores del 0 al 16, los valores correspondientes del 0 al 15 representaran una tecla y el 16 cuando no preciones ninguna tecla.
Espero haberme Explicado, cualquier cosa por aqui ando :mrgreen:
-
Muy interesante, pero ahora no tengo dinero para el Proton, asi que me quedaré con el PBP.
-
DIM VAR1 as BYTE
dim KEY as BYTE
DECLARE KEYPAD_PORT PORTC
delayms 500
inicio:
VAR1 = INKEY ' Scan the keypad
DELAYMS 50 ' Debounce by waiting 50ms
PRINT dec VAR1 ' Display the result on the LCD
goto inicio
cuando tenga presionada una tecla se llena el lcd con ese numero, y cuando lo suelto se llena de 16. Como hago para que esto no suceda, pra que funcione com oel codigo qu epuse mas arriba(el viejo del pbp) ???
-
Hola
Para eso debes utilizar el LOOKUP y armarlo de acuerdo a las teclas que tenga tu teclado
ejemplo:
VAR1 = INKEY
KEY = LOOKUP VAR1, [255,1,4,7,"*",2,5,8,0,3,6,9,"#",0,0,0]
de lo contrario devolverá un 16.-
mira la ayuda!
saludos
-
Hola:
Puedes utilizar condicionales (IF) para que muestres el valor de la tecla solo cuando sea necesario, por ejemplo podrias hacer esto:
DIM VAR1 as BYTE
dim KEY as BYTE
DECLARE KEYPAD_PORT PORTC
delayms 500
inicio:
VAR1 = INKEY ' Scan the keypad
if var1 <> 16 then
PRINT dec VAR1 ' Display the result on the LCD
while tecla<>16 'antirebote
tecla=inkey
wend
endif
goto inicio
Pruebalo a ver como funciona, pero la idea esta, ahora lo que tienes que hacer es programar, si ya lo has hecho con PBP la estructura del Basic sigue siendo la misma, es obvio que como mandas a ver a cada instante el valor recibido de la tecla te muestra siempre algo, en este caso te mostrara un valor solo cuando presiones una tecla, y no mostrara nada mas hasta que vuelvas a precionar otra ves.
-
gente:
les quiero consultar sobre este programa que parece largo, pero lo hice así para entenderlo fácil, le pido que por favor n ome hagan usar inkey.
Lo que debe hacer el programa es pedir KP y yo ingreso kp, sale kp=valor y se repite lo mismo para ki, kd y B. ES Todo secuencial, el que aprieta l atecla solo parita los numeros y sigue instrucciones, de forma de no equivocarse.
una aclaracion , los valores a ingresar son desde 0 a 255, pero con punto flotante.
lo que hice fue que ingresen 6 digitos y despues correr la coma multiplicando y dividiendo.
Acá le s muestro el codugo:
Me olvidaba el ejempolo es para ingrese las 4 constantes una sola vez y se clave ahí.
código:
Device = 16F877
XTAL = 4
LCD_TYPE = 0 ' Our LCD is the alphanumeric type
LCD_DTPIN = PORTB.4 ' For Proteus Virtual Hardware Board LCD Data is PORTB.4,5,6,7
LCD_RSPIN = PORTB.2 ' LCD RS pin
LCD_ENPIN = PORTB.1 ' LCD EN pin
LCD_INTERFACE = 4 ' We're using a 4-bit LCD interface
LCD_LINES = 2 ' We're using a 2-Line LCD
TRISB = 0 ; PUERTO B SALIDA
;*******nombres para los pines de las filas**********
DIM A as PORTC.0
DIM B as PORTC.1
DIM C as PORTC.2
DIM D as PORTC.3
;******nombres para los pines de las columnas***********
DIM UNO as PORTC.4
DIM DOS as PORTC.5
DIM TRES as PORTC.6
DIM CUATRO as PORTC.7
;********VARIABLES PARA EL MENU**********
dim numero as byte
dim dig1 as float
dim dig2 as float
dim dig3 as float
dim dig4 as float
dim dig5 as float
dim dig6 as float
dim corro as float ; es el dig7 , los ludgares a la izquierda
dim Contdig as byte
dim Contctte as byte
dim ctte1 as float
dim ctte2 as float
dim ctte3 as float
dim ctte4 as float
dim ctte5 as float
dim ctte6 as float
dim k as float
dim dividendo as float
dim i as byte
dim Kp as float
dim Ki as float
dim Kd as float
;*********RUTINA PRINCIPAL***************
principalmenu:
GOSUB CONTADORCTTES
GOSUB PEDIRINGRESAR
gosub BARRIDO
GOSUB CONTADORDIGITOS
GOSUB GUARDARDIGS
gosub ARMOCTTE
gosub cttedefinitiva
GOSUB LIMITOCONSTANTE
GOSUB CONTADORCTTES
gosub GUARDARCOMO ;CUENTA LOS DIGITOS
GOTO principalmenu
;*************esto para saber que constante ingresamos********
CONTADORCTTES:
Contctte=Contctte+1 ;CUENTA QUE CTTE ESTAMOS INGRESANDO
RETURN ;1 para KP,2paraKi,3 para Kd;4 para B
;********pido ingresar constante**************
PEDIRINGRESAR:
DELAYMS 500
if Contctte=1 THEN PRINT AT 1 , 1 ,"Kp=? ":return
if Contctte=2 THEN PRINT AT 1 , 1 ,"Ki=? ":return
if Contctte=3 THEN PRINT AT 1 , 1 ,"Kd=? ":return
if Contctte=4 THEN PRINT AT 1 , 1 ,"B=? ":return
RETURN
;***********lectura vieja pero la entiendo*****************
BARRIDO:
LOW A ;hacer bajo la 1era fila
IF UNO = 0 THEN numero=1:RETURN ;si 1ra tecla es presionada sacar 1,(línea1,columna1 del LCD)
IF DOS = 0 THEN numero=2:RETURN ;si 2da tecla es presionada sacar 2
IF TRES = 0 THEN numero=3:RETURN ;si 3ra tecla es presionada sacar 3
HIGH A ;poner en alto la 1era fila
LOW B ;hacer bajo la 2da fila
IF UNO = 0 THEN numero=4RETURN ;si 1ra tecla es presionada sacar 4
IF DOS = 0 THEN numero=5:RETURN ; y así sucesivamente
IF TRES = 0 THEN numero=6:RETURN
HIGH B ;poner en alto la 2da fila
LOW C ;hacer bajo la 3ra fila
IF UNO = 0 THEN numero=7:RETURN ;fila3,columna4
IF DOS = 0 THEN numero=8:RETURN
IF TRES = 0 THEN numero=9:RETURN
HIGH C ;poner en alto la 3ra fila
LOW D ;hacer bajo la 4ta fila
IF UNO = 0 THEN numero=1:RETURN
IF DOS = 0 THEN numero=1:RETURN
IF TRES = 0 THEN numero=1:RETURN
HIGH D ;poner en alto la 4ta fila
DELAYMS 10 ;pausa de 10 milisegundos
GOTO BARRIDO ;continuar el barrido de teclas
;****************para saber cual de los 7 digitos ingresé***
CONTADORDIGITOS:
Contdig=Contdig+1 ; CUENTO LOS DIGITOS
return
;*************guardo el digito segun la posicion que me dice contador***
GUARDARDIGS:
if Contdig=1 THEN dig1=numero:return
if Contdig=2 THEN dig2=numero:return
if Contdig=3 THEN dig3=numero:return
if Contdig=4 THEN dig4=numero:return
if Contdig=5 THEN dig5=numero:return
if Contdig=6 THEN dig6=numero:return
IF Contdig=7 THEN corro=numero:return
RETURN
;*********armo el numero de 6 digitos, el septimo son los lugares que la
;coma corre a la izquierda
ARMOCTTE:
ctte1=dig1*100000
ctte2=ctte1+dig2*10000
ctte3=ctte2+dig3*1000 ;PIDO QUE INGRESE LUGARES A LA IZQUIERDA
ctte4=ctte3+dig4*100
ctte5=ctte4+dig5*10
ctte6=ctte5+dig6
lugaresizquierda:
i=i+1 ;repito la multimiplicacion por 10 tantas veces
if i>corro then return ;como me indique corro(dig7)
dividendo=dividendo*10
goto lugaresizquierda
cttedefinitiva: ;divido porq es equivalente a correr la coma la izquierda
k=ctte6/dividendo
return
;******limito k a 255************
LIMITOCONSTANTE: ; esta limitacion la hago , debido al programa
IF K>255 THEN K=255:RETURN ;donde usare este menu
RETURN
;*******según Contctte se que ctte ingresé y la saco por lcd******
GUARDARCOMO:
CLS
DELAYMS 500
if Contctte=1 THEN Kp=k:PRINT AT 1 , 1,"Kp=",DEC kp:return ;segun contctte sabe a que k corresponde
if Contctte=2 THEN Ki=k:PRINT AT 1 , 1,"Ki=",dec ki:return
if Contctte=3 THEN Kd=k:PRINT AT 1 , 1,"Kd=",dec kd:return
if Contctte=4 THEN B=k:PRINT AT 1 , 1,"B=",dec b:end
end
-
Hola:
Y cual es el problema que tienes?
No veo porque no usar inkey, es mas facil y mejor que tener todo ese rollo para usar un teclado, yo creo firmemente que si un compilador tiene instrucciones para determinadas cosas hay que usarlas, en este caso el inkey, sino para que utilizar proton? mejor lo sigues haciendo en PBP. :D
Aclaranos cual es el problema que tienes para tratar de ayudarte de mejor manera :mrgreen:
-
uso el proton poruqe maneja punto flotante y signo
y los valores de esas constante los uso despues en operaciones de esas características.
El problema es justamente com ointroducir los decimales , hice el codigo que publique y no entiendo la falla
-
Hola
con el código siguiente se logra ver los números del teclado con la instrucción INKEY
cuando se presiona un simbolo del teclado se muestra un "0".-
el teclado utilizado en el ejemplo es un teclado tipo calculadora 4x4
Dim VAR1 As Byte
Dim KEY As Byte
LCD_TYPE = 0 ' lcd alfanumerico
LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.2 ' pin de reset lcd
LCD_ENPIN = PORTB.1 ' pin de enable lcd
LCD_INTERFACE = 4 ' interface de 4 bits
LCD_LINES = 2
Declare KEYPAD_PORT PORTC
DelayMS 500
inicio:
VAR1 = InKey
KEY = LookUp VAR1, [7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0]
If VAR1 <> 16 Then
Cls
Print At 1,1, Dec KEY
EndIf
GoTo inicio
End
Es verdad lo que te dicen sobre usar el código que has posteado antes!! con esta instrucion te hace el barrido de forma automatica y te ahorras mas de un dolor de cabeza.-
saludos
:-)