Porém, a facilidade tem seu preço, como por exemplo quando uma biblioteca não tem as funcionalidades que você quer ou não se comporta da maneira como você deseja, e foi exatamente o que aconteceu.
A biblioteca de PS/2 interpreta os 'scancodes' levando em consideração o estado da tecla shift e o caps lock, o que complica bastante a geração dos estados da matriz. Por exemplo, quando eu pressiono SHIFT juntamente com a tecla "8" a biblioteca me retorna o asterisco "*". Até aí tudo bem, eu poderia simplesmente associar o "*" ao estado correspondente na matriz.
Mas a coisa complica na hora por exemplo de um SHIFT+Letra, pois o teclado interpreta o estado da tecla SHIFT e também o estado da tecla Caps Lock. Dessa forma não tenho como diferenciar somente pelo código recebido quando eu estou pressionando A com o Caps ligado ou SHIFT+A, pois em ambos os casos eu receberia somente que a tecla "A" (maiúscula) foi recebida. Assim seria necessário acrescentar um tratamento paralelo dos estados das teclas CAPS e SHIFT. Isso sem falar no SHIFT+ENTER que seria chato de tratar também...
Pelo menos ficou a experiência de ter lidado com o Mikrobasic, que achei bem positiva.
Bom, no projeto abandonado do emulador de teclado externo para o TK90 eu tinha passado por algo semelhante com a biblioteca PS/2 'padrão' do Arduino, e acabei usando uma outra biblioteca que me retornava os 'scancodes' exatamente como recebidos do teclado, sem os interpretar nem transformar em ASCII. Esta biblioteca tem ainda a vantagem de ser bidirecional, ou seja ela permite enviar comandos ao teclado como inicializar, trocar o modo dos scancodes ou mudar o estado dos leds.
Como essa biblioteca é bem simples resolvi porta-la para o PIC (em C) trocando algumas funções que tomei emprestadas de uma biblioteca de I2C que eu havia escrito na época do projeto do TKChuck.
Para minha surpresa, o código funcionou logo de cara!!
Biblioteca myPS2 funcionando! |
Os dois primeiros bytes recebidos são o teclado respondendo ao comando de inicialização
O próximo passo foi portar o restante do código do projeto anterior para o PIC e refazer a tabela que associa o 'scancode' à matriz de teclado de forma a refletir as teclas do TK85.
Matriz do teclado do TK-85 linearizada (somente 5 bits menos significativos). |
Por exemplo, a tecla "S" equivale à coluna 1 (bit D1) da linha 2 (A9):
#define _Tecla_S 0x0A // 0.0.001.010 -> 0000 1010 -> 0x0A
Já a tecla "Backspace" equivale à SHIFT + 0, ou seja SHIFT + coluna 0 da linha 3 (bit D0 de A12)
#define _Tecla_BS 0x83 // 1.0.000.011 -> 1000 0011 -> 0x83
Um detalhe de montagem do circuito é que o bit D0 ficou na saída Q7 do registrador de deslocamento. Isso requereu alguns acertos, porém agora o programa preenche a matriz corretamente. Nas figuras abaixo as sequências de números correspondem à matriz, sendo a primeira o estado da matriz quando a tecla é pressionada e a segunda quando a tecla é solta.
Tecla "1" |
Tecla "S" |
Tecla "Backspace", composta de "SHIFT" + "0" |
Somente tecla "SHIFT" |
O próximo passo vai ser conferir se os registradores de deslocamento estão sendo devidamente preenchidos com o conteúdo da matriz e em seguida começa o teste 'ao vivo' conectado na placa do TK85.
Nenhum comentário:
Postar um comentário