tiny6410按键应用注释

  1 #include <stdio.h>
  2 #include <termios.h>
  3 #include <unistd.h>
  4 #include <stdlib.h>
  5 #include <sys/ioctl.h>
  6 #include <sys/types.h>
  7 #include <sys/stat.h>
  8 #include <fcntl.h>
  9 
 10 #define PWM_IOCTL_SET_FREQ        1
 11 #define PWM_IOCTL_STOP            0
 12 
 13 #define    ESC_KEY        0x1b
 14 
 15 static int getch(void)
 16 {
 17     struct termios oldt,newt;
 18     int ch;
 19 
 20     //判断标准输入是否为终端
 21     if (!isatty(STDIN_FILENO)) {
 22         fprintf(stderr, "this problem should be run at a terminal\n");
 23         exit(1);
 24     }
 25     //获取终端的相关参数
 26     if(tcgetattr(STDIN_FILENO, &oldt) < 0) {
 27         perror("save the terminal setting");
 28         exit(1);
 29     }
 30 
 31     //设置终端的相关参数
 32     newt = oldt;
 33     newt.c_lflag &= ~( ICANON | ECHO ); //不使用标准模式 不显示终端字符
 34     if(tcsetattr(STDIN_FILENO,TCSANOW, &newt) < 0) {
 35         perror("set terminal");
 36         exit(1);
 37     }
 38 
 39     ch = getchar();
 40 
 41     // restore termial setting
 42     if(tcsetattr(STDIN_FILENO,TCSANOW,&oldt) < 0) {
 43         perror("restore the termial setting");
 44         exit(1);
 45     }
 46     return ch;
 47 }
 48 
 49 static int fd = -1;
 50 static void close_buzzer(void);
 51 static void open_buzzer(void)
 52 {
 53     fd = open("/dev/pwm", 0);
 54     if (fd < 0) {
 55         perror("open pwm_buzzer device");
 56         exit(1);
 57     }
 58 
 59     // any function exit call will stop the buzzer
 60     atexit(close_buzzer); //exit函数运行时会调用close_buzzer进行一些清理工作
 61 }
 62 
 63 static void close_buzzer(void)
 64 {
 65     if (fd >= 0) {
 66         ioctl(fd, PWM_IOCTL_STOP);
 67         if (ioctl(fd, 2) < 0) {
 68             perror("ioctl 2:");
 69         }
 70         close(fd);
 71         fd = -1;
 72     }
 73 }
 74 
 75 static void set_buzzer_freq(int freq)
 76 {
 77     // this IOCTL command is the key to set frequency
 78     int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq);
 79     if(ret < 0) {
 80         perror("set the frequency of the buzzer");
 81         exit(1);
 82     }
 83 }
 84 static void stop_buzzer(void)
 85 {
 86     int ret = ioctl(fd, PWM_IOCTL_STOP);
 87     if(ret < 0) {
 88         perror("stop the buzzer");
 89         exit(1);
 90     }
 91     if (ioctl(fd, 2) < 0) {
 92         perror("ioctl 2:");
 93     }
 94 }
 95 
 96 int main(int argc, char **argv)
 97 {
 98     int freq = 1000 ;
 99     
100     open_buzzer();
101 
102     printf( "\nBUZZER TEST ( PWM Control )\n" );
103     printf( "Press +/- to increase/reduce the frequency of the BUZZER\n" ) ;
104     printf( "Press 'ESC' key to Exit this program\n\n" );
105     
106     
107     while( 1 )
108     {
109         int key;
110 
111         set_buzzer_freq(freq);
112         printf( "\tFreq = %d\n", freq );
113 
114         key = getch();//此处会阻塞 一直到读取到字符
115 
116         switch(key) {
117         case '+':
118             if( freq < 20000 )
119                 freq += 10;
120             break;
121 
122         case '-':
123             if( freq > 11 )
124                 freq -= 10 ;
125             break;
126 
127         case ESC_KEY:
128         case EOF:
129             stop_buzzer();
130             exit(0);
131 
132         default:
133             break;
134         }
135     }
136 }

 

posted @ 2019-06-12 11:24  robinjr  阅读(39)  评论(0)    收藏  举报