STM32F103如何让按键和蜂鸣器的音乐同时中断?

STM32F103ZET6如何让按键和蜂鸣器的音乐同时中断?

代码如下

  1. 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;}
    }
    }
    }
  2. 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);
    }

 

没理解你的意思,要按键立马音乐停止么,还是怎么的