ENVIANDO SCAN CODES A PARTIR DE UM TECLADO TELEFÔNICO PARA UM PC (PROTOCOLO PS2) – C/ PIC 16F628A (REF266)-

1

Gere ‘scan codes’ e envie para um PC …

Em certas situações necessitamos enviar o equivalente a um aperto de tecla para um PC, rodando algum aplicativo específico. No teclado normal usado no PC, a cada aperto de tecla enviamos um ‘scan code’ cujo conteúdo representa uma determinada tecla. O circuito proposto consiste em usar um teclado de telefone convencional de 15 teclas e no programa escolher quais ‘scan codes’ serão enviadas. Veja o esquema abaixo:

keyboard_PS2_4X4

O protocolo PS2 utilizado em teclados e mouses consiste no envio de um start bit, 8 bits de dados, 1 bit de paridade e 1 stop bit. Fisicamente, utiliza um fio para os dados (ps2_data) e outro para o clock (ps2_clock), além do gnd e a alimentação para o teclado (+5v). Note que tanto o teclado envia para o PC como também o PC pode enviar para o teclado. Nesta montagem experimental não foi dado muita atenção a comunicação PC para teclado, limitando apenas a enviar o byte de confirmação de recebimento. No sistema operacional XP onde foram feitos os testes, isto foi suficiente para reconhecer esta montagem no momento da inicialização do PC. No entanto, não saberia dizer se vai funcionar com outros sistemas operacionais, ficando por conta de cada hobista realizar os testes e alterar o que achar necessário no programa.
No programa atual, ao apertar a tecla ‘0’ enviará o ‘scan code’ correspondente para imprimir a letra ‘0’ em um arquivo de testo aberto no PC. As outras teclas de ‘1’ a ‘9’ fazem o mesmo. As outras teclas irão imprimir as letras ‘a’ a ‘f’.
Para substituir por outros ‘scan codes’ substitua os defines abaixo no programa C e recompile com CCS C Compiler (usado versão 3.200):
//codes a ser enviado pelas teclas ao soltar o teclado
#define tecla_0_break Kbd_send(0xf0); Kbd_send(0x45);//code para letra ‘0’
#define tecla_1_break Kbd_send(0xf0); Kbd_send(0x16);
#define tecla_2_break Kbd_send(0xf0); Kbd_send(0x1e);
#define tecla_3_break Kbd_send(0xf0); Kbd_send(0x26);
#define tecla_4_break Kbd_send(0xf0); Kbd_send(0x25);
#define tecla_5_break Kbd_send(0xf0); Kbd_send(0x2e);
#define tecla_6_break Kbd_send(0xf0); Kbd_send(0x36);
#define tecla_7_break Kbd_send(0xf0); Kbd_send(0x3d);
#define tecla_8_break Kbd_send(0xf0); Kbd_send(0x3e);
#define tecla_9_break Kbd_send(0xf0); Kbd_send(0x46);
#define tecla_a_break Kbd_send(0xf0); Kbd_send(0x1c);
#define tecla_b_break Kbd_send(0xf0); Kbd_send(0x32);
#define tecla_c_break Kbd_send(0xf0); Kbd_send(0x21);
#define tecla_d_break Kbd_send(0xf0); Kbd_send(0x23);
#define tecla_e_break Kbd_send(0xf0); Kbd_send(0x24);
#define tecla_f_break Kbd_send(0xf0); Kbd_send(0x2b);

//codes a ser enviado pelas teclas ao apertar o teclado
#define tecla_0_make Kbd_send(0x45);//code para letra ‘0’
#define tecla_1_make Kbd_send(0x16);
#define tecla_2_make Kbd_send(0x1e);
#define tecla_3_make Kbd_send(0x26);
#define tecla_4_make Kbd_send(0x25);
#define tecla_5_make Kbd_send(0x2e);
#define tecla_6_make Kbd_send(0x36);
#define tecla_7_make Kbd_send(0x3d);
#define tecla_8_make Kbd_send(0x3e);
#define tecla_9_make Kbd_send(0x46);
#define tecla_a_make Kbd_send(0x1c);
#define tecla_b_make Kbd_send(0x32);
#define tecla_c_make Kbd_send(0x21);
#define tecla_d_make Kbd_send(0x23);
#define tecla_e_make Kbd_send(0x24);
#define tecla_f_make Kbd_send(0x2b);

Observe que ao apertar um tecla gera um código e ao soltar também gera um código (break code). Ao substituir faça em ambos os defines (aperto e soltura de teclas) nas posições corretas de cada tecla do teclado telefônico usado.
Outros ‘scan codes’ e ‘break codes’ podem ser obtidos na internet. Note que existe muitíssimos deles e nem todos são funcionais em alguns sistemas operacionais.
Obs. Esta montagem é experimental, sendo de caráter didático, montada apenas em placa experimental (do tipo “Breadboard”), sujeita a “bugs” ainda não detectados. Está sendo fornecido os arquivos para que cada hobista possa alterar o programa segundo suas necessidades.

Segue pasta zipada com os arquivos da montagem:

key_4x4_ps2

Manuais:
PIC16F628A datasheet
PS2 protocolo

Curiosidades:
O pouso das abelhas
Saiba um pouco sobre os tecidos e cores dos tempos bíblicos
Por que economizar é melhor que gastar?
Colecionar — um hobby que exige equilíbrio
Uma delícia de “praga”

Outros assuntos:
Como posso superar uma tragédia?
O que faz alguém ser um bom pai ou uma boa mãe?
Como ser feliz no casamento?
Quando uma amizade se torna íntima demais
Como se livrar do ressentimento

Vídeos:
Você Pode Ter uma Família Feliz!
“Para isto vim ao mundo”
Sempre Confie em Jeová
Como a vida começou?
Celular e você: quem manda em quem?
Como enfrentar o bullying sem partir para a briga
Quem é o Autor da Bíblia?
Será que é amor ou paixão?
Tenha mais paciência
Fale a verdade
Eu me cansei das religiões

Até o próximo artigo!

1

2 comments

  1. 0

    Boa tarde Claudio, obrigado por fazer e desculpe por não ter enviado o esquema ( ainda não consegui ). Montei e liguei com o windows xp já iniciado e funcionou certinho, reiniciei com o circuito ligado e não funcionou ( mas o windows iniciava ), na 3º ou 4º tentativa começou a funcionar, desligava e ligava ou reiniciava e funcionava numa boa. Deixei ligado por algumas horas para testar e quando reiniciei o windows ele não iniciou, ficava preso na tela ainda da placa mãe ( nem no setup a placa entrava, usando um teclado usb ). Sem o circuito o windows inicia normalmente, ele agora só funciona depois de iniciado o windows com um teclado PS2 conectado. Gravei outro pic e mesma coisa, não inicia o windows. Zerei a bios da placa mãe e nada. No windows 8.1 ( outro hd com a mesma placa mãe ) no inicio ele iniciava o windows com o circuito mas não funcionava ( a não ser o windows iniciado com teclado PS2 ), mas depois também travava na inicialização do windows.
    Tem alguma idéia do que pode ser ??

    1. 0

      Olá Michael!
      Na inicialização do PC existe uma comunicação entre o PC e o circuito. Como não sabia exatamente o que seria comunicado (porque não tenho osciloscópio com gravação de tempos) apenas coloquei para responder como recebido a mensagem. No PC que tenho usando Xp não tive problemas, mas não é garantia de funcionar com outros na inicialização. O circuito fica limitado neste quesito da inicialização e não tenho como solucionar por desconhecer exatamente o que o PC envia para o teclado.
      Cláudio

Comments are closed.