stm32的环境下用三个按键实现音乐的选择,播放和暂停的主函数参考代码
时间: 2024-03-17 17:41:24 浏览: 27
好的,下面是一个简单的参考代码,实现了在STM32环境下使用三个按键控制音乐的选择、播放和暂停:
```c
#include "stm32f10x.h" //包含头文件
/* 定义引脚 */
#define KEY1_GPIO_PORT GPIOE
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY2_GPIO_PORT GPIOE
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY2_GPIO_PIN GPIO_Pin_1
#define KEY3_GPIO_PORT GPIOE
#define KEY3_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY3_GPIO_PIN GPIO_Pin_2
/* 定义全局变量 */
uint8_t music_num = 0; //音乐编号
uint8_t is_playing = 0; //是否正在播放
/* 函数声明 */
void KEY_Config(void); //按键初始化函数
void TIM_Config(void); //定时器初始化函数
/* 主函数 */
int main(void)
{
KEY_Config(); //按键初始化
TIM_Config(); //定时器初始化
/* 死循环 */
while(1)
{
if(GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == 0) //按键1被按下
{
music_num = (music_num + 1) % 3; //切换音乐编号
}
if(GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == 0) //按键2被按下
{
if(is_playing == 0) //如果当前未播放
{
TIM_Cmd(TIM2, ENABLE); //启动定时器2,开始播放
is_playing = 1; //设置正在播放标志
}
else //如果当前正在播放
{
TIM_Cmd(TIM2, DISABLE); //停止定时器2,暂停播放
is_playing = 0; //清除正在播放标志
}
}
if(GPIO_ReadInputDataBit(KEY3_GPIO_PORT, KEY3_GPIO_PIN) == 0) //按键3被按下
{
TIM_Cmd(TIM2, DISABLE); //停止定时器2,结束播放
is_playing = 0; //清除正在播放标志
}
}
}
/* 按键初始化函数 */
void KEY_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 第一步:使能按键引脚的时钟 */
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK | KEY2_GPIO_CLK | KEY3_GPIO_CLK, ENABLE);
/* 第二步:配置按键引脚为输入模式 */
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure);
}
/* 定时器初始化函数 */
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 第一步:使能定时器2的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 第二步:配置定时器2的参数 */
TIM_TimeBaseStructure.TIM_Period = 999; //自动重装值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //预分频值
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* 第三步:配置定时器2的中断 */
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能定时器2更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //定时器2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/* 定时器2中断处理函数 */
void TIM2_IRQHandler(void)
{
/* 第一步:清除中断标志 */
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* 第二步:根据音乐编号播放不同的音乐 */
switch(music_num)
{
case 0: //播放音乐0
//TODO: 实现播放音乐0的代码
break;
case 1: //播放音乐1
//TODO: 实现播放音乐1的代码
break;
case 2: //播放音乐2
//TODO: 实现播放音乐2的代码
break;
}
}
```
以上代码仅供参考,需要根据具体的硬件平台和需求进行修改和优化。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)