Autor Tema: ayuda con teclado de celular con teclado 3x4 en ccs y con pic 16f877  (Leído 3539 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado rleal

  • PIC10
  • *
  • Mensajes: 3
ayuda con teclado de celular con teclado 3x4 en ccs y con pic 16f877
« en: 09 de Septiembre de 2010, 05:48:00 »
porfavor necesito ayuda para poder terminar este programa.

en si el postulado del problema es este:

supone un teclado con los numeros y los caracteres del afabeto occidental, lo que se va escribiendo por el teclado aparece por pantalla como si fuera un teclado de celular. si por ejemplo se mantiene presionado por un segundo la tecla 1, aparece el numero 1, si se presiona por 2 segundos, aparece la letra A, si es tres segundos la letra B y si es cuatro segundos la letra C.

la cosa es que ya tengo la mayor parte del programa lo que pasa es que no he podido hacer es que mientras se mantenga presionado me balla aumentando a los distintos valores de la tecla.

este es el programa:
#include <16f877A.h>
#fuses XT, NOWDT
#use delay(clock=4M)




#include <lcd.c>
#include <kbd2.c>
const char num1[]={"1=#"};
const char num2[]={"ABC2"};
const char num3[]={"DEF3"};
const char num4[]={"GHI4"};
const char num5[]={"JKL5"};
const char num6[]={"MNÑO6"};
const char num7[]={"PQRS7"};
const char num8[]={"TUV8"};
const char num9[]={"WXYZ9"};
const char num0[]={" +.¿?"};



int8 i;
char c;
int8 posicion;
char tecla;
int8 scan;
void main()



{
   lcd_init();



 
lcd_putc("lcd ok");
delay_ms (1000);
lcd_putc("\f");
posicion=0;

inicio:

posicion++;
i=0;
captura:
do{
         c=kbd_getc();
       
        }       
     
   while (c==0);{
   tecla=c;
   
  numero:
 if (tecla =='1'){
      if (i>=3){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num1);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car1;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car1:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     
 
 
  if (tecla =='2'){
      if (i>=4){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num2);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car2;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car2:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     
     
 
  if (tecla =='3'){
      if (i>=3){
      i=0;
      }
      lcd_gotoxy(posicion,1);
      lcd_putc(num3);
      delay_ms (500);
      scan=0;
      for (scan=0;scan<=200;scan++)
      {
     
       delay_ms (5);
      c=kbd_getc();
     
      if (c!=0){
      goto car3;
      }
       
     
      }
       
     
      if (c==0){
      goto inicio;
      }
     
 car3:
      if (c==tecla){
      i++;
      goto numero;
      }   
      if (c!=tecla){
      i=0;
      tecla=c;
     posicion++;
     goto numero;
      }
     
     
     


if (tecla =='4'){
      if (i>=4){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num4);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car4;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car4:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     
 if (tecla =='5'){
      if (i>=4){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num5);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car5;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car5:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     
if (tecla =='6'){
      if (i>=5){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num6);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car6;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car6:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     
if (tecla =='7'){
      if (i>=5){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num7);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car7;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car7:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     

if (tecla =='8'){
      if (i>=4){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num8);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car8;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car8:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     

if (tecla =='9'){
      if (i>=5){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num9);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car9;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car9:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     


if (tecla =='0'){
      if (i>=5){
      i=0;
      }
     
      lcd_gotoxy(posicion,1);
      lcd_putc(num0);
      delay_ms (500);
     scan=0;
   
     for (scan=0;scan<=200;scan++)
      {
       delay_ms (5);
      c=kbd_getc();
     
       if (c!=0){
      goto car0;
      }
     
      } 
     
      if (c==0){
      goto inicio;
      }
car0:
      if (c==tecla){
      i++;
      goto numero;
      }
       if (c!=tecla){
      i=0;
       tecla=c;
      posicion++;
      goto numero;
      }
 }     
if (tecla=='*'){
      if (posicion==1){
      goto inicio;
      }
posicion--;
goto captura;
}









}







}

este programa usa la libreria kbd2 para el teclado, y lo que hace este programa es que va cambiando a los distintos valores de la tecla al pulsarla varias veces. porfavor necesitoto ayuda con ideas para solucionar este problema.

gracias.


Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: ayuda con teclado de celular con teclado 3x4 en ccs y con pic 16f877
« Respuesta #1 en: 09 de Septiembre de 2010, 07:30:33 »
Buenos dias, yo en lo particular como ya tienes el teclado en el puerto B manejaria el teclado con interrupciones en ese puerto  y asi sabria cuando se presiono una tecla lo otro para saber el tiempo de cada tecla y tomar la decision de que caracte es seria usando el time del pic eso seria una solucion pero ahora tendrias que llevarlo a codigo en c que es como lo estas haciendo.

Saludos y espero tus comentarios y solucion.
Atten.
Alexander Santana.
Venezuela-Barcelona.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE


 

anything