通用IO的中断

前言

有的人问我,为什么我的博客没有讲有多少引脚,分别是什么之类的问题。我想说的是这些你都可以从官方手册上知道的,本博客只是告诉大家怎么使用罢了。让大家能够更好的理解。


接上一篇博客,如何使用中断方式控制灯的闪烁。
中断方式一般有以下几个步骤:设置优先级、使能、判断是否发生中断。

第一步,中断优先级的配置

已知IP1_X和IP0_X是设置优先级的,其中X是中断优先级组的组名。0的优先级别最低,3的优先级别最高。
比如:

    IP1_IPG3=1;
    IP0_IPG3=1;

第二步,中断使能寄存器的配置

由于通用IO配置输入就可以用于产生中断了。由于按键P0_3是P0口的。而P0口的中断使能寄存器是IEN1;

IEN1 |=1<<5;

由于IENx是将所有Px端口引脚都设置为中断方式,如果要单独设置某一引脚中断使能,除了设置IENx,还需要设置PxIEN。

PxIEN单独使能一个引脚的配置

比如说按键P0_3

P0IEN |=1<<3;
IEN1 |=1<<5;

第三步,设置中断的触发方式

0为输入上升沿触发,1为输入的下降沿触发

/*设置按键P0_3为下降沿触发中断*/
PICTL|=1<<0;

第四步,打开总中断

EA=1;

至此中断配置已经配置完,接下来需要判断是否发生中断。这时候就需要用到中断标志寄存器了。不要配置中断寄存器,发生中断时只需要判断该标志.
假如P0口有中断,但不需要确认是哪个引脚发生中断,只需要判断P0IFG是否大于0;
由于我们要确认P0_3口发生中断,就需要判断PxIFG相应的位是否置1;

if(P0IFG&(1<<3))
{}

是不是很简单呢?那么我们开始动手改造上个程序吧。

/*定义LED1*/
#define LED1 P0_1
/*定义按键*/
#define SW1 P0_3
void LEDinit()//LED的初始化
{
    P0SEL&=~(1<<1);//配置通用IO
    PODIR |=1<<1;//配置输出模式
}
void KEYinit()
{
    P0IFG &=0x00;//P0中断标志清0
    P0SEL &=~(1<<3);//配置通用IO
    P0DIR &=~(1<<3);//配置输入模式
    P0INP &=~(1<<3);//配置为上拉/下拉
    P0IEN |=1<<3;//P0_3中断使能
    PICIL |=1<<0;//下降沿触发
    EA=1;//打开总中断
    IEN1 |=1<<5;  //端口0的中断使能  
}
/*中断服务程序*/
#pragma vector=P0INT_VECTOR
__interrupt void P0_ISR(void)
{
    if(P0IFG>0)//最好使用判断条件为P0IFG&(1<<3)
    {
        P0IFG=0;//清中断标志
        LED1=!LED1;
    }
 P0IFG=0;//清中断标志
}
void main()
{
    /*LED的初始化*/
    LEDinit();
    LED1=0;
    /*按键的初始化*/
    KEYinit();
    while(1)
    {}
}

是不是很简单,学完了通用IO,下期博客我们介绍一下外设IO。

授人以鱼,不如授人以渔。下期见。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值