|
本文摘自:cubie官网论坛 http://forum.cubietech.com/forum.php?mod=viewthread&tid=2993&extra=page%3D1
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
|
|