Autor Tema: Proyecto : Ponga un teclado PS/2 en su PIC (vida)  (Leído 35988 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nostrico

  • PIC10
  • *
  • Mensajes: 33
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #30 en: 06 de Junio de 2006, 15:23:25 »
Gracias por la información, esa fue la que usé para realizar una función, que escribe...

NoStRiCo
"La electronica nos salvará..." CZWIENCZEK

Desconectado LABmouse

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #31 en: 10 de Junio de 2006, 13:46:15 »
Hola a todos, dejenme felicitarlos por semejante proyecto, yo siempre pensaba en si algun dia podria conectar un teclado de PC al PIc, y ustedes lo han logrado, eso para mi era casi un sueño. no tenia ni idea de como se hacia eso, y buscaba informacion en internet y nunca encontraba nada. ustedes y este foro son un gran punto de informacion para cualquier persona en el mundo.

Son todos unos maestros. lo probare y les cuento como me fue.

 :-/ :-/ :-/ :-/ :-/

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #32 en: 05 de Julio de 2006, 07:39:36 »
En el proyecto Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre) voy a necesitar "algo" que reciba PS/2 y que no sea mi PC ya que puede ser una pequeña locura intentar depurar un "emisor PS/2" utilizando la misma entrada donde tengo conectado el teclado con el que estoy trabajando ...  :D  :D  :D

Asi que la solución lógica es utilizar otro PC, pero como no tengo otro no tengo mas remedio que tirar de la RRBOARD2 haciendo las mismas funciones que en este hacía la RRBOARD1. Así mi "emisor" le hablará a la RRBOAR2 y ésta transmitirá lo que reciba vía RS232 al PC con lo que podré depurar sin problemas ...  :mrgreen:  :mrgreen:  :mrgreen:

Aquí os pego lo que realizado para conectarle el Teclado PS/2 a la RRBOARD2 que calza un 18F4550:

Primero el Adaptador PS/2 a Cable Plano 10 pines ...



Despues la conexión entre el Keyboard PS/2 y la RRBOARD2 ...



Y por último las pruebas de Lectura de Teclado y su emisión a la RS232 del PC ...



El código adaptado para el 18F4550 es:

Código: CSS
  1. //-----------------------------------------------------------------------------
  2. // Title:         KEYBOARD_To_PC_RS232.c
  3. // Description:   Interfase entre un teclado convencional tipo AT y un puerto RS232C
  4. // Date:          Abr-2005
  5. // Ver.Rev.:      V01
  6. // Author:        XP8100 (xp8100@gmail.com)
  7. //
  8. //                #Based on the AN AVR313: Interfacing the PC AT Keyboard from ATMEL#
  9. //                #Adaptado para 18f4550 por RedPic
  10. //
  11. //-----------------------------------------------------------------------------
  12. //
  13. // init_kb()      Inicializa rutina y contadores
  14. //
  15. // decode (char)  Decodifica la pulsación realizada, convirtiendola a un caracter de la tabla
  16. //
  17. // int_ext_isr    Rutina de gestión de interrupciones. Captura los diferentes bit's
  18. //
  19. //-----------------------------------------------------------------------------
  20. // RB0 - Señal de reloj
  21. // RB7 - Tren de impulsos (11 bit) Start+10101010+Paridad+Stop
  22. //-----------------------------------------------------------------------------
  23. //
  24. // Commment   : Permite conectar un teclado convencional de PC a un entorno
  25. //              gestionado por un PIC 18f4550.
  26. //              El actual sistema se define como un primer prototipo, en el que no se realizan
  27. //              acciones concretas asociadas a teclas establecidas.
  28. //              Tampoco se actua sobre los indicadores luminosos del teclado, repetición de teclas, ...
  29. //
  30. //
  31. //
  32. // THIS DOCUMENT IS PROVIDED TO THE USER 'AS IS'
  33. //-----------------------------------------------------------------------------
  34.  
  35.  
  36. #include <18f4550.h>
  37. #fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN // Fuses
  38. #use delay(clock=20000000)                       // Clock a 20 Mhz
  39. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)   // Canal serie con el PC
  40.  
  41. #zero_ram
  42.  
  43. //-----------------------------------------------------------------------------
  44. // Definiciones globales
  45. //-----------------------------------------------------------------------------
  46.  
  47. unsigned char edge, bitcount;
  48.  
  49. char got_interrupt;
  50. char interrupt_count;
  51. char status_b3;
  52.  
  53. #bit INTF_BIT = 0xff2.1 // INTCON BIT 1 = INT0IF: INT0 External Interrupt Flag bit
  54.  
  55. //-------- Tabla de caracteres correspondientes a la pulsación de la tecla
  56. //-------- en modalidad normal (sin pulsar SHIFT)
  57.  
  58. unsigned char const unshifted[68][2] = {
  59. 0x0d,9,
  60. 0x0e,'º', 0x15,'q', 0x16,'1', 0x1a,'z', 0x1b,'s', 0x1c,'a', 0x1d,'w',
  61. 0x1e,'2', 0x21,'c', 0x22,'x', 0x23,'d', 0x24,'e', 0x25,'4', 0x26,'3',
  62. 0x29,' ', 0x2a,'v', 0x2b,'f', 0x2c,'t', 0x2d,'r', 0x2e,'5', 0x31,'n',
  63. 0x32,'b', 0x33,'h', 0x34,'g', 0x35,'y', 0x36,'6', 0x39,',', 0x3a,'m',
  64. 0x3b,'j', 0x3c,'u', 0x3d,'7', 0x3e,'8', 0x41,',', 0x42,'k', 0x43,'i',
  65. 0x44,'o', 0x45,'0', 0x46,'9', 0x49,'.', 0x4a,'-', 0x4b,'l', 0x4c,'ñ',
  66. 0x4d,'p', 0x4e,''', 0x52,'´', 0x54,'`', 0x55,'¡', 0x5a,13,  0x5b,'+',
  67. 0x5d,'ç', 0x61,'<', 0x66,8,   0x69,'1', 0x6b,'4', 0x6c,'7', 0x70,'0',
  68. 0x71,'.', 0x72,'2', 0x73,'5', 0x74,'6', 0x75,'8', 0x79,'+', 0x7a,'3',
  69. 0x7b,'-', 0x7c,'*', 0x7d,'9',
  70. 0,0
  71. };
  72.  
  73. //-------- Tabla de caracteres correspondientes a la pulsación de la tecla
  74. //-------- en modalidad desplazamiento (pulsando SHIFT)
  75.  
  76. unsigned char const shifted[68][2] = {
  77. 0x0d,9,
  78. 0x0e,'ª', 0x15,'Q', 0x16,'!', 0x1a,'Z', 0x1b,'S', 0x1c,'A', 0x1d,'W',
  79. 0x1e,'"', 0x21,'C', 0x22,'X', 0x23,'D', 0x24,'E', 0x25,'$', 0x26,'·',
  80. 0x29,' ', 0x2a,'V', 0x2b,'F', 0x2c,'T', 0x2d,'R', 0x2e,'%', 0x31,'N',
  81. 0x32,'B', 0x33,'H', 0x34,'G', 0x35,'Y', 0x36,'&', 0x39,'L', 0x3a,'M',
  82. 0x3b,'J', 0x3c,'U', 0x3d,'/', 0x3e,'(', 0x41,';', 0x42,'K', 0x43,'I',
  83. 0x44,'O', 0x45,'=', 0x46,')', 0x49,':', 0x4a,'_', 0x4b,'L', 0x4c,'Ñ',
  84. 0x4d,'P', 0x4e,'?', 0x52,'¨', 0x54,'^', 0x55,'¿', 0x5a,13,  0x5b,'*',
  85. 0x5d,'Ç', 0x61,'>', 0x66,8,   0x69,'1', 0x6b,'4', 0x6c,'7', 0x70,'0',
  86. 0x71,'.', 0x72,'2', 0x73,'5', 0x74,'6', 0x75,'8', 0x79,'+', 0x7a,'3',
  87. 0x7b,'-', 0x7c,'*', 0x7d,'9',
  88. 0,0
  89. };
  90.  
  91.  
  92. //-----------------------------------------------------------------------------
  93. // Definición de protipos
  94. //-----------------------------------------------------------------------------
  95.  
  96. void init_kb(void);
  97. void decode(unsigned char sc);
  98.  
  99. //-----------------------------------------------------------------------------
  100. // Rutina de gestión de interrupciones
  101. //-----------------------------------------------------------------------------
  102.  
  103. #int_ext
  104. void int_ext_isr(void){
  105.  
  106. unsigned char data;
  107.    //-------- Los bit 3 a 10 se considerran datos. Paridad, start y stop
  108.    //-------- son ignorados
  109.    if(bitcount < 11 && bitcount > 2){
  110.       data = (data >> 1);
  111.       status_b3 = input(PIN_B7);
  112.       if((status_b3) == 1){
  113.           data = data | 0x80;
  114.       }
  115.    }
  116.    //-------- Todos los bits se han recibido
  117.    if(--bitcount == 0){
  118.       decode(data);
  119.       data = 0;
  120.       bitcount = 11;
  121.       got_interrupt = TRUE;
  122.    }
  123.    got_interrupt = TRUE;
  124.    interrupt_count++;
  125.    disable_interrupts(INT_EXT);
  126. }
  127.  
  128. void flash_porte(void){
  129.  
  130.    int i;
  131.    set_tris_e(0b00010000);                       // Prepraro PORTE para flashear, Digital y Salida
  132.    for(i=0;i<3;i++){
  133.       output_High(PIN_E0);                       // Enciendo los tres Led's de la RRBOARD2
  134.      output_High(PIN_E1);
  135.      output_High(PIN_E2);
  136.      delay_ms(333);                             // Espero para que se vea
  137.      output_Low(PIN_E0);                        // Apago los tres Led's de la RRBOARD2
  138.       output_Low(PIN_E1);
  139.       output_Low(PIN_E2);
  140.       delay_ms(333);                             // Espero para que no se vea
  141.    }
  142. }
  143.  
  144. void on_reset(){
  145.  
  146.    disable_interrupts(global);                   // Deshabilito todas las interrupciones
  147.    disable_interrupts(int_timer1);               // Deshabilito ...
  148.    disable_interrupts(int_rda);
  149.    disable_interrupts(int_ext);
  150.    disable_interrupts(int_ext1);
  151.    disable_interrupts(int_ext2);
  152.    setup_adc_ports(NO_ANALOGS);                  // Configuro todo lo que voy
  153.    setup_adc(ADC_OFF);                           // a usar y lo que no ...
  154.    setup_spi(FALSE);
  155.    setup_psp(PSP_DISABLED);
  156.    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  157.    setup_timer_0(RTCC_OFF);
  158.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  159.    setup_timer_2(T2_DISABLED,0,1);
  160.    setup_timer_3(T3_DISABLED);
  161.    setup_comparator(NC_NC_NC_NC);
  162.    setup_vref(FALSE);
  163.    set_tris_c(0b10000000);
  164.  
  165.    delay_ms(333);                                // Espero 333 milisegundos a que todo se estabilice
  166.  
  167.    printf("\r\n");                               // Me presento como deben hacer todos los PIC's de buena familia
  168.   printf("PC AT Keyboard Interface by XP8100\r\n");
  169.   printf("Adpapted for 18F4550 by Redpic\r\n");
  170.   printf("Decoder and Monitor connected ...\n\r");
  171.   printf("\r\n");
  172.  
  173.   flash_porte();
  174.  
  175.   delay_ms(100);
  176.  
  177.   init_kb();
  178.   //-------- Los pins indicados (B0 y B7) son configurados como entradas.
  179.   output_float(PIN_B0);
  180.   output_float(PIN_B7);
  181.   //-------- Activa pullups sobre todos los pins del puerto B.
  182.   port_b_pullups(TRUE);
  183.   //-------- Espera a que se activen.
  184.   delay_us(5);
  185.   //-------- Inicializa las variables usadas por la rutina de interrupción
  186.   //-------- antes de activar las interrupciones
  187.   interrupt_count = 0;
  188.   got_interrupt = FALSE;
  189.   status_b3 = 0;
  190.   //-------- Desde que se activó el modo PULLUPS del puerto B, el estado
  191.   //-------- normal del pin B0 es ALTO. La gestión de la interrupción externa
  192.   //-------- se gestiona cuando se produce un cambio de nivel ALTO a BAJO.
  193.   ext_int_edge(H_TO_L);
  194.   //-------- Asegurarse de que el el bit de flag de la interrupción externa
  195.   //-------- es borrado antes de activar la gestión de dicha interrupción
  196.   //-------- externa.
  197.   INTF_BIT = 0;
  198.   //-------- Habilito Interrupciones
  199.   enable_interrupts(INT_EXT);
  200.   enable_interrupts(GLOBAL);
  201. }
  202.  
  203. //-----------------------------------------------------------------------------
  204. // Main
  205. //-----------------------------------------------------------------------------
  206.  
  207. void main(void)
  208. {
  209.  
  210.   //-------- Hago todo lo que tengo que hacer al resetear el micro
  211.   On_reset();
  212.   //-------- Bucle principal.
  213.   //-------- Chequear si se produce alguna interrupción (got_interrupt). Si es así, contar, borrar
  214.   //-------- el flag y esperar 50 ms, reactivando la gestión de las interrupciones
  215.   while(1){
  216.      //-------- Chequear si se produce alguna interrupción (got_interrupt).
  217.      if(got_interrupt == TRUE){
  218.            //-------- Borrar el flag global que se inicio en la rutina de servicio
  219.            //-------- de interrupciones externas.
  220.            got_interrupt = FALSE;
  221.            //-------- Esperar 50 ms para evitar rebotes en los contactos de las teclas.
  222.            //delay_ms(50);
  223.            //-------- Borrar cualquier interrupción producida durante el periodo de espera.
  224.            INTF_BIT = 0;
  225.            //-------- Reactivar interrupciones
  226.            enable_interrupts(INT_EXT);
  227.      } // --- End If ---
  228.   } // --- End While ---
  229. } // --- End MAIN ---
  230.  
  231.  
  232. //-----------------------------------------------------------------------------
  233. // Funciones
  234. //-----------------------------------------------------------------------------
  235.  
  236.  
  237. //-----------------------------------------------------------------------------
  238. // Inicialización de teclado.
  239. //-----------------------------------------------------------------------------
  240. void init_kb(void)
  241. {
  242.   //-------- Longitud de la trama para cada pulsación
  243.   bitcount = 11;
  244. }
  245.  
  246. //-----------------------------------------------------------------------------
  247. // Decodificación de pulsaciones
  248. //-----------------------------------------------------------------------------
  249. void decode(unsigned char sc)
  250. {
  251.   static unsigned char is_up=0, shift = 0, mode = 0;
  252.   unsigned char i;
  253.  
  254.  
  255.   // printf("[%X]",sc);
  256.  
  257.  
  258.   //-------- El último dato recibido fue el identificador de Up-Key
  259.   if (!is_up){
  260.         switch (sc){
  261.               //-------- Identificador de Up-Key
  262.               case 0xF0 :
  263.                  is_up = 1;
  264.                  break;
  265.               //-------- SHIFT Izquierdo
  266.               case 0x12 :
  267.                  shift = 1;
  268.                  break;
  269.               //-------- SHIFT Derecho
  270.               case 0x59 :
  271.                  shift = 1;
  272.                  break;
  273.               //-------- ENTER
  274.               case 0x5A :
  275.                  shift = 0;
  276.                  printf("\n\r");
  277.                  break;
  278.               //-------- Si no es ninguno de los identificadores especiales, procesar
  279.               //-------- pulsación, localizando caracter en tabla de caracteres.
  280.               default:
  281.                  //-------- Pulsación normal
  282.                  if(!shift)
  283.                     {
  284.                        for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
  285.                        if (unshifted[i][0] == sc)
  286.                           {
  287.                              printf("%c", unshifted[i][1]);
  288.                           }
  289.                     }
  290.                  else
  291.                  //-------- Pulsación + SHIFT presionado
  292.                     {
  293.                        for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
  294.                        if (shifted[i][0] == sc)
  295.                           {
  296.                              printf("%c", shifted[i][1]);
  297.                           }
  298.                     }
  299.                     break;
  300.               } // --- End Switch
  301.         }
  302.      else
  303.         {
  304.         //-------- No se permiten 2 0xF0 en una fila
  305.         is_up = 0;
  306.         switch (sc)
  307.            {
  308.               //-------- SHIFT Izquierdo
  309.               case 0x12 :
  310.                  shift = 0;
  311.                  break;
  312.               //-------- SHIFT Derecho
  313.               case 0x59 :
  314.                  shift = 0;
  315.                  break;
  316.            } // --- End Switch
  317.         }
  318. }
« Última modificación: 23 de Marzo de 2009, 16:14:50 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #33 en: 23 de Marzo de 2009, 16:11:18 »
Debido a una migración de servidor un tanto abrupta, teniendo como origen un servidor Güindows y como destino uno Linux, las imágenes que adornaban mis post en este hilo han quedado huérfanas e inasequibles. El contenido de  las mismas es fundamental para darle contenido y razón a mi desarrollo así que:

El resumen y artículo publicado con estos contenidos los tenéis disponible en Conectando un Teclado PS/2 a la RRBOARD1 y en este otro  KBDEMUL : Emulación Teclado PS/2 con un 18F1320
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado mane9999

  • PIC10
  • *
  • Mensajes: 2
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #34 en: 05 de Mayo de 2009, 19:20:33 »
Felicidades RED!! es buenisimo tu trabajo. Yo estoy manejando la visualización en una LCD y funciona perfectamente :-). Solo que ahora me surgió otro problema, yo quiero conectarle un lector de codigo de barras PS/2 pero no se muestra nada de nada y en la PC este lector funciona bien. Sabes que pueda tener de distinta la comunicacion entre el teclado y un lector?? será la velocidad con la que el lector manda los datos?
Sigo intendando varias cosas... si consigo algo les platico los resultados  :mrgreen:

Desconectado cevollin

  • PIC10
  • *
  • Mensajes: 2
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #35 en: 12 de Julio de 2009, 23:15:55 »
 :-/ :-/ hola hola a todos los compañeros de todopic como veran soy nuevo en este foro pero no soy bastante experto mis conocimientos son medios  programacion de pic en asm es muy poco se un poco mas en el lenguaje basic del pic simulador ide

bueno he encontrado esta discusion de como utilizar un teclado ps/2 con un pic ya que es lo que he querido hacer desde hace un tiempo mi pregunta es como puedo simular el teclado ps/2 en el proteus ya que no tiene esa utilidad tiene para simular puertos com y usb pero no para puerto ps/2  :D :D

y como seria para recibir el scan code del teclado ya que el teclado utiliza un protocolo de comunicacion  para comunicarse con la pc pic etc 

Desconectado cevollin

  • PIC10
  • *
  • Mensajes: 2
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #36 en: 21 de Julio de 2009, 17:53:28 »
 :-/ :-/ :lol: :lol: ya olvidenlo ya se como comunicar teclado a pic y pic a teclado es muy facil baje un tutorila supercompleto y lo simplifique para despues entenderlo ya que me tomo unos 3 dias entender como hacerlo claro con un poco de ayuda del camarada suki y ariel usuarios de ucontrol si quieren que les de una manita hay no mas me piden el tutorial

Desconectado betito_mmf

  • PIC10
  • *
  • Mensajes: 13
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #37 en: 07 de Septiembre de 2009, 05:02:40 »
Me pueden explicar esta parte publicada por RedPic please que no entiendo muy bien



Código: [Seleccionar]
for(i = 0; unshifted[ i ][ 0 ]!=sc && unshifted[ i ][ 0 ]; i++);
                        if (unshifted[ i ][ 0 ] == sc)
                           {
                              printf("<%c>", unshifted[ i ][ 1 ]);
                           }

Esta condicion

(unshifted[ i ][ 0 ]!=sc)  && (unshifted[ i ][ 0 ])     

es verdadera cuando la tecla presionada "sc"  es diferente del dato "unshifted[ i ][ 0 ]"
entonces se incrementa  i++   y luego se prosigue con el siguiente elemento del array
entonces cuando "sc" es igual a  "unshifted[ i ][ 0 ]"  la condicion se hace falsa ?
si es asi como es que se ejecuta el sentencia que esta dentro del IF?  :? 
:-) :-) :-)  HOY SERE MEJOR QUE AYER  :mrgreen:

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #38 en: 01 de Abril de 2011, 14:17:28 »
Muchas gracias don diego, me sirvio como base su codigo.

Muchos saludos :)
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado bondadoso

  • PIC10
  • *
  • Mensajes: 16
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #39 en: 11 de Marzo de 2012, 17:36:21 »
me parece interesantisimo este proyecto,

ahora el ejemplo de redpic me da error en la declaracion de 0x0e,"?", dentro de  unsigned char  const unshifted[68][2] = {

me manda el siguiente error=

Expression must evaluate to a constant

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #40 en: 30 de Abril de 2012, 22:28:51 »
Grande RedPic!

Tengo una duda, necesito poner un teclado usb a mi PIC... Deberia hacerlo con un pic con usb host? O puedo hacer de alguna manera que el teclado usb envie datos ps2 por sus lines d+ y d-??

Gracias.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #41 en: 30 de Abril de 2012, 23:30:52 »
El ejemplo usb host keyboard de microchip funciona bien, lo malo es ke no entra en un pic24 de 32kB, por lo menos sin modificar el fuente.

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado jcmorales82

  • PIC10
  • *
  • Mensajes: 2
Re: Proyecto : Ponga un teclado PS/2 en su PIC (vida)
« Respuesta #42 en: 07 de Noviembre de 2012, 12:13:24 »
Bueno, mi primer aporte a este foro... Y como este post me ha ayudado un mundo, quiero complementar un poco la librería de RedPic, con la función para enviar datos, ya lo he probado en 3 teclados y va bien, pero como cada teclado tiene un timing diferente, sería cuestión de que se pusieran a jugar un rato, pues el protocolo es el mismo... Yo lo probé en un PIC 16F876A, utilicé Clock B0 y Data B1.

Código: [Seleccionar]
#byte TRISB=0x86
#bit TRISB0=TRISB.0
#bit TRISB1=TRISB.1 //#bit TRISB3=TRISB.3 en el caso de la librería de Red
#define ClkTris TRISB0
#define DataTris TRISB1 //Hay que definir los tris, depende de que bits utilices, yo usé B0 para la interrupción y B1 para la data... (#define DataTris TRISB3 para Red)

void enviar_dato(int comando)
{
int bitcom;
disable_interrupts(global);
delay_ms(1);
ClkTris=0;
DataTris=0;
OUTPUT_BIT(PIN_B0,0);
delay_us(100); //Esto puede variar depende del teclado, pero debería estar bien para la mayoría
OUTPUT_BIT(PIN_B1,0);
PS2Key_ClkTris=1;
while(input(PIN_B0));
for(i=0;i<=7;i++){
bitcom = comando&(1<<i);
   OUTPUT_BIT(PIN_B1,bitcom);
   while(!input(PIN_B0));
   while(input(PIN_B0));
   }
OUTPUT_BIT(PIN_B1,1);//PARIDAD=1
while(!input(PIN_B0));
while(input(PIN_B0));   
PS2Key_DataTris=1;
while(input(PIN_B1));
while(input(PIN_B0));
delay_ms(10); /También puede variar, espera mientras el teclado envía ACK, o Error, o Reenviar, y libera los pines de Clock y Data
}


Por ejemplo, si quieren encender las luces del teclado, el código sería:

Código: [Seleccionar]
enviar_dato(0xED);
enviar_dato(0b00000011); //ScrollLock y NumLock


 

anything