Conteúdos da cadeira

Teclado

O controlador i8042, scancodes de make e break e a descodificação de teclas.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
Nesta página

O teclado fala com o PC através do controlador i8042: cada tecla premida ou libertada gera um ou mais bytes chamados scancodes. O teu programa lê esses bytes do buffer de saída do controlador e reconstrói o que o utilizador fez. É o primeiro periférico esporádico e o primeiro exercício sério de descodificação byte a byte.

Make e break

Cada tecla produz dois eventos: o make, quando é premida, e o break, quando é libertada. No conjunto de scancodes usado nos trabalhos, o make de uma tecla normal é um byte, e o break são dois: o prefixo 0xF0 seguido do mesmo byte. Por exemplo, a tecla A tem make 0x1C e break 0xF0 0x1C.

As teclas especiais (setas, Insert, Delete e companhia) usam um prefixo extra 0xE0. A seta direita, por exemplo, tem make 0xE0 0x74 e break 0xE0 0xF0 0x74. Repara na estrutura: o 0xE0 diz “tecla estendida”, e o resto segue a regra normal de make e break.

Ler com polling ou interrupção

O controlador assinala dado disponível no bit de pronto do registo de estado: em polling, esperas por esse bit e lês o byte do buffer de saída, exatamente como na página sobre falar com o hardware. Por interrupção, subscreves o IRQ do teclado e cada byte que chega invoca o handler, que o guarda num buffer para o programa principal consumir.

Nos dois casos, a leitura tem de tratar o erro de paridade e o timeout assinalados nos bits próprios do estado: um byte com erro descarta-se em vez de se descodificar, porque alimenta a máquina de estados com lixo.

Exemplo: descodificar premir e libertar

O utilizador prime e liberta a tecla A. O programa recebe três bytes: 0x1C, 0xF0, 0x1C. A descodificação corre assim:

  1. Chega 0x1C. Não é prefixo (0xE0 ou 0xF0), por isso é um make: a tecla com código 0x1C foi premida. Regista “A premida”.
  2. Chega 0xF0. É o prefixo de break: o próximo byte completa um break, não é um evento sozinho. Guarda o estado “à espera do segundo byte”.
  3. Chega 0x1C com o estado pendente: é o break da tecla 0x1C. Regista “A libertada” e limpa o estado.

Três bytes, dois eventos, uma máquina de estados com dois estados (normal e à espera). Se chegar 0xE0, entra-se no ramo das teclas estendidas com a mesma lógica. O padrão é sempre este: cada byte ou é um evento completo ou muda o estado do descodificador para interpretar o seguinte.

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

Álgebra, lógica e uma ideia de cada vez.

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.