STM32F103ZET6如何让按键和蜂鸣器的音乐同时中断?
代码如下
main.c:
#include"systick.h"
#include"weidai.h"
#include "seg.h"
#include "key.h"
#include "exti.h"
#include "beep.h"
u16 FQ[]={
0,650,660,670,680,690,
700,710,720,730,740,750,760,770,780,790,
800,810,820,830,840,850,860,870,880,890,
900,910,920,930,940,950,960,970,980,990,
1000,1010,1020,1030,1040,1050,1060,1070,1080,1090,
1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,
1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,
1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,
1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,1500,1510,1520,1530,1540,1550};
u32 di []={0,131,147,165,175,196,221,248,};
u32 zhong[]={0,262,294,330,349,392,440,523};
u32 gao[]={0,525,589,661,700,786,882,990};
u32 music[]={6,2,1, 1,2,2, 5,2,2, 1,2,2, 4,2,1, 5,1,1, 6,1,1, 5,2,2, 1,2,2, 1,2,1, 5,2,1, 5,2,2, 1,2,2, 1,2,1, 5,2,2, 7,2,1, 5,2,2,
6,2,1, 1,2,2, 5,2,2, 6,2,1, 4,2,1, 5,1,1, 5,2,2, 1,2,2, 1,2,1, 5,2,1, 5,2,2, 1,2,2, 1,2,1, 5,2,2, 7,1,1, 1,1,2, 5,2,2,
5,2,2, 5,2,2, 5,2,2, 1,2,2, 1,4,2, 2,2,2, 3,2,2, 5,2,2, 5,2,2, 5,2,2, 1,2,2, 1,2,2, 2,1,2, 3,1,2, 2,1,2, 1,1,2, 5,2,1,
5,2,2, 5,2,2, 5,2,2, 1,2,2, 1,4,2, 2,2,2, 3,2,2, 3,4,2, 3,4,2, 2,1,2, 3,1,2, 4,1,2, 3,1,2, 2,1,2, 4,1,2, 3,1,2, 2,1,2, 1,2,2,
5,2,1, 1,2,2, 5,2,2, 3,2,2, 4,2,2, 3,2,2, 2,2,2, 1,1,2, 2,1,2, 3,2,2, 3,2,2, 3,2,2, 3,2,2, 2,1,2, 3,1,2, 2,2,2, 1,4,2,
2,2,1, 1,2,2, 2,2,2, 3,2,2, 4,2,2, 3,2,2, 2,2,2, 1,1,2, 2,1,2, 3,2,2, 3,2,2, 3,2,2, 3,2,2, 2,1,2, 3,1,2, 2,2,2, 1,6,2, 7,1,2};
int main()
{ u16 key;
u32 jiepaima,dizhonggao,jianpuma;
BEEP_Init();
seg_Init ();
KEY_Init();
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
MY_EXTI_Init();
GPIO_Write(GPIOC,0XC0);
while(1)
{
u16 i,j,n;
BEEP_Init();
SysTick_Init(72);
while(1)
{
key=KEY_scan(0);
if(key==KEY_LEFT)
{for(j=0;j<3;j++)
{for(i=0;i<500;i++)
{ beep=0;
delay_us(400);
beep=1;
delay_us(400);
}
for(i=0;i<1000;i++)
{
beep=0;
delay_us(500);
beep=1;
delay_us(500);
}
delay_ms(400);
}
}
if(key==KEY_RIGHT)
{for(j=0;j<3;j++)
{for(i=0;i<600;i++)
{ beep=0;
delay_us(526);
beep=1;
delay_us(526);
}
for(i=0;i<400;i++)
{
beep=0;
delay_us(714);
beep=1;
delay_us(714);
}
delay_ms(50);
}
}
if(key==KEY_DOWN)
{for(j=0;j<1;j++)
{ for(j=1;j<91;j++)
{n=1000000/(2*FQ[j]);
for(i=0;i<30;i++)
{beep=0;
delay_us(n);
beep=1;
delay_us(n);
}
}
for(j=91;j>0;j--)
{n=1000000/(2*FQ[j]);
for(i=0;i<30;i++)
{beep=0;
delay_us(n);
beep=1;
delay_us(n);
}
}
beep=0;
delay_ms(500);
}
}
if(key==KEY_UP)
{for (j=0;j<104*3;j++)
{jianpuma=music[j];
jiepaima=music[++j];
dizhonggao=music[++j];
for(i=0;i<jiepaima*80;i++)
{if (dizhonggao==1&&jianpuma!=0)
{n=(1000000)/((u32)di[jianpuma]*2);
beep=1;
delay_us(n/2);
beep=0;
delay_us(n/2);
}
if (dizhonggao==2&&jianpuma !=0)
{n=(1000000)/((u32) zhong [jianpuma] *2);
beep=1;
delay_us(n/2);
beep=0;
delay_us (n/2);
}
if(jianpuma==0) {beep=0;delay_us(n);}
}
}
}
else {beep=0;}
}
}
}
exti.c:
#include"exti.h"
#include "key.h"
#include"systick.h"
#include"weidai.h"
void MY_EXTI_Init()
{
NVIC_InitTypeDef NVIC_InitStruct;//zhonduanxian
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE );
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
NVIC_InitStruct.NVIC_IRQChannel= EXTI0_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE ;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel= EXTI2_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE ;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel= EXTI3_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE ;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel= EXTI4_IRQn ;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE ;
NVIC_Init(&NVIC_InitStruct);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line=EXTI_Line0;//waibuzhonduanxian 0
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//shezhi EXTIweizhonduanqingqiu
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//shangshengyanqingqiu
EXTI_InitStruct.EXTI_LineCmd=ENABLE ;//shinengzhonduanxian
EXTI_Init(&EXTI_InitStruct);//chushihuawaishe EXTI
EXTI_InitStruct.EXTI_Line=EXTI_Line2;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd=ENABLE ;
EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line=EXTI_Line3;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd=ENABLE ;
EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line=EXTI_Line4;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd=ENABLE ;
EXTI_Init(&EXTI_InitStruct);
}
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0)==1)
{ delay_ms(10);
if(K_UP==1)
{
GPIO_Write (GPIOC,0xf9);
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI2_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line2)==1)
{ delay_ms(10);
if(K_LEFT ==0)
{
GPIO_Write(GPIOC,0Xa4);
}
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
void EXTI3_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line3)==1)
{ delay_ms(10);
if(K_DOWN ==0)
{
GPIO_Write(GPIOC,0Xb0);
}
}
EXTI_ClearITPendingBit(EXTI_Line3);
}
void EXTI4_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line4)==1)
{ delay_ms(10);
if(K_RIGHT==0)
{
GPIO_Write(GPIOC,0X99);
}
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
没理解你的意思,要按键立马音乐停止么,还是怎么的