// Original de Nostrico del foro Todopic
// adaptado al 18f1320 por redpic
//
#include <18f1320.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(OUT_CLOCK=20000000)
#use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B4)
#define CONTROL_A PIN_A0
#define CONTROL_B PIN_A1
#define CONTROL_C PIN_A2
#define CONTROL_INH PIN_A4
#define OUT_CLOCK PIN_B3
#define OUT_DATA PIN_B5
unsigned int8 rec_char;
unsigned char convert_ascci_to_scancode(unsigned char c){
unsigned char scancode;
if (c == 'a' || c == 'A') {scancode = 0x1c;}
else if (c == 'b' || c == 'B') {scancode = 0x32;}
else if (c == 'c' || c == 'C') {scancode = 0x21;}
else if (c == 'd' || c == 'D') {scancode = 0x23;}
else if (c == 'e' || c == 'E') {scancode = 0x24;}
else if (c == 'f' || c == 'F') {scancode = 0x2b;}
else if (c == 'g' || c == 'G') {scancode = 0x34;}
else if (c == 'h' || c == 'H') {scancode = 0x33;}
else if (c == 'i' || c == 'I') {scancode = 0x43;}
else if (c == 'j' || c == 'J') {scancode = 0x3b;}
else if (c == 'k' || c == 'K') {scancode = 0x42;}
else if (c == 'l' || c == 'L') {scancode = 0x4b;}
else if (c == 'm' || c == 'M') {scancode = 0x3a;}
else if (c == 'n' || c == 'N') {scancode = 0x31;}
else if (c == 'o' || c == 'O') {scancode = 0x44;}
else if (c == 'p' || c == 'P') {scancode = 0x4d;}
else if (c == 'q' || c == 'Q') {scancode = 0x15;}
else if (c == 'r' || c == 'R') {scancode = 0x2d;}
else if (c == 's' || c == 'S') {scancode = 0x1b;}
else if (c == 't' || c == 't') {scancode = 0x2c;}
else if (c == 'u' || c == 'U') {scancode = 0x3c;}
else if (c == 'v' || c == 'V') {scancode = 0x2a;}
else if (c == 'w' || c == 'W') {scancode = 0x1d;}
else if (c == 'x' || c == 'X') {scancode = 0x22;}
else if (c == 'y' || c == 'Y') {scancode = 0x35;}
else if (c == 'z' || c == 'Z') {scancode = 0x1a;}
else if (c == '0') {scancode = 0x45;}
else if (c == '1') {scancode = 0x16;}
else if (c == '2') {scancode = 0x1e;}
else if (c == '3') {scancode = 0x26;}
else if (c == '4') {scancode = 0x25;}
else if (c == '5') {scancode = 0x2e;}
else if (c == '6') {scancode = 0x36;}
else if (c == '7') {scancode = 0x3d;}
else if (c == '8') {scancode = 0x3e;}
else if (c == '9') {scancode = 0x46;}
else if (c == '/') {scancode = 0x5a;} // ENTER
else if (c == ' ') {scancode = 0x29;} // ESPACIO
else if (c == '>') {scancode = 0x0d;} // TABULADOR
else if (c == '<') {scancode = 0x66;} // BORRADOR
else if (c == '$') {scancode = 0x58;} // TAG DE MAYUSCULA $m$yuscula
else if (c == '-') {scancode = 0x4a;} // -_
else {scancode = 0x29;} // Cualquier otra cosa ESPACIO
return scancode;
}
void output_scancode_ps2(unsigned char scancode){
int contador;
int salida, unos=1;
boolean paridad=true;
output_high(OUT_CLOCK); // START -------------------------------
output_high(OUT_DATA);
delay_us(40);
output_high(OUT_CLOCK);
output_low(OUT_DATA);
delay_us(40);
output_low(OUT_CLOCK);
output_low(OUT_DATA);
delay_us(40);
salida =1;
do{
output_high(OUT_CLOCK);
output_bit(OUT_DATA, scancode&0x01);
delay_us(40);
output_low(OUT_CLOCK);
output_bit(OUT_DATA, scancode&0x01);
delay_us(40);
if ((scancode & 0x01) == 0x01) {unos++;}
scancode = scancode>>1;
salida++;
}while(salida < 9);
output_high(OUT_CLOCK); // PARITY ------------------------------
output_bit(OUT_DATA, unos&0x01);
delay_us(40);
output_low(OUT_CLOCK);
output_bit(OUT_DATA, unos&0x01);
delay_us(40);
output_high(OUT_CLOCK); // STOP --------------------------------
output_high(OUT_DATA);
delay_us(40);
output_low(OUT_CLOCK);
output_high(OUT_DATA);
delay_us(40);
output_high(OUT_CLOCK); // FIN ---------------------------------
output_high(OUT_DATA);
delay_ms(175);
}
void main(){
delay_ms(300);
printf("\r\nKBDEMUL with a 18F1320\r\nInject signal for PS/2\r\n\n"); delay_ms(500);
output_high(CONTROL_A); // Conmuta CD4053 a salida PIC->PC
output_high(CONTROL_B);
output_high(CONTROL_C);
do{
output_scancode_ps2(convert_ascci_to_scancode(rec_char));
}while(true);
}