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

通过按键S1产生外部中断改变LED1状态

1 /****************************************************************************

2 * 文 件 名: main.c

3 * 作 者: Amo [ www.amoMcu.com 阿莫单片机]

4 * 修 订: 2014-04-08

5 * 版 本: 1.0

6 * 描 述: 通过按键S1产生外部中断改变LED1状态

7 ****************************************************************************/

8 #include

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

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 }

5071515a0e6dd3694d08a9afc104bcde.png

中断设置相关:

188cb0e3e67f6211bae7302aff61f899.png

故中断配置如下:

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区分?

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

时间: 08-09

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值