Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Encender/Apagar leds del teclado con o c++

Estas en el tema de Encender/Apagar leds del teclado con o c++ en el foro de C/C++ en Foros del Web. Buen día, apenas estoy iniciando con el lenguaje de C y la tarea que me han encomendado es poder prender y apagar los leds del ...
  #1 (permalink)  
Antiguo 16/10/2009, 11:55
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Encender/Apagar leds del teclado con o c++

Buen día, apenas estoy iniciando con el lenguaje de C y la tarea que me han encomendado es poder prender y apagar los leds del teclado, estuve leyendo información de como funcionan los teclados y he encontrado codigo que por algun motivo no ha querido funcionar.

De antemano muchas gracias.
  #2 (permalink)  
Antiguo 17/10/2009, 21:49
 
Fecha de Ingreso: julio-2009
Mensajes: 118
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Encender/Apagar leds del teclado con o c++

HOLA :me gustaria que compartieras conmigo esa info sobre los teclados mirandolo deporonto podria ayudarte se algo de c si deseas mandame la info y si tienes codigo mejor chao
  #3 (permalink)  
Antiguo 19/10/2009, 10:49
Avatar de Anubis_Slash  
Fecha de Ingreso: mayo-2009
Ubicación: aqui y haya
Mensajes: 173
Antigüedad: 15 años
Puntos: 5
Respuesta: Encender/Apagar leds del teclado con o c++

hola ainerplood, bienvenido al foro


porque no pones el codigo que tienes para poder ayudarte

Anubis_Slash
__________________
Bienvenidos los karmas.
Quejas, sugerencias o dudas, se awantan......
  #4 (permalink)  
Antiguo 19/10/2009, 11:50
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Encender/Apagar leds del teclado con o c++

Hola, gracia por su ayuda.

Bueno buscando un poco mas de informacion en internet encontre un header que se llama keyboard.h y al parecer tiene la funcion para trabajar los leds pero no se como implementarla o hacerla trabajar.

No puedo pegar los link para que vean la libreria pero le ponen en google keyboard.c y es el primer link (koders.com)

Y sobre el codigo que al parecer funciona es este:

/* Gh0st by WarGame. A proggy that flashes the leds of the keyboard - */

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/kd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <signal.h>

int fd;

void die(int signum)
{
printf("D3ad\n");
ioctl(fd, KDSETLED, 0x0);
close(fd);
exit(1);
}


int main(int argc,char *argv[])
{
int act = 0xff,interval;

if(argv[1] == NULL)
{
printf("Gh0st by WarGame\n");
printf("Usage: %s <flashing interval in seconds>\n",argv[0]);
exit(-1);
}

interval = atoi(argv[1]);

if ((fd = open("/dev/console", O_NOCTTY)) == -1)
{
perror("open");
exit(-1);
}

signal(SIGINT,die);
signal(SIGTERM,die);
signal(SIGQUIT,die);
signal(SIGTSTP,die);

printf("Gh0st\n");

while(1)
{
if(act == 0xff)
act = 0x07;
else
act = 0xff;

ioctl(fd,KDSETLED,act);
sleep(interval);
}
}


Este funciona bajo Linux (yo trabajo en ubuntu) lo que hace al parecer es hacer que el led correspondiente a Bloq Despl parpadee conforme trabaja el procesador o la red (Una de esas dos cosas) pero no estoy seguro y no entiendo como trabaja. Pero necesito prender/apagar los leds bajo windows XP y creo es muy diferente, ya que leyendo por internet hay que hacerlo con la API de windows, escribiendo y leyendo en la direccion de memoria donde se encuentra el teclado o algo asi.

Muchas gracias de nuevo por su interes a cesar15 y Anubis_Slash espero y me puedan ayudar soy muy novato en esto de C/C++, pero aprendo rapido.
  #5 (permalink)  
Antiguo 19/10/2009, 11:53
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Encender/Apagar leds del teclado con o c++

Perdonen pero al principio digo que se llama keyboard.h y no, se llama keyboard.c

Disculpas
  #6 (permalink)  
Antiguo 21/10/2009, 20:21
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Encender/Apagar leds del teclado con o c++

vale, vale que me he hecho de muchso codigos que no los he hecho funcionar

Pero que lo he hecho en VB6 y me ha quedado y buscando en el MSDN encontre el codigo que necesito en C++, pero en los dos casos es ocupando la API de windows (user32) y lo que necesito es interactuar con el teclado directamente mandando los comandos respectivos todo esto en C o C++.

Les dejo el codigo de VB, C++ y otro que creo hace lo que necesito pero no lo he hecho funcionar, el ultimo ya entendi el funcionamiento y es lo que necesito pero no lo he hecho funcionar si alguien me ayuda ha hacerlo trabajar y decirme lo que le hace falta estaria muy agradecido.


Visual Basic 6:

Código:
' Constantes para las teclas y otros
Const KEYEVENTF_KEYUP = &H2
Const KEYEVENTF_EXTENDEDKEY = &H1

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public aBD, aBM, BN
Public con1, con2, con3

Sub Pulsar_Tecla(Tecla As Long)
    Call keybd_event(Tecla, 0, 0, 0)
    Call keybd_event(Tecla, 0, KEYEVENTF_KEYUP, 0)
End Sub

Private Sub btnABloqDespl_Click()
    con3 = con3 + 1
    If con3 = 1 Then
       aBD = True
    Else
        aBD = False
        con3 = 0
    End If
End Sub

Private Sub btnABloqMayus_Click()
    con2 = con2 + 1
    If con2 = 1 Then
       aBM = True
    Else
        aBM = False
        con2 = 0
    End If
End Sub

Private Sub btnABloqNum_Click()
    con1 = con1 + 1
    If con1 = 1 Then
       aBN = True
    Else
        aBN = False
        con1 = 0
    End If
End Sub

Private Sub btnBloqDespl_Click()
    Call Pulsar_Tecla(&H91)
End Sub

Private Sub btnBloqMayus_Click()
    Call Pulsar_Tecla(&H14)
End Sub

Private Sub btnBloqNum_Click()
    Call Pulsar_Tecla(&H90)
End Sub

Private Sub Timer1_Timer()
    If con1 Then
        Call Pulsar_Tecla(&H90)
    End If
    
    If con2 Then
        Call Pulsar_Tecla(&H14)
    End If
    
    If con3 Then
        Call Pulsar_Tecla(&H91)
    End If
End Sub
en C++
Código:
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

void SetNumLock( BOOL bState)
{
     BYTE keyState[256];
     
     GetKeyboardState((LPBYTE)&keyState);
     
     if((bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)))
     {
         keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
         keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
     }    
}
int main(int argc, char *argv[])
{
    SetNumLock(TRUE);
    system("PAUSE");
    return EXIT_SUCCESS;
}

En C

Código:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <conio.h>



#define KEYBOARD_INT          9

#define KB_SPECIAL_MASK       0x3F
#define KB_CTRL_ALT_FLAG      (KB_CTRL_FLAG | KB_ALT_FLAG)


int three_finger_flag;
int key_led_flag;

int (*keyboard_callback)(int key) = NULL;

void (*keyboard_lowlevel_callback)(int key) = NULL;  /* killough 3/21/98 */

static int keyboard_installed; 

volatile char key[128];                   /* key pressed flags */

volatile int key_shifts = 0;


#define KEY_BUFFER_SIZE    256

static volatile int key_buffer[KEY_BUFFER_SIZE]; 
static volatile int key_buffer_start = 0;
static volatile int key_buffer_end = 0;
static volatile int key_extended = 0;
static volatile int key_pad_seq = 0;
static volatile int key_pause_loop = 0;

static int (*keypressed_hook)() = NULL;
static int (*readkey_hook)() = NULL;




static inline int kb_send_data(unsigned char data)
{
   long i;
   int resends = 4;
   int temp;

   do {

      outportb(0x60, data);
      i = 2000000L;

      while (--i) {
	 temp = inportb(0x60);

	 if (temp == 0xFA)
	    return 1;
	 else if (temp == 0xFE)
	    break;
      }
   }
   while ((resends-- > 0) && (i));

   return 0;
}



/* update_leds:
 *  Sets the state of the keyboard LED indicators.
 */
static inline void update_leds()
{
    if ((!kb_send_data(0xED)) || (!kb_send_data((key_shifts>>8) & 7)))
      kb_send_data(0xF4);
}


void set_leds(int leds)
{	/* killough 3/22/98 */
   if (leds < 0) {
      update_leds();
   }
   else {
      if ((!kb_send_data(0xED)) || (!kb_send_data((leds>>8)&7)))
	 kb_send_data(0xF4);
   } 	/* killough 3/22/98 */
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:04.