美文网首页程序员
C编程实现键盘LED灯闪烁方法2

C编程实现键盘LED灯闪烁方法2

作者: 网路元素 | 来源:发表于2019-10-15 00:30 被阅读0次

在《C编程实现键盘LED灯闪烁》一文中使用了定时器和ioctl的方式实现键盘LED灯周期性闪烁,而键盘本身作为一个输入设备,那么在Linux下也有对应的input_event,故而本次使用它来实现一次,本次很简陋,采用死循环的方式,省去了定时器的麻烦。

关于input_event,需要引用到Linux内核源码的include/linux/input.h头文件,而在应用程序中,我们采用很简单的write系统调用来设置,而写入的数据格式如下:

struct input_event {
        struct timeval time;
        __u16 type;
        __u16 code;
        __s32 value;
};

对于我们来说,本次需要设置的type是EV_LED,而code则分别是LED_NUML、LED_CAPSL、LED_SCROLLL,value为1时亮,为0时灭。好了,对这初步了解后,那我们write的对象是谁呢?我们通过/proc/bus/input/devices可以找到我们的键盘对应的event,我这边找到的信息如下:

I: Bus=0003 Vendor=1241 Product=1603 Version=0110
N: Name=" USB Keyboard"
P: Phys=usb-0000:00:1d.7-3.1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.1/2-3.1:1.0/input/input4
U: Uniq=
H: Handlers=sysrq kbd event3
B: PROP=0
B: EV=120013
B: KEY=1000000000007 ff800000000007ff febeffdff3cfffff fffffffffffffffe
B: MSC=10
B: LED=7

从上面看到对应是event3,那么等会操作/dev/input/event3文件即可。至此,基本的内容说明了一下,下面还是上代码吧:

#include <stdio.h>
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//find from:/proc/bus/input/devices or /dev/input/*
#define KB_INPUT_EVENT_PATH "/dev/input/event3"

int main(void)
{
        int fd = 0;
        struct input_event ev;

        ev.type = EV_LED;
        fd = open(KB_INPUT_EVENT_PATH, O_RDWR);
        if (fd < 0) {
                printf("Open keyboard input event file failed!\n");
                return 1;
        }

        while(1) {
                ev.code = LED_NUML;
                ev.value = 1;
                write(fd, &ev, sizeof(ev));
                ev.code = LED_CAPSL;
                write(fd, &ev, sizeof(ev));
                ev.code = LED_SCROLLL;
                write(fd, &ev, sizeof(ev));
                sleep(1);
                ev.value = 0;
                write(fd, &ev, sizeof(ev));
                ev.code = LED_CAPSL;
                write(fd, &ev, sizeof(ev));
                ev.code = LED_NUML;
                write(fd, &ev, sizeof(ev));
                sleep(1);
        }

        return 0;
}

其对应的Makefile文件内容如下:

all:
        gcc -o timer_keyboard_led_flash timer_keyboard_led_flash.c

clean:
        rm -rf timer_keyboard_led_flash

对应的源码文件目录树如下: 

/home/xinu/xinu/c_cpp/timer_keyboard_led_flash_input_event/
├── Makefile
└── timer_keyboard_led_flash.c 

记得make完成后要用sudo执行。 

参考网址: 

http://tscsh.blog.163.com/blog/static/2003201032013225103629425/
http://blog.csdn.net/chenzhixin/article/details/2173530
http://askubuntu.com/questions/321512/how-to-set-or-clear-usb-keyboard-leds

相关文章

  • C编程实现键盘LED灯闪烁方法2

    在《C编程实现键盘LED灯闪烁》一文中使用了定时器和ioctl的方式实现键盘LED灯周期性闪烁,而键盘本身作为一个...

  • C编程实现键盘LED灯闪烁

    在《Shell脚本实现键盘LED灯闪烁》一文中,我们已感受到了控制的乐趣,一步步向硬件逼近,这次我们在Linux下...

  • shell脚本实现键盘LED灯闪烁

    很幸运,在Ubuntu13.10的Terminal下发现了setleds命令,直接运行该命令后有如下输出: xin...

  • OSAL-led

    1、 LED灯设置 2、 LED灯闪烁 官方把代码写好了且开源了,大家有空可以看看(hal_led.c),学习一下...

  • 跪求单片机大佬

    [题]LED流水灯左循环点亮:用AT89C51单片机和C51语言实现8个LED灯的左循环依次流水点亮,两个LED灯...

  • PWM实现“流星雨”效果

    1、不同频率LED灯闪烁 接下来我们以下面LED灯的闪烁代码为例子,改变延时长短来看LED灯的效果 通过三个对比实...

  • stm32学习之路--点亮一个LED编码

    目标:使用库函数一个LED闪烁 main.c led.c led.h

  • 51单片机之LED闪烁,简单的延时函数

    LED灯原理图 点亮LED的几种方法 以下是简单的延时函数,可以作为模块函数使用 使用简单的延时函数做LED闪烁

  • 08 LED流水灯

    单片机STC89C52学习——07 LED闪烁 汇总:00 单片机STC89C52学习参考教程:普中科技 1 编程...

  • 07 LED闪烁

    单片机STC89C52学习——07 LED闪烁 汇总:00 单片机STC89C52学习参考教程:普中科技 1 编程...

网友评论

    本文标题:C编程实现键盘LED灯闪烁方法2

    本文链接:https://www.haomeiwen.com/subject/petryctx.html