Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
05/15/03 20:53
Read: times


 
#45574 - RE: how to.....(pc keyboard)
Responding to: ???'s previous message
Sorry for my poor English!

I send you this C51 code using the KEIL Compiler for your help.

(spanish commented, I'm sorry)

#include <stdio.h> /* Definiciones SFRs y bits del 552 */
#include <reg552.h> /* Definiciones SFRs y bits del 552 */
#include <typedefs.h> /* Prototipos y definiciones comunes */

/********** Asignación de los hilos DATA y CLK del teclado *********/
sbit DATA = P1^3; /* Define el hilo DATA como CT3I = P1.3 */
sbit CLK = P1^2; /* Define el hilo CLK como CT2I = P1.2 */

UCHAR KB_CONT, KB_REG, KB_KEY, ALT_VALOR;
UCHAR bdata KB_FLAG; /* Direccionable como bit o como byte */
sbit TECLA = KB_FLAG^0;
sbit SHIFT = KB_FLAG^1;
sbit ALT = KB_FLAG^2;
sbit LIBRE = KB_FLAG^3;
sbit CTRL = KB_FLAG^4;

/**********************************************************************
7 6 5 4 3 2 1 0
_____________________________________________________________
| -- | -- | -- | Ctrl | Libre | Alt | Shift | Tecla | KB_FLAG
-------------------------------------------------------------
Ctrl = 1, se encuentra pulsada la tecla CTRL izqda o CTRL drcha
Libre = 1, tecla liberada (Se acaba de leer el prefijo 0xf0)
Alt = 1, se encuentra pulsada la tecla ALT
Shift = 1, se encuentra pulsada la tecla SHIFT izqda o SHIFT drcha
Tecla = 1, se ha leído una tecla y se ha dejado en KB_KEY
**********************************************************************/


UCHAR kb_out(UCHAR car)
{
UCHAR timeout, j;
bit paridad;
ECT2 = 0; /* Enmascara interrupción de Captura de T2 en reg2 */
/* para no recibir los caracteres enviados al teclado */
DATA = 0; /* DATA = 0, para enviar datos al teclado */
ACC = car;
paridad = P; /* El bit paridad contiene: 0 = PAR (1 = IMPAR) */
for(j=4;j!=0;j--)
{
for(timeout=1; (CLK == 1)&&(timeout != 0);timeout++)
; /* Espera hasta que la línea CLK == 0, o al timeout */
if(CLK == 0) /* El teclado ha bajado la línea CLK. */
break;
}
for(j=10;j!=0;j--)
{
for(timeout=1; (CLK == 1)&&(timeout != 0);timeout++)
; /* Espera hasta que la línea CLK == 0, o al timeout */
if(timeout == 0) /* Error de timeout. */
break;
switch(j)
{
case 1: /* Si último bit, j == 1 */
DATA = 1; /* liberar la línea de DATOS */
break;
case 2: /* Si penúltimo bit, j== 2 */
DATA = ~paridad; /* enviar bit de paridad impar */
break;
default: ; /* En cualquier otro caso */
DATA = (car & 1); /* Sacar el bit 0 de car */
car >>=1; /* Desplazar car un lugar a la drcha */
break;
}
for(timeout=1; (CLK == 0)&&(timeout != 0);timeout++)
; /* Espera hasta que la línea CLK == 1, o al timeout */
if(timeout == 0) /* Error de timeout. */
break;
}
DATA = 1; /* P1.3 = DATA = 1, o modo entrada */
if(timeout == 0) /* Error de timeout */
{
CTI2 = 0; /* Borra el flag de interrupción */
ECT2 = 1; /* Desenmascara interrupción de Captura de T2 en reg2 */
KB_CONT = 11;
return(2);
}
for(timeout=1; (CLK == 1)&&(timeout != 0);timeout++)
; /* Espera hasta que la línea CLK == 0, o al timeout */
CTI2 = 0; /* Borra el flag de interrupción */
ECT2 = 1; /* Desenmascara interrupción de Captura de T2 en reg2 */
KB_CONT = 11;
if(timeout == 0) /* Error de timeout. */
{
return(2);
}
return(DATA==1? 1:0 ); /* Retorna 0 si bit validado */
/* o 1 en caso contrario */
}/* FIN DE kb_out */

/******************************************************************
El teclado de un ordenador personal en modo AT, transmite un octeto
en serie utilizando 11 pulsos de reloj. En estos 11 pulsos el teclado
envía: el bit de start (0), D0, D1, D2, D3, D4, D5, D6, D7, un bit de
Paridad impar, y un bit de stop (1). Para atender al teclado con el
mínimo de atención por parte del 552 se conecta la línea de RELOJ del
teclado a la interrupción INT4. Después de 11 interrupciones se tiene
el código de scan que envía el ordenador al pulsar o soltar una tecla.
******************************************************************/


UCHAR code KB_TABLA[(128-8)*2] = {
# if 0 /* Se pueden eliminar estas 7 primeras filas y la última 0x7f */
0, 0 , /* 0 Código de scan no existente */
0, 0 , /* 1 Código de scan no existente */
0, 0 , /* 2 Código de scan no existente */
0, 0 , /* 3 Código de scan no existente */
0, 0 , /* 4 Código de scan no existente */
0, 0 , /* 5 Código de scan no existente */
0, 0 , /* 6 Código de scan no existente */
#endif
'á','ä', /* 7 Tecla F1 cambiada a áä */
27, 27 , /* 8 Tecla Escape */
0, 0 , /* 9 Código de scan no existente */
0, 0 , /* a Código de scan no existente */
0, 0 , /* b Código de scan no existente */
0, 0 , /* c Código de scan no existente */
9, 9 , /* d Tecla Tab */
'º','ª', /* e Tecla º ª */
'é','ë', /* f Tecla F2 cambiada a éë */
0, 0 , /* 10 Código de scan no existente */
0, 0 , /* 11 Tecla Ctrl Izquierda */
0, 0 , /* 12 Tecla Shift Izquierda */
'<','>', /* 13 Tecla <> */
0, 0 , /* 14 Tecla Bloqueo Mayúsculas */
'q','Q', /* 15 Tecla q */
'1','!', /* 16 Tecla 1 */
'í','ï', /* 17 Tecla F3 cambiada a íï */
0, 0 , /* 18 Código de scan no existente */
0, 0 , /* 19 Tecla ALT */
'z','Z', /* 1a Tecla z */
's','S', /* 1b Tecla s */
'a','A', /* 1c Tecla a */
'w','W', /* 1d Tecla w */
'2','"', /* 1e Tecla 2 */
'ó','ö', /* 1f Tecla F4 cambiada a óö */
0, 0 , /* 20 Código de scan no existente */
'c','C', /* 21 Tecla c */
'x','X', /* 22 Tecla x */
'd','D', /* 23 Tecla d */
'e','E', /* 24 Tecla e */
'4','$', /* 25 Tecla 4 */
'3','·', /* 26 Tecla 3 y "·" (0xfa) */
'ú','ü', /* 27 Tecla F5 cambiada a úü */
0, 0 , /* 28 Código de scan no existente */
' ',' ', /* 29 Tecla Espacio */
'v','V', /* 2a Tecla v */
'f','F', /* 2b Tecla f */
't','T', /* 2c Tecla t */
'r','R', /* 2d Tecla r */
'5','%', /* 2e Tecla 5 */
'@','#', /* 2f Tecla F6 cambiada a @# */
0, 0 , /* 30 Código de scan no existente */
'n','N', /* 31 Tecla n */
'b','B', /* 32 Tecla b */
'h','H', /* 33 Tecla h */
'g','G', /* 34 Tecla g */
'y','Y', /* 35 Tecla y */
'6','&', /* 36 Tecla 6 */
0, 0 , /* 37 Tecla F7 */
0, 0 , /* 38 Código de scan no existente */
0, 0 , /* 39 Alt Gr */
'm','M', /* 3a Tecla m */
'j','J', /* 3b Tecla j */
'u','U', /* 3c Tecla u */
'7','/', /* 3d Tecla 7 */
'8','(', /* 3e Tecla 8 */
0, 0 , /* 3f Tecla F8 */
0, 0 , /* 40 Código de scan no existente */
',',';', /* 41 Tecla , */
'k','K', /* 42 Tecla k */
'i','I', /* 43 Tecla i */
'o','O', /* 44 Tecla o */
'0','=', /* 45 Tecla 0 */
'9',')', /* 46 Tecla 9 */
0, 0 , /* 47 Tecla F9 */
0, 0 , /* 48 Código de scan no existente */
'.',':', /* 49 Tecla . */
'-','_', /* 4a Tecla - */
'l','L', /* 4b Tecla l */
'ñ','Ñ', /* 4c Tecla ñ */
'p','P', /* 4d Tecla p */
39, '?', /* 4e Tecla ' ? */
0, 0 , /* 4f Tecla F10 */
0, 0 , /* 50 Código de scan no existente */
0, 0 , /* 51 Código de scan no existente */
'{','}', /* 52 Tecla de acentos cambiada a {} */
'ç','Ç', /* 53 Tecla ç */
'[',']', /* 54 Tecla `^[ cambiada a [] */
'¡','¿', /* 55 Tecla ¡ ¿ */
0, 0 , /* 56 Tecla F11 */
0, 0 , /* 57 Tecla Imp Pant */
0, 0 , /* 58 Tecla Ctrl derecha */
0, 0 , /* 59 Tecla Shift derecha */
13, 13 , /* 5a Tecla Intro */
'+','*', /* 5b Tecla + */
0, 0 , /* 5c Código de scan no existente */
0, 0 , /* 5d Código de scan no existente */
0, 0 , /* 5e Tecla F12 */
0, 0 , /* 5f Tecla Bloqueo Desplazamiento */
0, 0 , /* 60 Tecla Flecha Abajo */
0, 0 , /* 61 Tecla Flecha Izquierda */
0, 0 , /* 62 Tecla Pause */
0, 0 , /* 63 Tecla Flecha Arriba */
0, 0 , /* 64 Tecla Suprimir */
0, 0 , /* 65 Tecla Fin */
8, 8 , /* 66 Tecla Retroceso (Backspace) */
0, 0 , /* 67 Tecla Insert */
0, 0 , /* 68 Código de scan no existente */
'1','1', /* 69 Tecla 1 Fin */
0, 0 , /* 6a Tecla Flecha Derecha */
'4','4', /* 6b Tecla 4 Flecha Izquierda */
'7','7', /* 6c Tecla 7 Inicio */
0, 0 , /* 6d Tecla Avance Página */
0, 0 , /* 6e Tecla Inicio */
0, 0 , /* 6f Tecla Retroceso Página */
'0','0', /* 70 Tecla 0 Insertar */
'.','.', /* 71 Tecla . Suprimir */
'2','2', /* 72 Tecla 2 Flecha Abajo */
'5','5', /* 73 Tecla 5 */
'6','6', /* 74 Tecla 6 Flecha Derecha */
'8','8', /* 75 Tecla 8 Flecha Arriba */
0, 0 , /* 76 Tecla Bloqueo Numérico */
'/','/', /* 77 Tecla / */
0, 0 , /* 78 Código de scan no existente */
13, 13 , /* 79 Tecla Intro */
'3','3', /* 7a Tecla 3 Avance Página */
0, 0 , /* 7b Código de scan no existente */
'+','+', /* 7c Tecla + */
'9','9', /* 7d Tecla 9 Retroceso Página */
'*','*', /* 7e Tecla * */
/* 0, 0 , 7f Código de scan no existente (ANULADO)*/
/* '-','-', */ /* 84 Tecla - */
};

UCHAR getch(void)
{
UCHAR uc;
while(TECLA == 0)
; /* Si no hay tecla pulsada, esperar hasta que se pulse */
uc = KB_KEY;
TECLA = 0; /* Indica tecla leída */
return(uc);
}/* FIN DE getch */

void init_kb_at(void)
{
DATA = 1; /* Patilla CT3I = P1.3 = DATA, en modo entrada */
CLK = 1; /* Patilla CT2I = P1.2 = CLK, en modo entrada */
CTCON |= 0x20; /* CTN2 = 1 Interrup en los flancos de bajada de P1.2 */
KB_CONT = 11; /* Número de interrupciones por octeto en teclado AT. */
KB_FLAG = 0; /* Estado inicial de los flags de teclado */
CTI2 = 0; /* Borra el flag de interrupción (Seguridad) */
ECT2 = 1; /* Desenmascara interrupción de Captura de T2 en reg2 */
EA = 1; /* Habilita todas las interrupciones desenmascaradas. */
kb_out(0xed); /* Leds 0000.0MND Mayús, Númer, Despl */
getch(); /* Esperar la respuesta del teclado */
kb_out(0x02); /* Activar Led de bloqueo numérico */
getch(); /* Esperar la respuesta del teclado */
kb_out(0xf0); /* Select scan code */
getch(); /* Esperar la respuesta del teclado */
kb_out(0x3); /* Select scan code 3 */
getch(); /* Esperar la respuesta del teclado */
}/* FIN DE init_kb_at */

void uartInit(void)
{
PCON |= 0x80; /* SMOD = 1 */
S0CON = 0x52; /* Uart 8 bits vel variable, REN = 1, TI = 1 */
TMOD &= 0xf;
TMOD |= 0x20; /* T&C1, como timer, modo autorecarga 8 bits */
TH1 = -3; /* 19.200 baudios */
TR1 = 1; /* Timer 1 corriendo */
}/* FIN DE uartInit */

UCHAR uartSend(UCHAR uc)
{
while(TI == 0)
; /* Espera a que el carácter anterior haya salido */
TI = 0;
S0BUF = uc;
return uc;
}/* FIN DE uartSend */

void main(void)
{
init_kb_at(); /* Inicializa el teclado del PC */
uartInit(); /* Inicia la Uart */
while(1) /* Repetir indefinidamente */
{
uartSend(getch()); /* envía char recibido, por el puerto serie */
}
}/* FIN DE main */


void int_kb_at() interrupt 8 using 0 /* 8 = Interrupción T2 capture 2 */
{
/* UCHAR scan_code, temp; */
KB_CONT--;
if(KB_CONT > 1)
{
KB_REG >>= 1; /* Desplazar el dato hacia la derecha */
if(DATA == 1) /* y si el hilo DATA vale 1, poner un */
KB_REG |= 0x80; /* 1 en el bit 7 de KB_REG. */
}
/* No se hace el tratamiento del bit de paridad */
if(KB_CONT == 0) /* Si se ha recibido un código de scan */
{
CLK = 0; /* P1.2 = CLK = 0 Deshabilitar teclado */
KB_CONT = 11; /* Nº de interrupciones por dato en teclado AT. */

switch(KB_REG)
{
case 0xf0:
LIBRE = 1; /* Activar el flag de tecla liberada */
break;
case 0x84: /* Tecla - en teclado numérico */
KB_KEY = '-';
TECLA = 1; /* Activa el flag de tecla disponible */
break;
case 0x14: /* Bloqueo mayúsculas */
if(LIBRE == 1) /* Si se ha liberado esta tecla */
{
SHIFT = !SHIFT; /* Complementar el flag shift */
LIBRE = 0; /* Desactiva el flag de tecla liberada */
}
break;
case 0x12: /* Shift izquierda */
case 0x59: /* Shift derecha */
if(LIBRE == 1) /* Si se ha liberado una tecla shift */
{
SHIFT = 0; /* Borrar el flag shift */
LIBRE = 0; /* Desactiva el flag de tecla liberada */
}
else
SHIFT = 1; /* Activar el flag shift */
break;
case 0x11: /* Ctrl izquierda */
/* case 0x58: Ctrl derecha, eliminado por dar código sólo al pulsar */
if(LIBRE == 1) /* Si se ha liberado la tecla Ctrl */
{
CTRL = 0; /* Borrar el flag ctrl */
LIBRE = 0; /* Desactiva el flag de tecla liberada */
}
else
CTRL = 1; /* Activar el flag ctrl */
break;
case 0x19: /* Tecla Alt */
if(LIBRE == 1) /* Si se ha liberado una tecla Alt */
{
ALT = 0; /* Borrar el flag Alt */
LIBRE = 0; /* Desactiva el flag de tecla liberada */
if(ALT_VALOR != 0)
{
KB_KEY = ALT_VALOR;
TECLA = 1; /* Activa el flag de tecla disponible */
}
}
else
{
ALT = 1; /* Activar el flag Alt */
ALT_VALOR = 0;
}
break;

default:
if(LIBRE == 0) /* Si no se ha liberado tecla */
{
KB_REG += -7; /* Para reducir la tabla en 14 */
KB_REG <<= 1; /* Multiplica por 2 el código de scan */
if(SHIFT == 1) /* Si está activado el flag shift */
KB_REG++; /* apunta al siguiente (Código shift) */
KB_KEY = KB_TABLA[KB_REG]; /* Traduce desde tabla */
if(ALT == 1) /* Si está activado el flag Alt */
{
if((KB_KEY >= '0')&&(KB_KEY <= '9'))
{
KB_KEY &= 0x0f; /* Conversión ASCII -> BIN */
ALT_VALOR = ALT_VALOR * 10 + KB_KEY;
}
else
ALT_VALOR = 0;
break;
}
if(CTRL == 1) /* Si está activado el flag ctrl */
KB_KEY &= 0x1f; /* reduce a código de control */
if(KB_KEY != 0)
TECLA = 1; /* Activa el flag de tecla disponible */
}
else
LIBRE = 0; /* Desactiva el flag de tecla liberada */
break;
}
CLK = 1; /* P1.2 = CLK = 1 Habilita el teclado */
}
CTI2 = 0; /* Borra el flag de interrupción */
}/* FIN DE int_kb_at */



List of 16 messages in thread
TopicAuthorDate
how to.....(pc keyboard)            01/01/70 00:00      
   RE: how to.....(pc keyboard)            01/01/70 00:00      
      RE: how to.....(pc keyboard)            01/01/70 00:00      
         RE: how to.....(pc keyboard)            01/01/70 00:00      
            RE: how to.....(pc keyboard)            01/01/70 00:00      
      RE: how to.....(pc keyboard)            01/01/70 00:00      
         RE: how to.....(pc keyboard)            01/01/70 00:00      
   RE: how to.....(pc keyboard)            01/01/70 00:00      
   RE: how to.....(pc keyboard)            01/01/70 00:00      
      Dave Nelson            01/01/70 00:00      
         RE: Donald            01/01/70 00:00      
         RE: Dave Nelson            01/01/70 00:00      
            RE: Dave Nelson            01/01/70 00:00      
   RE: how to.....(pc keyboard)            01/01/70 00:00      
   RE: how to.....(pc keyboard)            01/01/70 00:00      
   RE: how to.....(pc keyboard)            01/01/70 00:00      

Back to Subject List