Red de conocimiento informático - Material del sitio web - Cómo utilizar un microcontrolador para simular un teclado para controlar una computadora

Cómo utilizar un microcontrolador para simular un teclado para controlar una computadora

Principio del protocolo de interfaz

¿La interfaz del teclado PS/2 adopta un protocolo serie síncrono bidireccional, es decir, cada vez que se envía un pulso en la línea de reloj, se envía un bit de datos? se envía en la línea de datos? En la transmisión mutua, el host tiene control de bus, es decir, puede inhibir la transmisión del teclado en cualquier momento. El método es bajar la línea del reloj todo el tiempo y el teclado no puede generar el reloj. ¿Señales y envío de datos? En la transmisión en ambas direcciones, ¿las señales de reloj son todas generadas por el teclado, es decir, el host no genera señales de reloj de comunicación?

Si el host quiere enviar datos, debe controlarlo. ¿El teclado para generar señales de reloj? El método es el siguiente: el host primero baja la línea de reloj durante al menos 100 μs para inhibir la comunicación, luego baja la línea de datos y finalmente suelta la línea de reloj. ¿Señal a través de este tiempo? Cuando el teclado detecta este estado de tiempo, ¿generará una señal de reloj dentro de 10 ms? ¿El segmento de tiempo A en la Figura 3? ¿El tiempo de transmisión de las tramas de datos se muestra en la Figura 3? 2.2 Estructura del paquete de datos En el programa host, el pulso de reloj de cada bit de datos se utiliza para activar la interrupción, y el juicio y la recepción de los bits de datos se implementan en la rutina de interrupción Durante el proceso, mediante la programación adecuada. , ¿se pueden controlar y recibir correctamente los datos del teclado? Sin embargo, esta solución tiene algunas deficiencias. Dado que cada CLOCK genera una interrupción, ¿las interrupciones son frecuentes y requieren una gran cantidad de recursos del host?

/*-- ------------------------------------------------

Principio básico de aplicación del mouse de ps2

Nota: este programa utiliza el teclado estándar de PS2 para la entrada. Esta muestra es solo para pruebas.

El oscilador de cristal usa 12M o 11.0592M. Este teclado usa algunas letras y números para pruebas. No se pueden usar otras teclas. Los usuarios pueden expandirse por sí mismos. > Debido a los diversos parámetros de la placa de desarrollo y el programa, la verificación de paridad no se utiliza en el programa y no hay garantía de que no habrá errores de código. Agregue el programa de verificación usted mismo.

------------------------------------------- ----- ------*/

#include //Contiene el archivo de encabezado, que generalmente no necesita ser modificado. El archivo de encabezado contiene la definición de. el registro de función especial

sbit Key_Data = P3^3 //Definir pines del teclado

sbit Key_CLK = P3^2 //Usar interrupciones

bit BF; =0;

bit Shift; //Definir el indicador de tecla de cambio superior

bit Key_UP //Definir el código de acceso y el indicador de código de ruptura

unsigned char; KeyV;

char sin firmar IntNum;

char sin firmar DisNum;

/*----------------- ----------------- ----------------

La interrupción externa lee información

--------------- -----------------*/

void Keyboard_out(void) interrupción 0

{

if ((IntNum > 0) && (IntNum < 9))

{

KeyV = KeyV >> 1; / /Debido a que los datos del teclado son bajos>>altos, combinados con la oración anterior, se desplazan una posición hacia la derecha

if ( Key_Data)

KeyV = KeyV | 0x80; //Cuando la línea de datos del teclado es 1 cuando alcanza el bit más alto

}

IntNum++;

while (!Key_CLK); //Espera a que PS/2CLK suba alto

if (IntNum > 10)

{

IntNum = 0; //Después de 11 interrupciones, significa que se ha recibido un cuadro de datos y la variable se borra para prepararse para la siguiente recepción

BF = 1; se ha completado

EA = 0 //Apague la interrupción y espere hasta que se complete la visualización, luego active la interrupción

}

}

EA = 0; p>

/*----------------------------------------- -- ----

Información de decodificación

Nota: por ejemplo, SHIFT+G es 12H 34H F0H 34H F0H 12H

Es decir, el código de acceso de turno+ código de acceso G + código de interrupción de turno + código de interrupción G

------------------------------ ------------------*/

void Decode(ScanCode de caracteres sin firmar) //

{

unsigned char TempCyc,Val;

if (!Key_UP) //Cuando se presiona el teclado

{

s

witch (ScanCode)

{

case 0xF0 : // Cuando se recibe 0xF0, Key_UP se establece en 1 para indicar el comienzo del descifrado del código

Key_UP = 1;

break;

case 0x12 : // SHIFT izquierda

Shift = 1;

break;

case 0x59 : // SHIFT derecha

Shift = 1;

break;

predeterminado:

if(!Shift) //Si SHIFT no está presionado

{

for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //Visualización de la tabla

if (UnShifted[TempCyc][0] == ScanCode)

{

Val= UnShifted[TempCyc][1];

LCD_Write_Char(DisNum%16,DisNum/16,Val);

DisNum++;

if(DisNum==33)

{

LCD_Clear(); //Borrar la pantalla

DisNum=0; //Reescribir datos desde el principio

}

}

}

else //Presione SHIFT

{

for(TempCyc = 0; (Shifted[TempCyc][0]! =ScanCode)&&(TempCyc <59); TempCyc++); // Visualización de la tabla de búsqueda

if (Shifted[TempCyc][0] == ScanCode)

{

Val= Desplazado [TempCyc][1];

LCD_Write_Char(DisNum%16,DisNum/16,Val);

DisNum++;

si (DisNum==33)

{

LCD_Clear(); //Borrar la pantalla

DisNum=0; //Reescribir datos desde el principio

; p>

}

}

}

descanso;

}

}

else

{

Key_UP = 0;

cambiar (ScanC

ode) // El juicio del código no se procesa cuando se suelta la clave, como G 34H F0H 34H, entonces el segundo 34H no se procesará

{

caso 0x12: / / SHIFT izquierda

Shift = 0;

break;

case 0x59: // SHIFT derecha

Shift = 0;

break;

}

}

BF = 0; //Caracteres identificadores procesados

}

/*-------------------------------------------- ----- -

inicialización de ps2 (inicialización real de interrupción externa)

--------------------- ----- -----------*/

void PS2_Init(void)

{

IT1 = 0; //Establece la interrupción externa 1 como activador de nivel bajo

EA = 1; //La interrupción externa está desactivada

EX0 = 1; interrumpir

}

/*-------------------------------- -------- ----------

Leer valor del teclado

--------------- ------- -----------------------*/

void Read_KeyBoard(void)

{

if (BF)

Decode(KeyV);

else

EA = 1 //Habilitar interrupción

}