|
中斷服務(wù)函數(shù)與一般自定義函數(shù)不同,有特定的書寫格式:
<1> 在每一個中斷服務(wù)函數(shù)之前,都要加上一句起始語句:
#pragma vector = <中斷向量>
<中斷向量>表示接下來要寫的中斷服務(wù)函數(shù)是為那個中斷源服務(wù)的,該 語句有兩種寫法:
#pragma vector = 0x7B 或者 #pragma vector = P1INT_VECTOR
前者是中斷向量的入口地址,后者是頭文件“ioCC2530.h”中的宏定義。
<2> _ _interrupt關(guān)鍵字表示該函數(shù)是一個中斷服務(wù)函數(shù),<函數(shù)名稱>可以 自定義,函數(shù)體不能帶有參數(shù),也不能有返回值。
按照步驟走
1. 先配置按鍵的寄存器輸入配置 以按鍵P1_2為例
P1SEL &=~0x04;
P1DIR &= ~0x04;
P1INP &= ~0x04; //設(shè)置為上拉引腳
2.配置中斷寄存器 以先位中斷允許 然后端口中斷允許 最后總中斷允許的順序去配置
1.P1IEN |= 0x04; //位中斷允許
2. IEN2 |=0x10; //端口中斷允許
3. PICTL =0x00; //配置跳變沿方向 上升沿
4. EA=1; //總中斷標(biāo)志
5. P1IFG=0; //中斷標(biāo)志位清
下述是整體代碼 實現(xiàn)按鍵第一次按下 led1亮 第二次按下 led2亮 第三次按下全亮 第四次按下全滅的效果
- #include<ioCC2530.h>
- //led低電平是亮燈
- #define led1(x) P1_0=x
- #define led2(x) P1_1=x
- volatile int cnt=0;
- void delay_us(int n)
- {
- while(n--)
- {
- asm("nop");
-
- }
- }
- void delay_ms(int n)
- {
- for(int i=0;i<n;i++)
- {
- delay_us(500);
- }
- }
- void main()
- {
-
- //P1SEL &= ~0x03;
- //P1DIR |= 0x03;
- P1SEL &= ~0x07;
- P1DIR |= 0x03;
- P1DIR &= ~0x04;
- P1INP &= ~0x04;
-
- P1IEN |= 0x04;
- //P1IE =1;
- IEN2 |= 0x10;
-
- PICTL |= 0x02;
-
- P1IFG =0x00;
- EA=1;
-
- while(1)
- {
-
- }
-
- }
- #pragma vector =P1INT_VECTOR
- __interrupt void P1_ISR(void)
- {
- if(P1IFG>0)
- {
- cnt++;
- if(cnt%4==0)
- {
- led1(1);
- led2(0);
- }
- if(cnt%4==1)
- {
- led1(0);
- led2(1);
- }
- if(cnt%4==2)
- {
- led1(1);
- led2(1);
- }
- if(cnt%4==3)
- {
- led1(0);
- led2(0);
- }
- P1IFG=0;
- P1IF=0;
- }
-
-
- }
復(fù)制代碼
|
評分
-
查看全部評分
|