| ??? 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 */ |
| Topic | Author | Date |
| 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 |



