码迷,mamicode.com
首页 > 其他好文 > 详细

3、通过按键S1产生外部中断改变LED1状态(it's 中断-寄存器和中断子程序)

时间:2015-08-09 22:20:14      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:

 

通过按键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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!