TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Moyin en 09 de Diciembre de 2006, 01:36:27
-
Que tal mis amigos, aquí nuevamente con algunas dudas....he tratado de emplear el código de samples de MKB para implementar un circuito de teclado donde recurro al
keypad_init(portx) del juego mde instrucciones del programa, después de un buen rato veo que el código lo que hace es barrer columna por columna un "1" por los bits altos del puerto, estuve monitoreando mediante el otro puerto la salida que genera el teclado a través de una variable que igualé al puerto:
kp = Keypad_Read
portc=keypad_read
la situación es que no encuentro una lógica para emplearlo con otro dispositivo por ejemplo con un lcd, en lo samples del programa viene un ejemplo pero talvez traiga un error ya que no me funciona es más no hace nada. Alguien tiene idea de como usar esta función, el código de ejemplo es el siguiente:
program keypad_test
dim kp, cnt as byte
dim txt as string[5]
main:
cnt = 0
Keypad_Init(PORTC)
Lcd_Init(PORTB) ' Initialize LCD on PORTC
Lcd_Cmd(LCD_CLEAR) ' Clear display
Lcd_Cmd(LCD_CURSOR_OFF) ' Cursor off
Lcd_Out(1, 1, "Key :")
Lcd_Out(2, 1, "Times:")
while TRUE
kp = 0
'--- Wait for key to be pressed
while kp = 0
'--- un-comment one of the keypad reading functions
kp = Keypad_Released
'kp = Keypad_Read
wend
Inc(cnt)
'--- prepare value for output
if kp > 10 then
kp = kp + 54
else
kp = kp + 47
end if
'--- print it on LCD
Lcd_Chr(1, 10, kp)
WordToStr(cnt, txt)
Lcd_Out(2, 10, txt)
wend
end.
Que significa esa suma de +47 y +54, es acaso alguna forma de conversión?
Un saludos a todos....gracias :mrgreen:
-
Hola pues si es una especie de conversion esas sumas mira prueba este codigo:
program Key_LCD
dim key as byte
dim keyt as string[5]
main: 'inicializacion de lcd y keypad
delay_ms(1000)
keypad_init(portb)
lcd_config(portd,3,2,1,0,portd,4,5,6)
lcd_cmd(lcd_clear)
lcd_cmd(lcd_cursor_off)
leek:
key = keypad_read ' lee la tecla que se apreto
ByteToStr(key,keyt)
lcd_out(1,1,"Tecla #: ") 'ver la tecla en el lcd
lcd_out_cp(keyt)
goto leek
end.
y aqui la conexion segun la ayuda tambien es compatible con Keypads de 4x1 4x2 y 4x3 pero no logro hacerlo jalar bien habria que ver que pasa pero en modo 4x4 funciona
(http://img146.imageshack.us/img146/6786/tkpiq9.jpg)
Y si conectaste como el ejemplo de la ayuda tendrias que cambiar el puerto porque usan el PORTC para el Keypad y en la imagen lo conectan al PORTB
se me olvido aclarar que: funciona a 4x4 porque si presionas la tecla 4 te dara el valor 5 asume el programa que puse que existen 4 columnas hay que checar eso
-
Nuevamente gracias Max ya vi tu ejemplo y lo probe y funcionó miuy bien, de hecho hice una poequeña modificación para ver en binario el código de la tecla presionada, este es el ´programa:
program Teclado
dim key as byte
main:
trisc=0
delay_ms(1000)
keypad_init(portb) 'Inicializo el puertoB para el teclado
key = keypad_read 'Lee la tecla que se apreto
portc=key 'Muestra el código de la teclka en el byte del puertoC
end.
(http://img223.imageshack.us/img223/779/luzvy4.jpg)
Un saludo :-/
-
Excelente Moyin, que bien que te quede como querias y para eso estamos pa ayudarnos ;)
PD: Moyin checa tu Sexo :D
-
Gracias Max por la observación, ya corregí el detalle :D
-
Hola moyin! :)
La suma que se hace de var+48 o var+$30 es para convertir el numero obtenido a valor ASCII
por ejemplo el número 1 es el valor 31 hexadecimal y 49 decimal
podrás encontrar varios ejemplos en la carpeta de instalación de Mikrobasic---- Examples
Éxito!!!
-
Actualmente estoy trabajando con un keypad. Lo que quiero saber, es cómo puedo hacer para poder manipular los valores que entran por el teclado.
Más o menos, esto es lo que llevo:
Código:
if kp="*" then // este es el boton de enter
Lcd_Cmd(_LCD_CLEAR)
lcd_out(1,1,"simulando ro")
lcd_Cmd(_LCD_SECOND_ROW)
Lcd_chr(2,5,ro1)
goto generar
end if
Lcd_Chr_CP(kp) // aquí muestra los numeros que van entrando por el teclado
inc(curx) // este contador es para el cursor
if curX=1 then // esto es lo que trato de hacer para salvar el valor,
ro1= keypad_key_press()// introducido por el teclado y poder
end if // hacer algunas operaciones artimeticas para despues mostrarlas otra vez
if curX=2 then //por la lcd, mas o menos a una calculadora!
ro2=kp
end if
if curX=3 then
lcd_cmd(_LCD_MOVE_CURSOR_RIGHT)
ro3=kp
end if
wend
generar:
El problema está en que con eso no puedo obtener el valor real que esta entrando y me sale cualquier disparate cuando trato de mostrar el valor.
Si me pudiesen ayudar, se los agradezco. Bless.
-
No programo en MikroBasic, pero sí en PSI y creo que lo que quieres es que tu variable tome en el programa, el valor del teclado; es decir, que si pones un 1 tome 1, un 9 etc. Para esto lo más sencillo es la clásica tabla de IF, te dejo un extracto de un viejo código que usé para estos fines:
lectura:
boton = 0
col1 = 1
If fila1 = 1 Then boton = 1
If fila2 = 1 Then boton = 4
If fila3 = 1 Then boton = 7
If fila4 = 1 Then boton = 16
col1 = 0
col2 = 1
If fila1 = 1 Then boton = 2
If fila2 = 1 Then boton = 5
If fila3 = 1 Then boton = 8
If fila4 = 1 Then boton = 10
col2 = 0
col3 = 1
If fila1 = 1 Then boton = 3
If fila2 = 1 Then boton = 6
If fila3 = 1 Then boton = 9
If fila4 = 1 Then boton = 15
col3 = 0
col4 = 1
If fila1 = 1 Then boton = 11
If fila2 = 1 Then boton = 12
If fila3 = 1 Then boton = 13
If fila4 = 1 Then boton = 14
col4 = 0
Return
Es básicamente el barrido en cada columna, seguido de cada fila, para saber qué botón fue presionado. A partir de ahí, ya sabrás tú qué haces con la variable.