通用IO的中断

来源:互联网 发布:监控mysql sql性能 编辑:程序博客网 时间:2024/05/16 12:42

前言

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


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

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

已知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_3void 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 0
原创粉丝点击