五秒输出和灯的亮灭

mycdev.c

#include <linux/init.h>

#include <linux/module.h>

#include<linux/of.h>

#include<linux/of_gpio.h>

#include<linux/gpio.h>

#include<linux/timer.h>

/*       myled

    {

        led1-gpio=<&gpioe 10 0>;

        led2-gpio=<&gpiof 10 0>;

        led3-gpio=<&gpioe 8 0>;          

    };

*/

struct device_node *dnode;

unsigned int gpiono1;

unsigned int gpiono2;

unsigned int gpiono3;

struct timer_list mytimer;

//定时器处理函数

 void mytimer_function(struct timer_list *timer)

 {

    //LED1状态取反

    gpiod_set_value(gpiono1,!gpiod_get_value(gpiono1));

    //LED2状态取反

    gpiod_set_value(gpiono2,!gpiod_get_value(gpiono2));

    //LED3状态取反

    gpiod_set_value(gpiono3,!gpiod_get_value(gpiono3));

    printf("hello world\n");

    //再次启用定时器

    mod_timer(timer,jiffies+500);

 }

static int __init mycdev_init(void)

{

    //解析设备树节点信息

    dnode=of_find_node_by_path("/myled");

    if(dnode==NULL)

    {

        printk("解析设备树节点失败\n");

        return -ENXIO;

    }

    //获取LED1 GPIO编号

    gpiono1=gpiod_get_from_of_node(dnode,"led1-gpio",0,GPIOD_OUT_LOW,NULL);

    if(IS_ERR(gpiono1))

    {

        printk("申请gpio信息失败\n");

        return -PTR_ERR(gpiono1);

    }


 

    //获取LED2 GPIO编号

    gpiono2=gpiod_get_from_of_node(dnode,"led2-gpio",0,GPIOD_OUT_LOW,NULL);

    if(IS_ERR(gpiono2))

    {

        printk("申请gpio信息失败\n");

        return -PTR_ERR(gpiono2);

    }

    //获取LED3 GPIO编号

    gpiono3=gpiod_get_from_of_node(dnode,"led3-gpio",0,GPIOD_OUT_LOW,NULL);

    if(IS_ERR(gpiono3))

    {

        printk("申请gpio信息失败\n");

        return -PTR_ERR(gpiono3);

    }

    //初始化定时器对象

    timer_setup(&mytimer,mytimer_function,0);

    mytimer.expires=jiffies+500;//定时5s;

    //注册定时器

    add_timer(&mytimer);

    return 0;

}

static void __exit mycdev_exit(void)

{

    //注销定时器

    del_timer(&mytimer);

    gpio_set_value(gpiono1,0);

    //释放GPIO编号1

    gpio_free(gpiono1);

    gpio_set_value(gpiono2,0);

    //释放GPIO编号2

    gpio_free(gpiono2);

    gpio_set_value(gpiono3,0);

    //释放GPIO编号

    gpio_free(gpiono3);

}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

led.c

#include <stdlib.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <unistd.h>

#include <string.h>

int main(int argc,const char * argv[])

{

    int a=0;

    char buf[128] = "";

    char buf1[128] = "";

    int fd1=open("/dev/myled0",O_RDWR);

    int fd2=open("/dev/myled1",O_RDWR);

    int fd3=open("/dev/myled2",O_RDWR);

    if(fd1<0)

    {

        printf("打开设备文件1失败\n");

        exit(-1);

    }

    if(fd2<0)

    {

        printf("打开设备文件2失败\n");

        exit(-1);

    }

    if(fd3<0)

    {

        printf("打开设备文件3失败\n");

        exit(-1);

    }

    memset(buf,0,sizeof(buf));

    while(1)

    {

        printf("请输入灯的控制(1开灯/0关灯) => ");

        scanf("%d",&a);

       

        write(fd1,buf,sizeof(buf));

        write(fd2,buf,sizeof(buf));

        write(fd3,buf,sizeof(buf));

        if(a == 1)

        {

            strcpy(buf,"on");

            write(fd1,buf,sizeof(buf));

            write(fd2,buf,sizeof(buf));

            write(fd3,buf,sizeof(buf));            

        }

        else if(a == 0)

        {

            strcpy(buf,"off");

            write(fd1,buf,sizeof(buf));

            write(fd2,buf,sizeof(buf));

            write(fd3,buf,sizeof(buf));            

        }

        read(fd1,buf1,sizeof(buf));

        printf("buf1:%s\n",buf1);

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现这个功能的 C 语言代码如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int i; while (1) { printf("\n"); for (i = 0; i < 5; i++) { sleep(1); } printf("\n"); for (i = 0; i < 5; i++) { sleep(1); } } return 0; } ``` 该程序使用 `while` 循环实现了五秒五秒的功能,其中 `sleep` 函数可让程序暂停一段时间,从而实现延时操作。每次循环都会先输出 "",然后暂停五秒,再输出 "",再暂停五秒,如此循环往复。 ### 回答2: 在C语言中,实现按下按钮后五秒五秒的操作可以通过以下代码实现: ```c #include <stdio.h> #include <unistd.h> int main() { int button = 0; while (1) { if (button == 1) { // 按钮按下 printf("\n"); sleep(5); // 等待五秒 printf("\n"); sleep(5); // 等待五秒 button = 0; } } return 0; } ``` 首先,我们定义了一个整数变量`button`,来表示按钮的状态,初始值为0,表示未按下。 在循环中,我们使用`if`语句判断按钮的状态。如果按钮按下(`button`值为1),则打印""并使用`sleep(5)`函数等待五秒。接着,打印""并再次使用`sleep(5)`函数等待五秒。 最后,将按钮状态设为0,表示按钮未按下,继续循环等待下一次按钮按下的操作。 ### 回答3: 在C语言中实现按下按钮,五秒五秒的功能,可以使用循环结构和计时器来实现。代码如下: ```c #include <stdio.h> #include <stdbool.h> #include <time.h> int main() { bool isButtonPressed = false; time_t startTime, currentTime; int lightOnTime = 5; // 时间(秒) int lightOffTime = 5; // 时间(秒) while (true) { if (!isButtonPressed) { printf("按下按钮\n"); isButtonPressed = true; time(&startTime); // 记录当前时间作为起始时间 } // 获取当前时间 time(&currentTime); // 计算时间差(以秒为单位) int elapsedTime = difftime(currentTime, startTime); // 判断应该是还是 if (elapsedTime < lightOnTime) { printf("\n"); } else if (elapsedTime >= lightOnTime && elapsedTime < lightOnTime + lightOffTime) { printf("\n"); } else { isButtonPressed = false; // 重置按钮状态 } } return 0; } ``` 以上代码使用了一个无限循环,当按钮状态为未按下时,会输出"按下按钮"的提示,并记录当前时间作为的起始时间。然后在循环中获取当前时间,并计算与起始时间的时间差。根据时间差的大小,判断应该是还是,并输出相应的提示。当时间差超过时间加时间时,重置按钮状态,进入下一轮循环,等待下一次按钮按下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值