FriendlyARM tiny6410 一步一步学与思(2)---buttons application

甄越
2023-12-01
分类: Embedded Linux   408人阅读  评论(0)  收藏  举报

    今天开始编写按键程序,首先还是按友善提供的例程来学习,例程实现的功能是按下某个键,输出相应的按键序号UP,松开则输出相应的按键序号DOWN。运行完全没问题,输出也正常。例程源代码如下:

   

[cpp]  view plain copy
  1. /*******filename:test_buttons*******/  
  2.   
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #include <unistd.h>  
  6.   
  7. #include <sys/ioctl.h>  
  8. #include <sys/types.h>  
  9. #include <sys/stat.h>  
  10. #include <fcntl.h>  
  11. #include <sys/select.h>  
  12. #include <sys/time.h>  
  13. #include <errno.h>  
  14. int main(void)  
  15. {  
  16. int buttons_fd;  
  17. char buttons[6] = {'0''0''0''0''0''0'};  
  18. buttons_fd = open("/dev/buttons", 0);  
  19. if (buttons_fd < 0) {  
  20. perror("open device buttons");  
  21.   
  22. exit(1);  
  23. }  
  24. for (;;) {  
  25. char current_buttons[6];  
  26. int count_of_changed_key;  
  27. int i;  
  28. if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) {  
  29. perror("read buttons:");  
  30. exit(1);  
  31. }  
  32. for (i = 0, count_of_changed_key = 0; i < sizeof buttons / sizeof buttons[0]; i++) {  
  33. if (buttons[i] != current_buttons[i]) {  
  34. buttons[i] = current_buttons[i];  
  35. printf("%skey %d is %s", count_of_changed_key? ", """, i+1, buttons[i] ==  
  36. '0' ? "up" : "down");  
  37. count_of_changed_key++;  
  38. }  
  39. }  
  40. if (count_of_changed_key) {  
  41. printf("\n");  
  42. }  
  43. }  
  44. close(buttons_fd);  
  45. return 0;  
  46. }  


 

    1、代码中红色部分的printf语句,我没看懂为什么这么写,为什么不写成:printf("key %d is %s\n",i+1,buttons[i]=='0'?"up":"down");

    2、下载到开发板运行,发现有时候按下一个按键会出来好几个UP和DOWN,应该是例程中没考虑按键防抖的原因;

    3、前一篇学习了LED,所以我想写一个程序,实现按下键对应灯亮,松开灯灭的这样一个程序,同时加上按键防抖。

 

*******************************************************************************************************************************************************************************************************************

    以下是我改进后的代码:

   

[cpp]  view plain copy
  1. /********filename:test_buttons_leds.c**********/  
  2.   
  3. #include<stdio.h>  
  4. #include<stdlib.h>  
  5. #include<unistd.h>  
  6. #include<sys/ioctl.h>  
  7. #include<sys/types.h>  
  8. #include<sys/stat.h>  
  9. #include<fcntl.h>  
  10. #include<sys/select.h>  
  11. #include<sys/time.h>  
  12. #include<errno.h>  
  13.   
  14. int main(void)  
  15. {  
  16.    int buttons_fd,leds_fd;  
  17.    char buttons[6]={'0','0','0','0','0','0'};  //save state of buttons  
  18.      
  19.    buttons_fd=open("dev/buttons",0);  
  20.    leds_fd=open("dev/leds",0);  
  21.    if(buttons_fd<0||leds_fd<0){  
  22.       perror("open device buttons and leds");  
  23.       exit(1);  
  24.    }  
  25.    for(;;){  
  26.        char current_buttons[6];    //save current state of buttons  
  27.        int i,led_stat;  
  28.        if(read(buttons_fd,current_buttons,sizeof(current_buttons))!=sizeof(current_buttons)){  
  29.           perror("read buttons:");  
  30.           exit(1);  
  31.        }  
  32.        for(i=0;i<sizeof(buttons)/sizeof(buttons[0]);i++){  
  33.           if(buttons[i]!=current_buttons[i])  
  34.           usleep(10000);      //延时10ms防抖  
  35.           if(buttons[i]!=current_buttons[i]){  
  36.              buttons[i]=current_buttons[i];  
  37.              printf("key %d is %s\n",i+1,buttons[i]=='0'?"up":"down");  
  38.              led_stat=buttons[i]-0x30;     //将字符转换成数字  
  39.              ioctl(leds_fd,led_stat,i);  
  40.           }  
  41.        }  
  42.    }  
  43.    close(leds_fd);  
  44.    close(buttons_fd);  
  45.    return 0;  
  46. }  


 

    下载到开发板运行,防抖效果很好,同时实现了按键点灯的功能。

     过程中遇到的问题:

     因为后面点灯用到函数ioctl(),需要向它传递buttons[i],但例程中定义的是char型,所以我想改成int型不是更方便么,然后对程序了做了相应的调整,改完之后,再下载运行,出现:read buttons::success,然后程序终止。不知道为什么会有这个现象,由输出中有"read buttons:"所以我怀疑是read()函数那地方的原因,未解决。。。

 


 类似资料: