Autor Tema: SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS  (Leído 2591 veces)

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

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS
« en: 20 de Junio de 2018, 19:05:48 »
Hola a todos, nose si alguien me puede ayudar, quiero que aparezcan en el LCD las teclas que presione ejemplo: *Presiono 1*  LCD: 1  *Presiono 2*  LCD: 12 .............................. Sólo me sale *Presiono 1* LCD:1,   *Presiono 2* LCD:2
GRACIAS...


#include <16f877a.h>
#fuses xt
#use delay(clock=4M)
#byte trisb=0x86
#byte portb=0x06
#include <lcd.c>
#include <kbd.c>
#bit C1=portb.0
#bit C2=portb.1
#bit C3=portb.2
#bit C4=portb.3
#bit F1=portb.4
#bit F2=portb.5
#bit F3=portb.6
#bit F4=portb.7
int TECLA;

void buscar(){

C1=1;
delay_ms(10);
if(F1==1){TECLA=7;}
if(F2==1){TECLA=4;}
if(F3==1){TECLA=1;}
if(F4==1){TECLA="A";}
C1=0;

C2=1;
delay_ms(10);
if(F1==1){TECLA=8;}
if(F2==1){TECLA=5;}
if(F3==1){TECLA=2;}
if(F4==1){TECLA=0;}
C2=0;

C3=1;
delay_ms(10);
if(F1==1){TECLA=9;}
if(F2==1){TECLA=6;}
if(F3==1){TECLA=3;}
if(F4==1){TECLA="=";}
C3=0;

C4=1;
delay_ms(10);
if(F1==1){TECLA="/";}
if(F2==1){TECLA="X";}
if(F3==1){TECLA="-";}
if(F4==1){TECLA="+";}
C4=0;

}

void main(){

trisb=0b11110000;
portb=0;
lcd_init();

while(true){

 buscar();
 lcd_gotoxy(1,1);
 printf(lcd_putc,"%02u", TECLA);

 if(TECLA==65|| TECLA==61 || TECLA==47 || TECLA==88 || TECLA==45 || TECLA==43){

 lcd_gotoxy(1,1);
 printf(lcd_putc,"TECLA: %02c", TECLA);
 }
 delay_ms(100);
 }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS
« Respuesta #1 en: 20 de Junio de 2018, 19:46:27 »
Primero que nada, no repitas los mensajes en varios foros, va en contra de las reglas.

Tu problema esta en que usas muy seguido:

lcd_gotoxy(1,1);

Si vos "buscas" una letra, la escribis con el printf, y repetis lo mismo vas a verlo como vos queres.

Pero al ejecutarse nuevamente esa instruccion, le decis que vuelva a escribir en la primera posicion. Esa funcion (lcd_gotoxy) mueve el cursor del LCD desde donde va a empezar a escribir.
Vos le decis, posicionate en la primera fila, primera columna, escribis el valor, si escribis otro valor, lo va a realizar en la segunda columna.
Pero nuevamente le decis que se posicione en la primer columna, y cuando escribis, terminas sobreescribiendo el valor que tenias.

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS
« Respuesta #2 en: 20 de Junio de 2018, 22:02:25 »
Igual si le quito el gotoxy se llena toda la pantalla automaticamente sin presionar nada, o deberia meter un contador ? .. gotoxy(i,1)?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS
« Respuesta #3 en: 20 de Junio de 2018, 22:35:28 »
Igual si le quito el gotoxy se llena toda la pantalla automaticamente sin presionar nada, o deberia meter un contador ? .. gotoxy(i,1)?

Entonces tu programa esta mal, en tu while, cada 100ms estas enviando un caracter por mas que no presiones nada. Proba esto:

Código: C
  1. int tecla,teclaAnterior;
  2.  
  3. void buscar(){
  4.  
  5.     //En caso que no se presione nada, quede 0xFF
  6.     tecla = 0xFF;
  7.  
  8.         C1=1;
  9.         delay_ms(10);
  10.         if(F1==1){TECLA=7;}
  11.         if(F2==1){TECLA=4;}
  12.         if(F3==1){TECLA=1;}
  13.         if(F4==1){TECLA='A';}
  14.         C1=0;
  15.  
  16.         C2=1;
  17.         delay_ms(10);
  18.         if(F1==1){TECLA=8;}
  19.         if(F2==1){TECLA=5;}
  20.         if(F3==1){TECLA=2;}
  21.         if(F4==1){TECLA=0;}
  22.         C2=0;
  23.  
  24.         C3=1;
  25.         delay_ms(10);
  26.         if(F1==1){TECLA=9;}
  27.         if(F2==1){TECLA=6;}
  28.         if(F3==1){TECLA=3;}
  29.         if(F4==1){TECLA='=';}
  30.         C3=0;
  31.  
  32.         C4=1;
  33.         delay_ms(10);
  34.         if(F1==1){TECLA='/';}
  35.         if(F2==1){TECLA='X';}
  36.         if(F3==1){TECLA='-';}
  37.         if(F4==1){TECLA='+';}
  38.         C4=0;
  39.  
  40. }
  41.  
  42. void main(){
  43.  
  44.         trisb=0b11110000;
  45.         portb=0;
  46.         lcd_init();
  47.  
  48.         lcd_gotoxy(1,1);
  49.  
  50.         while(true){
  51.  
  52.  
  53.                 buscar();
  54.                 if((tecla != teclaAnterior) && (tecla != 0xFF))
  55.                 {
  56.                         printf(lcd_putc,"%02u", TECLA);
  57.                         teclaAnterior = tecla
  58.                 }
  59.                 delay_ms(100);
  60.         }
  61. }

Lo otro a tener en cuenta es que una letra es 'A' con comillas simples, mientras que un STRING ( el cual le agrega un 0x00 al final) es con comillas dobles "A" = { 'A', 0x00 }

Desconectado elektronik29

  • PIC10
  • *
  • Mensajes: 18
Re:SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS
« Respuesta #4 en: 21 de Junio de 2018, 01:16:50 »
genial, pero no puedo repetir el mismo numero anterior!
se que es en tecla!=teclaAnterior! cualuqier cosa te aviso como va, gracias por la ayuda ! (aun no finaliza)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:SOLO ME SALE UN VALOR DE TECLA DEL TECLADO MATRICIAL | CCS
« Respuesta #5 en: 21 de Junio de 2018, 08:52:55 »
genial, pero no puedo repetir el mismo numero anterior!
se que es en tecla!=teclaAnterior! cualuqier cosa te aviso como va, gracias por la ayuda ! (aun no finaliza)

Si perdon, un error de codigo, lo hice y no lo probe, la idea es que a pesar que el while se ejecute casi 10 veces por segundo, si tenes presionado la misma tecla, o si no tenes presionada ninguna tecla, no entre al if que imprime.

La idea detras es que si soltas la tecla y volves a presionar la misma, funcione.

Vas a tener que modificar un poco el if... podrias separar las condiciones, si tecla!=tecla anterior entra al if, y luego dentro preguntas si es distinto a 0xFF, si lo es imprimis y cerras el if, luego haces la igualdad de tecla y teclaanterior y cerras el otro if.

Código: C
  1. if(tecla != teclaAnterior)
  2.                 {
  3.                    if(tecla != 0xFF)
  4.                   {
  5.                         printf(lcd_putc,"%02u", TECLA);
  6.                   }
  7.                   teclaAnterior = tecla;
  8.                 }
« Última modificación: 21 de Junio de 2018, 08:55:29 por KILLERJC »


 

anything