AD按键+蜂鸣器——小钢琴
硬件:CT+DVK570
主要的编程思想:
1.更改蜂鸣器的频率,根据音阶频率表编写相应的歌曲。
2.AD按键与蜂鸣器频率的结合。
源码:- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <linux/input.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/ioctl.h>
- /*音阶频率转换*/
- #define PWM_PERIOD1 "echo 2093hz > /sys/class/pwm-sunxi/pwm0/period"
-
- int main(int argc, char **argv)
- {
- int fd;
- int ret;
- int count;
- char devname_head[20] = "/dev/input/";
- char dev_name[20];
- struct input_event *key_ev;
-
- if(argc < 2) {
- printf("Please input 'test_key event*'\n");
- exit(1);
- }
- else {
- strcpy(dev_name, devname_head);
- strcat(dev_name, argv[1]); }
-
- fd = open(dev_name, O_RDONLY);
-
- if(fd < 0) {
- perror("error to open /dev/input/event*\n");
- exit(1);
- }
-
- key_ev = malloc(sizeof(struct input_event));
- memset(key_ev,0,sizeof(key_ev));
-
- while(1)
- {
- ret = read(fd,key_ev,sizeof(struct input_event));
- if(ret < 0)
- {
- printf("read error\n");
- exit(1);
- }
-
- if(key_ev->type != EV_KEY) continue;
- else
- {
- switch(key_ev->code)
- {
- /*按键1被按下,蜂鸣器发do的音。按键1被释放时,蜂鸣器停止发声。注:key_ev->code为115时触发按键1。key_ev->value为1时;按键被按下,key_->value不为1时,按键被释放。*/
- case 115:
- if(1==key_ev->value)
- {
- system(PWM_PERIOD1);
- usleep(500*500);
- }
- else
- {
- system(PWM_PERIOD20);
- usleep(500*500);
- }
- break;
- case 114:
-
- break;
- case 139:
-
- break;
- case 217:
-
- break;
- case 102:
-
- break;
- case 1:
-
- break;
- case 28:
-
- break;
- default:
-
- break;
- }
- }
- }
- close(fd);
- return 0;
- }
复制代码 1.创建一个命为”piano.c”的文件:vim piano.c
2.将源码拷贝到文件里(PS:由于字数关系,我只给出了部分源码)
3.编译源码:gcc piano.c -o piano
4.短接上 ADKEY 跳线帽,在终端上输入:./piano event*
注意:
1)这里的 event*是多少,要根据自己的实际情况,具体查看
/dev/input 目录:ls /dev/input/;
2)如果没有加载按键驱动,请执行:modprobe sun4i-keyboard
5.在DVK570中随意按下一个按键,蜂鸣器便会发出相应音符的声音。此时,你便可以开始弹奏属于你的音乐篇章。
音阶频率表:http://wenku.baidu.com/view/b3921b22192e45361066f5b3.html?re=view
演示:http://www.meipai.com/media/68851860 |