Autor Tema: Teclado matricial 4x3 PIC18f4550 y 2 displays 7 segmentos  (Leído 4037 veces)

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

Desconectado ErBornas

  • PIC10
  • *
  • Mensajes: 2
Teclado matricial 4x3 PIC18f4550 y 2 displays 7 segmentos
« en: 09 de Mayo de 2016, 13:05:16 »
Hola a todos!

Soy nuevo en el tema de la programación C en los microcontroladores y me gustaría saber si me podéis ayudar en un problema que tengo con el teclado matricial 4x3. Llevo un tiempo peleándome por hacer funcionar el teclado en el PIC18f4550 pero no hay manera, he probado usando la librería KBD.C, pero no me a funcionado (almenos al simularlo en PROTEUS), por lo que he optado en desarrollar el programa por mi mismo, pero de momento no he conseguido tener éxito en que me funcione y ya nose que mas hacer, nose si es fallo de programación, de montaje en PROTEUS o ambos. Os dejo los archivos del programa (uso PIC C Compiler) y los archivos de PROTEUS.

Haber si hay alguien que me pueda ayudar o guiarme en donde tengo el fallo, muchas gracias de ante mano!

codigo c:

#INCLUDE <18F4550.H>
#fuses XT // XTPLL: Vamos a usar un cristal de 4.00Mhz.
#fuses CPUDIV1//USADO PARA 4MHZ, NO DIVIDE LA FRECUENCIA
#FUSES NOMCLR // NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
#FUSES PUT//ACTIVACACION DE BAJO VOLTAJE
#fuses NOWDT//No vamos a usar el perro guardian.
#fuses NOPROTECT //Memoria no protejida contra lecturas.
#fuses NOVREGEN // Habilita el regulador de 3.3 volts que usa el módulo USB, no lo usaremos por los momentos, se cambiará por NOVREGEN

#USE DELAY (CLOCK= 4000000)
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
#USE STANDARD_IO(C)
#USE STANDARD_IO(D)
#byte PORTC=0xf82
#byte TRISC=0xf94
void tecla(void);
CHAR K;
CHAR J;
int tiempo=5;
INT secuencia;
int aux;

Byte CONST DISPLAY[10]={0b1000000,0b1111001,0b0100100,0b0110000,0b0011001,0b0010010,0b0000011,0b1111000,0b0000000,0b0011000};
//Valores en binario de los numeros (0 a 9) que saldran por el display

VOID MAIN()
{
  SET_TRIS_C(0); //Configurar el puerto C como salida
  SET_TRIS_B(0x0f);   
   WHILE (TRUE)
   {
   tecla();    //Llamamos al bloque tecla
       
      IF(K=='*') // Valor del display 1 pasa al display 2      
         J=K;
      IF(K=='#') // Los dos displays pasan a 0
         K=0;
         J=0;

      output_d(0b01);// Display 1
      output_c(DISPLAY[K]);
      delay_ms(tiempo);
      output_d(0b10);// Display 2
      output_c(DISPLAY[J]);
      delay_ms(tiempo);

   }
}
//**********************TECLADO******************************
void tecla(){

 while(1){
   
   if(secuencia==0x80)
      secuencia=0x10;
  else secuencia=secuencia*2;
      output_b(secuencia);
      delay_ms(10);       //retardo de corrimiento
      aux=secuencia;

   if(input(pin_B1))
      aux=aux+2;
     else if(input(pin_B2))
        aux=aux+4;
         else if(input(pin_B3))
         aux=aux+8;   
   if(aux==secuencia)
   continue;
      else break;
}
   switch(aux){

      case 0x12:k='1';    break;
      case 0x14:k='2';    break;
      case 0x18:k='3';    break;
      case 0x22:k='4';    break;
      case 0x24:k='5';    break;
      case 0x28:k='6';    break;
      case 0x42:k='7';    break;
      case 0x44:k='8';    break;
      case 0x48:k='9';    break;
      case 0x82:k='*';    break;
      case 0x84:k='0';    break;
      case 0x88:k='#';    break;
 //  default:boton=' ';      break;
}
   }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Teclado matricial 4x3 PIC18f4550 y 2 displays 7 segmentos
« Respuesta #1 en: 09 de Mayo de 2016, 15:12:28 »
Si usas Standard_io , CCS cada ves que uses algun ouput o input va a cambiar los tris como el quiere, si queres definir los tris como vos queres (y estas haciendo ), usa FAST_IO.

Otra cosa, deberias tener unicamente 1 solo while(1) o while(true) en todo el programa,

Usa siempre el default en los switchs, para cuando no se cumple nada de lo que esperas.

Re acomode un poco las cosas, tal ves no quede igual que antes pero haber que tal queda:

Código: C
  1. void tecla(){
  2.  
  3.         secuencia = 0x10;
  4.         for ( aux = 0; secuencia >= 0x80; aux +=3)
  5.         {
  6.    
  7.                 output_b(secuencia);
  8.                 delay_ms(10);           //retardo de corrimiento
  9.  
  10.                 switch (input_b() & 0x0E)
  11.                 {
  12.                 case 0x02:
  13.                         //B1
  14.                         aux += 0;
  15.                         break;
  16.                 case 0x04:
  17.                         //B2
  18.                         aux += 1;
  19.                         break;
  20.                 case 0x08:
  21.                         //B3
  22.                         aux += 2;
  23.                         break;
  24.                 default:
  25.                         // Que no se presione nada y que detecte 2 teclas
  26.                         break;
  27.                 }
  28.  
  29.                 secuencia <<= 1;
  30.  
  31.         }
  32.  
  33.         switch(aux)
  34.         {
  35.  
  36.         case 0: k='1';    break;
  37.         case 1: k='2';    break;
  38.         case 2: k='3';    break;
  39.         case 3: k='4';    break;
  40.         case 4: k='5';    break;
  41.         case 5: k='6';    break;
  42.         case 6: k='7';    break;
  43.         case 7: k='8';    break;
  44.         case 8: k='9';    break;
  45.         case 9: k='*';    break;
  46.         case 10:k='0';    break;
  47.         case 11:k='#';    break;
  48.         default:k=' ';    break;
  49.         }
  50. }

Espero que funcione :P

Recorda pasarlos a FAST_IO!

Desconectado ErBornas

  • PIC10
  • *
  • Mensajes: 2
Re:Teclado matricial 4x3 PIC18f4550 y 2 displays 7 segmentos
« Respuesta #2 en: 19 de Mayo de 2016, 16:36:01 »
Siento no haberte respondido antes, pero estado un poco liado todos estos días.

Muchas gracias por contestarme, me a ido de maravilla la solución que me has dado, ara el teclado funciona, lo que tengo que retocar algo del programa para que me saque el numero que pulso en el teclado, pero muchas gracias de verdad!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Teclado matricial 4x3 PIC18f4550 y 2 displays 7 segmentos
« Respuesta #3 en: 19 de Mayo de 2016, 20:27:33 »
cambia :

Código: C
  1. void tecla(){

por

Código: C
  1. char tecla(){

Y al final de la funcion agrega:

Código: C
  1. return k;

Entonces en tu "main" haces:

Código: C
  1. char TeclaPresionada;
  2. TeclaPresionada = tecla();
  3. if ( TeclaPresionada != ' ')
  4. {
  5.       //Se presiono algo.
  6. }