直接上代码
1 #include "ioCC2530.h" 2 3 #define D3 P1_0 4 #define D4 P1_1 5 #define D5 P1_3 6 #define D6 P1_4 7 8 /*=======================简单的延时函数========================*/ 9 void Delay(unsigned int t) 10 { 11 while(t--); 12 } 13 /*======================端口初始化函数========================*/ 14 void Init_Port() 15 { 16 P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作为通用I/O端口 0001 1011->1110 0100 17 P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出 0001 1011 18 19 P1SEL &= ~0x04; //P1_2作为通用I/O端口 0000 0100->1111 1011 20 P1DIR &= ~0x04; //P1_2端口输入 1111 1011 输入 21 P1INP &= ~0x04; //P1_2设置为上拉/下拉模式 1111 1011 下拉模式 22 P2INP &= ~0x40; //P1_2设置为上拉 0100 0000->1011 1111 端口1的选择 0为上拉 23 24 D3 = 0; //默认关闭 25 D4 = 0; 26 D5 = 0; 27 D6 = 0; 28 } 29 30 /*========================灯光闪烁函数=========================*/ 31 void LED_Running() //流水灯函数 D3闪烁 32 { 33 D3 = ~D3; 34 Delay(60000); 35 } 36 37 /*====================外部中断初始化函数======================*/ 38 void Init_INTP1() 39 { 40 IEN2 |= 0x10; //使能P1端口组外部中断(IEN2不能位操作)0001 0000 41 P1IEN |= 0x04; //使能P1_2引脚外部中断 0000 0100 P1_2使能中断 42 PICTL &= ~0x02; //配置P1_0到P1_3上升沿触发 0000 0010->1111 1101 0为上升沿 43 EA = 1; //打开总中断 44 } 45 46 /*=====================外部中断服务函数=======================*/ 47 #pragma vector = P1INT_VECTOR 48 __interrupt void INTP1_Service() 49 { 50 if((P1IFG & 0x04) == 0x04) //判断是否P1_2引脚产生中断 51 { 52 D6 = ~D6; 53 P1IFG &= ~0x04; //清除P1_2引脚中断标志 54 } 55 P1IF = 0; //清除P2端口组中断标志 56 } 57 58 /*==========================主函数============================*/ 59 void main() 60 { 61 Init_Port(); //端口初始化 62 Init_INTP1(); //初始化外部中断 63 while(1) 64 { 65 LED_Running(); //运行灯光闪烁主程序 66 } 67 }
本题目的意思为:模块上SW1(P1_2)按键设置为外部中断输入引脚。
在中断服务函数中,控制一个LED6灯的开关切换,也就是原来LED是点亮的熄灭,原来熄灭的点亮。
同时在主程序中,运行一段跑马灯程序,使LED3点亮和熄灭。
需要注意是
要在中断服务函数中把相应的中断标志位清除。必须先清除引脚的中断标志,再清除端口组的中断标志。否则会不断进入中断。
还有就是在外部中断服务函数中添加判断引脚是否产生中断。