Autor Tema: problema al barrer teclado con proton  (Leído 5283 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TREMENS

  • PIC16
  • ***
  • Mensajes: 125
problema al barrer teclado con proton
« 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


Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: problema al barrer teclado con proton
« Respuesta #1 en: 29 de Noviembre de 2006, 20:52:25 »
Pues que no la sintaxis de los Alias es igual a la de las Variables:
DIM I As Tipo
DIM A As PORTX.X


"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado sandra

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 374
Re: problema al barrer teclado con proton
« Respuesta #2 en: 29 de Noviembre de 2006, 22:02:28 »
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
El pesimista se queja del viento
El optimista espera que cambie
El realista ajusta las velas

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: problema al barrer teclado con proton
« Respuesta #3 en: 30 de Noviembre de 2006, 01:09:55 »
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:

Código: [Seleccionar]
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:

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: problema al barrer teclado con proton
« Respuesta #4 en: 30 de Noviembre de 2006, 03:12:12 »
Muy interesante, pero ahora no tengo dinero para el Proton, asi que me quedaré con el PBP.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado TREMENS

  • PIC16
  • ***
  • Mensajes: 125
Re: problema al barrer teclado con proton
« Respuesta #5 en: 30 de Noviembre de 2006, 09:41:23 »
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) ???

Desconectado doppel

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1534
Re: problema al barrer teclado con proton
« Respuesta #6 en: 30 de Noviembre de 2006, 12:23:20 »
Hola

Para eso debes utilizar el LOOKUP y armarlo de acuerdo a las teclas que tenga tu teclado

ejemplo:

Código: [Seleccionar]
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
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: problema al barrer teclado con proton
« Respuesta #7 en: 30 de Noviembre de 2006, 13:40:12 »
Hola:

Puedes utilizar condicionales (IF) para que muestres el valor de la tecla solo cuando sea necesario, por ejemplo podrias hacer esto:

Código: [Seleccionar]
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.

Desconectado TREMENS

  • PIC16
  • ***
  • Mensajes: 125
Re: problema al barrer teclado con proton
« Respuesta #8 en: 30 de Noviembre de 2006, 21:15:53 »

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

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: problema al barrer teclado con proton
« Respuesta #9 en: 30 de Noviembre de 2006, 21:29:35 »
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:

Desconectado TREMENS

  • PIC16
  • ***
  • Mensajes: 125
Re: problema al barrer teclado con proton
« Respuesta #10 en: 01 de Diciembre de 2006, 00:40:21 »
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



Desconectado doppel

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1534
Re: problema al barrer teclado con proton
« Respuesta #11 en: 01 de Diciembre de 2006, 02:18:40 »
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

Código: [Seleccionar]
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
 :-)
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "


 

anything