标签:
通过按键S1产生外部中断改变LED1状态
1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 作 者: Amo [ www.amoMcu.com 阿莫单片机] 4 * 修 订: 2014-04-08 5 * 版 本: 1.0 6 * 描 述: 通过按键S1产生外部中断改变LED1状态 7 ****************************************************************************/ 8 #include <ioCC2540.h> 9 10 typedef unsigned char uchar; 11 typedef unsigned int uint; 12 13 #define LED1 P1_0 // P1.0口控制LED1 14 #define KEY1 P0_1 // P0.1口控制S1 15 16 17 /**************************************************************************** 18 * 名 称: DelayMS() 19 * 功 能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确) 20 * 入口参数: msec 延时参数,值越大,延时越久 21 * 出口参数: 无 22 ****************************************************************************/ 23 void DelayMS(uint msec) 24 { 25 uint i,j; 26 27 for (i=0; i<msec; i++) 28 for (j=0; j<535; j++); 29 } 30 31 /**************************************************************************** 32 * 名 称: InitLed() 33 * 功 能: 设置LED灯相应的IO口 34 * 入口参数: 无 35 * 出口参数: 无 36 ****************************************************************************/ 37 void InitLed(void) 38 { 39 P1DIR |= 0x01; //P1.0定义为输出口 40 LED1 = 0; //LED1灯灭 41 } 42 43 /**************************************************************************** 44 * 名 称: InitKey() 45 * 功 能: 设置KEY相应的IO口,采用中断方式 46 * 入口参数: 无 47 * 出口参数: 无 48 ****************************************************************************/ 49 void InitKey() 50 { 51 P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能 52 PICTL |= 0x2; //下降沿触发 53 IEN1 |= 0x20; //允许P0口中断; 54 P0IFG = 0x00; //初始化中断标志位 55 EA = 1; //打开总中断 56 } 57 58 /**************************************************************************** 59 * 名 称: P0_ISR(void) 中断处理函数 60 * 描 述: #pragma vector = 中断向量,紧接着是中断处理程序 61 ****************************************************************************/ 62 #pragma vector = P0INT_VECTOR 63 __interrupt void P0_ISR(void) 64 { 65 DelayMS(10); //延时去抖 66 LED1 = ~LED1; //改变LED1状态 67 P0IFG = 0; //清中断标志 68 P0IF = 0; //清中断标志 69 } 70 71 /**************************************************************************** 72 * 程序入口函数 73 ****************************************************************************/ 74 void main(void) 75 { 76 InitLed(); //设置LED灯相应的IO口 77 InitKey(); //设置S1相应的IO口 78 while(1) 79 { 80 } 81 }
中断设置相关:
故中断配置如下:
49 void InitKey()
50 {
51 P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能
52 PICTL |= 0x2; //下降沿触发
53 IEN1 |= 0x20; //允许P0口中断;
54 P0IFG = 0x00; //初始化中断标志位
55 EA = 1; //打开总中断
56 }
其中断子程序为:
58 /**************************************************************************** 59 * 名 称: P0_ISR(void) 中断处理函数 60 * 描 述: #pragma vector = 中断向量,紧接着是中断处理程序 61 ****************************************************************************/ 62 #pragma vector = P0INT_VECTOR 63 __interrupt void P0_ISR(void) 64 { 65 DelayMS(10); //延时去抖 66 LED1 = ~LED1; //改变LED1状态 67 P0IFG = 0; //清中断标志 68 P0IF = 0; //清中断标志 69 }
有个问题:难道7~0共8位中断都在这一个中断函数里处理?通过P0IFG区分?
资料:http://pan.baidu.com/s/1dkQNs
3、通过按键S1产生外部中断改变LED1状态(it's 中断-寄存器和中断子程序)
标签:
原文地址:http://www.cnblogs.com/happyhappy/p/4716370.html