Buscar este blog

jueves, 27 de noviembre de 2014

INTERFAZ CON TECLADO AT-PS2 CON SPARTAN-3AN


  • Por la red existe una vasta información acerca del teclado at-ps2 y su forma de comunicarse con microcontroladores.


  • En el siguiente link se encuentra un documento donde se explica de manera detallada  todo acerca del teclado at-ps2 y su estándar de comunicación:



  • La conexión con la tarjeta spartan-3AN es la siguiente:


  • teclado.hch


interface bus_clock_in(unsigned 1 clk)  PS2_Clk() with {data = {"W12"}};
interface bus_clock_in(unsigned 1 data) PS2_Data() with {data = {"V11"}};

void decode(char sc);

static char unshifted[67][2] = {
0x0d,9,
0x0e,' ',
0x15,'q',
0x16,'1',
0x1a,'z',
0x1b,'s',
0x1c,'a',
0x1d,'w',
0x1e,'2',
0x21,'c',
0x22,'x',
0x23,'d',
0x24,'e',
0x25,'4',
0x26,'3',
0x29,' ',
0x2a,'v',
0x2b,'f',
0x2c,'t',
0x2d,'r',
0x2e,'5',
0x31,'n',
0x32,'b',
0x33,'h',
0x34,'g',
0x35,'y',
0x36,'6',
0x39,',',
0x3a,'m',
0x3b,'j',
0x3c,'u',
0x3d,'7',
0x3e,'8',
0x41,',',
0x42,'k',
0x43,'i',
0x44,'o',
0x45,'0',
0x46,'9',
0x49,'.',
0x4a,'-',
0x4b,'l',
0x4c,' ',
0x4d,'p',
//0x4e,''',
0x52,' ',
0x54,'`',
0x55,' ',
0x5a,13,
0x5b,'+',
0x5d,' ',
0x61,'<',
0x66,8,
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9',
0,0
};

static char shifted[68][2] = {
0x0d,9,
0x0e,' ',
0x15,'Q',
0x16,'!',
0x1a,'Z',
0x1b,'S',
0x1c,'A',
0x1d,'W',
0x1e,'"',
0x21,'C',
0x22,'X',
0x23,'D',
0x24,'E',
0x25,'$',
0x26,' ',
0x29,' ',
0x2a,'V',
0x2b,'F',
0x2c,'T',
0x2d,'R',
0x2e,'%',
0x31,'N',
0x32,'B',
0x33,'H',
0x34,'G',
0x35,'Y',
0x36,'&',
0x39,'L',
0x3a,'M',
0x3b,'J',
0x3c,'U',
0x3d,'/',
0x3e,'(',
0x41,';',
0x42,'K',
0x43,'I',
0x44,'O',
0x45,'=',
0x46,')',
0x49,':',
0x4a,'_',
0x4b,'L',
0x4c,' ',
0x4d,'P',
0x4e,'?',
0x52,' ',
0x54,'^',
0x55,' ',
0x5a,13,
0x5b,'*',
0x5d,' ',
0x61,'>',
0x66,8,
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9',
0,0
};

void init_teclado(void)
{
   unsigned 1 flag_1,flag_0;
   unsigned 8 bitcount;
   unsigned 8 data;
                        data=0;
                        bitcount=11;
   flag_1=1;
   flag_0=0;

   while(1)
   {
      if(~PS2_Clk.clk && flag_1) //ext_int_edge(H_TO_L);
      {
                                                if(bitcount < 11 && bitcount > 2)
                                                {
                        data = (data >> 1);
                        if( PS2_Data.data == 1)
                                                data = data | 0x80;
                                                }
        --bitcount;
                                                if(bitcount == 0)
                                                {
                        decode((char)data);
                        data = 0;
                        bitcount = 11;
                                                }
                                                flag_1=0;
                                                flag_0=1;
      }
      else if(PS2_Clk.clk && flag_0)
      {
          flag_1=1;
                                                  flag_0=0;
      }
                          else
                             delay;
   }  
}

void decode(char sc)
{
   static unsigned 1 is_up=0,shift=0;
   unsigned 7 i;                              

   //is_up=0;
   //shift = 0;
  
   //-------- El ltimo dato recibido fue el identificador de Up-Key
   if (!is_up)
      {
         switch (sc)
            {
            //-------- Identificador de Up-Key
               case 0xF0 :
                  is_up = 1;
                  break;
               //-------- SHIFT Izquierdo
               case 0x12 :
                  shift = 1;
                  break;
               //-------- SHIFT Derecho
               case 0x59 :
                  shift = 1;
                   lcd_gotoxy(1,1);
                  break;
               //-------- ENTER
               case 0x5A :
                  //printf("\n\r");
                    lcd_gotoxy(1,2);
                    break;
               default:
                  if(!shift)
                     {
                        for(i = 0; i<=67; i++)
                        {
                           if (unshifted[i][0] == sc)
                           {
                              //printf("%c", unshifted[i][1]);
                                lcd_putc(unshifted[i][1]);
                           }
                        }
                     }
                  else
                    {
                        for(i = 0; i<=68; i++)
                        {
                           if (shifted[i][0] == sc)
                           {
                               //printf("%c", shifted[i][1]);
                                 lcd_putc(shifted[i][1]);
                           }
                        }
                     }
                 break;
            }
     }
     else
         {
         //-------- No se permiten 2 0xF0 en una fila
         is_up = 0;
         switch (sc)
            {
               //-------- SHIFT Izquierdo
               case 0x12 :
                  shift = 0;
                  break;
               //-------- SHIFT Derecho
               case 0x59 :
                  shift = 0;
                  break;
            }
         }
}



  • El driver fue elaborado en DK Design Suite en Handel-C :



  • La síntesis fue hecha con SynplifyPro y la implementacion con ISE:


  • La programación del FPGA a través de iMPACT:


  • Resultados:






No hay comentarios.:

Publicar un comentario