Linux button按键驱动 多次中断控制相应LED灯亮灭闪

来源:互联网 发布:失业金数据与非农数据 编辑:程序博客网 时间:2024/05/18 02:11

下午的时候完成了按键驱动的测试程序,接下来贴上新鲜出炉的按键控制相应LED灯亮灭闪的程序。


实现功能:按第一下LED亮,再按一下则闪,第三下熄灭LED。

/********************************************************************************* *      Copyright:  (C) 2015 songyong<handy_skyoutlook.com> *                  All rights reserved. * *       Filename:  copy.c *    Description:  This file  *                  *        Version:  1.0.0(2015年04月18日) *         Author:  sky <handy_sky@outlook.com> *      ChangeLog:  1, Release initial version on "2015年04月18日 19时17分14秒" *                  ********************************************************************************/#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<unistd.h>#include<sys/ioctl.h>#include<sys/time.h>#define PLATDRV_MAGIC             0x60#define LED_OFF                   _IO (PLATDRV_MAGIC, 0x18)#define LED_ON                    _IO (PLATDRV_MAGIC, 0x19)#define LED_BLINK                 _IO (PLATDRV_MAGIC, 0x1A)#define BUTTON_STATUS  4 #define KEY1  0x1 #define KEY2  0x2 #define KEY3  0x4 #define KEY4  0x8 /******************************************************************************** *  Description: *   Input Args: *  Output Args: * Return Value: ********************************************************************************/int main (int argc, char **argv){    int i = 1;    int j = 1;    int k = 1;    int l = 1;    int button_fd;    int led_fd;    int ret;    int current_button;    button_fd = open("/dev/button",0);    if(button_fd < 0)    {        printf("Open buttons device faild!\n");        exit(1);    }    led_fd = open("/dev/led",O_RDWR);    if(led_fd < 0)    {        printf("Open led device faild!\n");        exit(1);    }    while(1)    {    if (ret != sizeof(current_button) )         {           printf("Read button device faild.\n");          }    else if(current_button == KEY1)         {            switch(i%3)            {                case 1:                     ioctl(led_fd,LED_ON,0);                    i++;break;                case 2:                     ioctl(led_fd,LED_BLINK,0);                    i++;break;                case 0:                     ioctl(led_fd,LED_OFF,0);                    i++;break;            }        }    else if(current_button == KEY2)         {            switch(j%3)            {                case 1:                     ioctl(led_fd,LED_ON,1);                    j++;break;                case 2:                     ioctl(led_fd,LED_BLIKN,1);                    j++;break;                case 0:                     ioctl(led_fd,LED_OFF,1);                    j++;break;            }        }    else if(current_button == KEY3)         {            switch(k%3)            {                case 1:                     ioctl(led_fd,LED_ON,2);                    k++;break;                case 2:                     ioctl(led_fd,LED_BLINK,2);                    k++;break;                case 0:                     ioctl(led_fd,LED_OFF,2);                    k++;break;            }        }    else if(current_button == KEY4) /*        {            switch(l%3)            {                case 1:                     ioctl(led_fd,LED_ON,3);                    l++;break;                case 2:                     ioctl(led_fd,LED_BLINK,3);                    l++;break;                case 0:                     ioctl(led_fd,LED_OFF,3);                    l++;break;            }        }    }    close(button_fd);    close(led_fd);    return 0;} /* ----- End of main() ----- */


</pre>当然你也可以在一开始利用select来监听,当可读是就进行读取<pre name="code" class="html">        FD_ZERO(&rds);        FD_SET(fd,&rds);        ret=select(fd+1,&rds,NULL,NULL,NULL);        if(ret<0)        {            printf("select failure\n");            exit(1);        }        if(ret==0)        {            printf("select timeout\n");        }        else if(FD_ISSET(fd,&rds))        {            read(fd,&but_status,sizeof(but_status));                  }

交叉编译生成button_song_led 后具体到开发板上面

因为是两个驱动,所以一定要insmod plat_led与plat_button两个驱动。

chmod 777 button_song_led

./button_song_led 后就可以通过按键来控制相应的LED灯的亮灭了。




1 0
原创粉丝点击