Bibliotecas MikroC PRO for PIC: PS/2
O MikroC PRO for PIC proporciona uma biblioteca para a comunicação com o teclado PS/2 comum.
Importante:
A biblioteca não utiliza interrupções para a recuperação de dados, e exige que o oscilador de relógio para ser pelo menos 6MHz.
Os pinos para que um teclado PS/2 está ligado deve ser conectado às resistências de pull-up.
Embora PS/2 é um barramento de comunicação de duas vias, esta biblioteca não fornece comandos para o teclado; Ex.: pressionando a tecla Caps Lock não acende o LED CAPS LOCK.
É necessário inserir a seguinte dependência:
sbit PS2_Data at RC0_bit; sbit PS2_Clock at RC1_bit; sbit PS2_Data_Direction at TRISC0_bit; sbit PS2_Clock_Direction at TRISC1_bit;
RC0 e RC1 -Define o pino a ser conectado o sinal de Data e Clock respectivamente;
TRISC0 e TRISC1 - Indica a direção do Data e Clock.
Rotinas:Ps2_Config() - Inicializa a comunicação com o teclado PS/2;Ps2_Key_Read(unsigned short *value, unsigned short *special, unsigned short *pressed) -A função recupera informações sobre tecla pressionada e retorna 1 se a leitura da tecla for bem sucedida e 0 se nenhuma tecla for pressionada.value - Contém o valor da tecla pressionada. Para caracteres, números, sinais de pontuação e valor espaço, irá armazenar o código apropriado de acordo com a tabela ASCII.A rotina "reconhece" a função Shift e Caps Lock, e se comporta de forma adequada. Para teclas de função especiais ver Tabela de Teclas de Funções Especiais.special - é uma flag para teclas de função especiais (F1, Enter, Esc, etc.);pressed - é definido como 1 se a tecla é pressionada, e 0 se ele for liberado.EXEMPLO:
unsigned short keydata = 0, special = 0, down = 0;
sbit PS2_Data at RC0_bit;
sbit PS2_Clock at RC1_bit;
sbit PS2_Data_Direction at TRISC0_bit;
sbit PS2_Clock_Direction at TRISC1_bit;
void main() {
UART1_Init(19200); // Initialize UART module at 19200 bps
Ps2_Config(); // Init PS/2 Keyboard
Delay_ms(100); // Wait for keyboard to finish
UART1_Write_Text("Ready");
UART1_Write(10); // Line Feed
UART1_Write(13); // Carriage return
do {
if (Ps2_Key_Read(&keydata, &special, &down)) {
if (down && (keydata == 16)) { // Backspace
UART1_Write(0x08);
}
else if (down && (keydata == 13)) { // Enter
UART1_Write('r');
}
else if (down && !special && keydata) {
UART1_Write(keydata);
}
}
Delay_ms(1); // debounce
} while (1);
}



Nenhum comentário