PicManía by RedRaven |
![]()
Búsqueda personalizada
|
PROYECTOS : EMULACIÓN TECLADO PS/2 |
|
|
KBDEMUL : Emulación Teclado PS/2 con un 18F1320 |
![]() |
|
|
|
|
![]() |
|
|
|
|
|
|
![]() |
|
|
|
|
|
![]() |
|
|
|
|
|
|
|
|
|
|
![]() |
Y con esto creo que ya estamos en disposición de implementar la escritura de nuestro teclado PS/2 con el PIC. |
![]() |
|
|
![]() |
|
|
|
|
|
|
![]() |
|
emulando_teclado_ps2.c |
||
// 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{ rec_char=getch(); putc(rec_char;); output_scancode_ps2(convert_ascci_to_scancode(valor)); }while(true); } |
||
|
![]() |
|
|
Y por último la conexión real entre el PC,
la KBDEMUL y el Keyboard PS/2: |
Esta página se modificó el 27/12/2008
|