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