`
家有小宝,想到开发一个电子琴给她添点快乐。
MAX32660的GPIO数量有限,只采用的8个GPIO按键输入8个音符信号,一个GPIO输出音乐到蜂鸣器发出对应音符。
搭建电路如图:
先在面包做个试验,实物连接如图:
根据C调频率对应表,设置每一个音符的输出频率。
使用mxc_delay( )延时单位时间是1us,一个周期的值就是1000000us(1百万us就是1s)除以音符的频率。
这里采用传统的做法,大循环扫描是否有按键按下,如有键按下,播放对应音符,代码如下:
- /* **** Includes **** */
- #include
- #include
- #include "mxc_config.h"
- #include "board.h"
- #include "gpio.h"
- #include "tmr_utils.h"
- #include "mxc_delay.h"
- /* **** Definitions **** */
- //Input Key define.
- #define GPIO_PORT_IN PORT_0
- #define GPIO_PIN_IN1 PIN_12
- #define GPIO_PIN_IN2 PIN_2
- #define GPIO_PIN_IN3 PIN_3
- #define GPIO_PIN_IN4 PIN_4
- #define GPIO_PIN_IN5 PIN_5
- #define GPIO_PIN_IN6 PIN_6
- #define GPIO_PIN_IN7 PIN_7
- #define GPIO_PIN_IN8 PIN_13
- //Output Beep define.
- #define GPIO_PORT_OUT_BEEP PORT_0
- #define GPIO_PIN_OUT_BEEP PIN_9
- //Tone frequency define.
- #define CM1 523 //Do
- #define CM2 587 //Re
- #define CM3 659 //Mi
- #define CM4 698 //Fa
- #define CM5 784 //So
- #define CM6 880 //la
- #define CM7 988 //Si
- #define CH1 1046 //Do~
- /* **** Functions **** */
- //Display Tone with frequency
- void playTone(int tone, long duration, gpio_cfg_t BeepPin)
- {
- long i,F_us;
- F_us = 1000000/tone;
- for(i = 0; i < duration * 1000; i += tone){
- GPIO_OutSet(&BeepPin);
- mxc_delay(F_us/2);
- GPIO_OutClr(&BeepPin);
- mxc_delay(F_us/2);
- }
- }
- int main(void)
- {
- gpio_cfg_t gpio_in1;
- gpio_cfg_t gpio_in2;
- gpio_cfg_t gpio_in3;
- gpio_cfg_t gpio_in4;
- gpio_cfg_t gpio_in5;
- gpio_cfg_t gpio_in6;
- gpio_cfg_t gpio_in7;
- gpio_cfg_t gpio_in8;
- gpio_cfg_t BeepPin;
- int volum = 50;
- printf("
- ***** Electronic Piano ******
- ");
- printf("Keys Input P0.12 13 2 3 4 5 6 7 and Beep outputs P0.9.
- ");
- /* Setup input pin. */
- gpio_in1.port = GPIO_PORT_IN;
- gpio_in1.mask = GPIO_PIN_IN1;
- gpio_in1.pad = GPIO_PAD_PULL_DOWN;
- gpio_in1.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in1);
- gpio_in2.port = GPIO_PORT_IN;
- gpio_in2.mask = GPIO_PIN_IN2;
- gpio_in2.pad = GPIO_PAD_PULL_DOWN;
- gpio_in2.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in2);
- gpio_in3.port = GPIO_PORT_IN;
- gpio_in3.mask = GPIO_PIN_IN3;
- gpio_in3.pad = GPIO_PAD_PULL_DOWN;
- gpio_in3.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in3);
- gpio_in4.port = GPIO_PORT_IN;
- gpio_in4.mask = GPIO_PIN_IN4;
- gpio_in4.pad = GPIO_PAD_PULL_DOWN;
- gpio_in4.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in4);
- gpio_in5.port = GPIO_PORT_IN;
- gpio_in5.mask = GPIO_PIN_IN5;
- gpio_in5.pad = GPIO_PAD_PULL_DOWN;
- gpio_in5.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in5);
- gpio_in6.port = GPIO_PORT_IN;
- gpio_in6.mask = GPIO_PIN_IN6;
- gpio_in6.pad = GPIO_PAD_PULL_DOWN;
- gpio_in6.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in6);
- gpio_in7.port = GPIO_PORT_IN;
- gpio_in7.mask = GPIO_PIN_IN7;
- gpio_in7.pad = GPIO_PAD_PULL_DOWN;
- gpio_in7.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in7);
- gpio_in8.port = GPIO_PORT_IN;
- gpio_in8.mask = GPIO_PIN_IN8;
- gpio_in8.pad = GPIO_PAD_PULL_DOWN;
- gpio_in8.func = GPIO_FUNC_IN;
- GPIO_Config(&gpio_in8);
- /* Setup output pin. */
- BeepPin.port = GPIO_PORT_OUT_BEEP;
- BeepPin.mask = GPIO_PIN_OUT_BEEP;
- BeepPin.pad = GPIO_PAD_NONE;
- BeepPin.func = GPIO_FUNC_OUT;
- GPIO_Config(&BeepPin);
- while (1) {
- // Read state of the input pin.
- if(GPIO_InGet(&gpio_in1))
- {
- playTone(CM1,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in2))
- {
- playTone(CM2,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in3))
- {
- playTone(CM3,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in4))
- {
- playTone(CM4,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in5))
- {
- playTone(CM5,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in6))
- {
- playTone(CM6,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in7))
- {
- playTone(CM7,volum,BeepPin);
- }
- if(GPIO_InGet(&gpio_in8))
- {
- playTone(CH1,volum,BeepPin);
- }
- }
- }
实验结果完美,每个音符都能正常弹出,下一步就是搭建硬件了。
这里跳帽使用3.3v的供电,这样蜂鸣器声音更加响亮逼真。
在使用GPIO1 和GPIO8作为按键输入时,不知道什么原因会一直有按键触发。求指教。
`