Amigo Gerab.
Notei que esse tópico, esta parado a muito tempo. gostaria de saber se você conseguiu encontrar o que queria.
tendo em vista que esse e o local ideal para a troca de conhecimento, porém existe muita gente com um pouco mais que os outros, que adquiriu com uma pessoa com um pouco mais, e ainda não percebeu que o conhecimento foi feito para ser passado a diante! um dia você não acorda mais, e tudo se perdeu por a mais pura ignorância. ( Sem querer citar nomes )
Fiz um projeto parecido com o que você estava procurando, e encontrei bastante material para o mesmo. Se tratava de uma interface para uma maquina de músicas, onde era controlada através da porta ps2. ela contava com 16 teclas mapeadas, e utilizava uma PIC16f628A. vou postar o programa em ( c ), e se você tiver ainda interesse, posso mandar o esquema para confecção da PCB.
segue o código..
#include <16F628A.h> // Define a PIC 16F628a
#fuses INTRC,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // os Fuses de sempre
#use delay(internal=4000000) // Oscilador a 4 Mhz
#define T_CLOCK PIN_B2
#define T_DATA PIN_B1
unsigned int8 valor;
char miletra;
/* ****************************************************************************************** */
void vEnvia_Byte(char Data){
char k=0,Unos=1;
while(input(T_CLOCK)==0);
output_high(T_CLOCK);
output_high(T_DATA);
output_drive(T_DATA);
output_drive(T_CLOCK);
/* ** Enviamos Bit Start ** */
output_high(T_CLOCK);
output_high(T_DATA);
delay_us(40);
output_low(T_DATA);
delay_us(40);
output_low(T_CLOCK);
delay_us(40);
/* ** Enviamos 8 bits de dados ** */
for(k=0;k<8;k++){
output_high(T_CLOCK);
delay_us(5);
output_bit(T_DATA,Data & 0x01);
delay_us(35);
output_low(T_CLOCK);
delay_us(40);
if(bit_test(Data,0)==1){Unos++;}
Data>>=1;
}
/* ** Enviamos bit de comparação ** */
output_high(T_CLOCK);
delay_us(5);
output_bit(T_DATA,Unos&0x01);
delay_us(35);
output_low(T_CLOCK);
delay_us(40);
/* ** Enviamos bit de parada ** */
output_high(T_CLOCK);
delay_us(5);
output_high(T_DATA);
delay_us(35);
output_low(T_CLOCK);
delay_us(40);
output_float(T_CLOCK);
output_float(T_DATA);
delay_us(100);
}
/* ****************************************************************************************** */
char cLee_Byte(void){
char k;
char Data=0xEC;
/* ** Condicion RTS ** */
delay_us(100);
if(input(T_DATA)==0){
/* ** Esperamos que o Host esteja vazio para enviar dados ** */
while(input(T_CLOCK)==0);
output_high(T_CLOCK);
output_drive(T_CLOCK);
output_high(T_CLOCK);
delay_us(200);
output_low(T_CLOCK);
if(input(T_DATA)==0){
/* ** Se recebe os 8 bits de dados ** */
for(k=0;k<8;k++){
delay_us(40);
output_high(T_CLOCK);
delay_us(20);
shift_right(&Data,1,input(T_DATA));
delay_us(20);
output_low(T_CLOCK);
}
/* ** Se ignora bit de comparação ** */
delay_us(40);
output_high(T_CLOCK);
delay_us(40);
output_low(T_CLOCK);
/* ** Se testa bit de parada ** */
delay_us(40);
output_high(T_CLOCK);
delay_us(20);
if(input(T_DATA)==1){
delay_us(15);
/* ** Se envia Ack ** */
output_drive(T_DATA);
output_low(T_DATA);
delay_us(5);
output_low(T_CLOCK);
delay_us(40);
output_high(T_CLOCK);
delay_us(10);
}
}
}
output_float(T_CLOCK);
output_float(T_DATA);
delay_us(100);
return(Data);
}
/* ****************************************************************************************** */
#int_EXT
void Leer_Host(){
static char Dato_Host;
Dato_Host=cLee_Byte();
if(Dato_Host!=0xEC){
if(Dato_Host==0xEE){
vEnvia_Byte(0xEE);
}else{
vEnvia_Byte(0xFA);
if(Dato_Host==0xF2){
vEnvia_Byte(0xAB);
vEnvia_Byte(0x83);
}
if(Dato_Host==0xFF){
delay_ms(1);
vEnvia_Byte(0xAA);
}
}
}
}
/* ****************************************************************************************** */
void main()
{
delay_ms(800);
vEnvia_Byte(0xAA);
ext_int_edge(H_TO_L);
clear_interrupt(INT_EXT);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
do{
vEnvia_Byte(0x44); //O
delay_ms(100);
vEnvia_Byte(0x4b); //L
delay_ms(100);
vEnvia_Byte(0x1c); //A
delay_ms(100);
vEnvia_Byte(0x29); //Espaco
delay_ms(100);//
vEnvia_Byte(0x42); //K
delay_ms(100);//
vEnvia_Byte(0x24); //E
delay_ms(100);
vEnvia_Byte(0x29); //Espaco
delay_ms(100);//
vEnvia_Byte(0x1c); //A
delay_ms(100);//
vEnvia_Byte(0x1b); //S
delay_ms(100);//
vEnvia_Byte(0x24); //E
delay_ms(100);//
vEnvia_Byte(0x29); //Espaco
delay_ms(100);//
vEnvia_Byte(0x29); //Espaco
delay_ms(100);//
vEnvia_Byte(0x29); //Espaco
delay_ms(100);//
output_toggle(PIN_B3);
delay_ms(500);
}
while(true);
}
* Daqui você Pode Seguir com seu Programa Especifico Amigo!!!
Espero que ajude..
Um Abraço!!
A Avareza torna o Homem Um Inútil para o Mundo, a generosidade torna-o estimado!!
Pense Nisso!!!
Marcelo CZ