- 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