PIC单片机引脚中断程序的设计技巧
发布时间:2008/5/26 0:00:00 访问次数:995
    
    
    1 简 述
    所有的中档系列pic单片机,portb端口最高的4个引脚(rb7~rb4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。
    
    在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除p0rtb中断标志位rbif之前,必须安排一条必不可少的,以portb端口数据寄存器portb为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除rbif标志位,为下一次中断做好准备。二是,由于端口portb是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用pic单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。
    2 引脚中断程序设计
    在主程序里先设置有关的寄存器。
    ◇设置trisb寄存器,使rb7~rb4相关的引脚处于输入状态;
    ◇如果需要弱上拉,通过option_reg的第7位设置;
    ◇rbif=o;
    ◇rbie=1;
    ◇gif=1。
    
    响应状态变化后的中断服务程序。
    ◇检查rbif是否为l,为l则是引脚变化引起的中断;
    ◇调用延时程序,延时20~30 ms,目的是为了按键去抖;
    ◇判断是引脚出现上升沿还是下降沿引起的中断;
    ◇调用按键处理程序;
    ◇读portb口的值,取消状态变化的硬件信号;
    ◇清除rbif标志。
    
    笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档pic单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,pic单片机中断程序人口只有一个,在响应中断的请求时,pic单片机就会自动把全局中断的使能位(intcon的第7位gif)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。
    
    下面给出笔者设计程序时的思路。
    
    当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下:
    else if((rbie&rblf)==1){ //如果引脚变化引起中断
    if(rb4==0){ //rb4上的按钮接地
    key=1; //按键标志位置位
    }
    rbif=0; //清除引脚中断标志位
    }
    
    其中,if(rb4==0)语句相当于读取了portb端口数据寄存器,取消了状态变化的硬件信号。
    
    下面详细介绍怎么样进行按键去抖。
    
    首先,在定时器中断里设置一个lms的时间基准标志位“syslms”,每到lms,“syslms”便置位。程序如下:
    unsigned char count;
    if((toie&toif)==1){ //定时器中断
    tmro+=0x09; //每250μs中断一次
    if(count==4){
    count=0;
    syslms=l; //系统时间标志
    couot++;
    }
    t0if=0; //清除时钟中断标志位
    }
    
    有了这个时间基准,便可以在主程序里进行按键去抖处理了。为了更好地利用这个时间基准,定义一个消息标志systime,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能.定义了如下一个宏:
    
    
    1 简 述
    所有的中档系列pic单片机,portb端口最高的4个引脚(rb7~rb4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。
    
    在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除p0rtb中断标志位rbif之前,必须安排一条必不可少的,以portb端口数据寄存器portb为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除rbif标志位,为下一次中断做好准备。二是,由于端口portb是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用pic单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。
    2 引脚中断程序设计
    在主程序里先设置有关的寄存器。
    ◇设置trisb寄存器,使rb7~rb4相关的引脚处于输入状态;
    ◇如果需要弱上拉,通过option_reg的第7位设置;
    ◇rbif=o;
    ◇rbie=1;
    ◇gif=1。
    
    响应状态变化后的中断服务程序。
    ◇检查rbif是否为l,为l则是引脚变化引起的中断;
    ◇调用延时程序,延时20~30 ms,目的是为了按键去抖;
    ◇判断是引脚出现上升沿还是下降沿引起的中断;
    ◇调用按键处理程序;
    ◇读portb口的值,取消状态变化的硬件信号;
    ◇清除rbif标志。
    
    笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档pic单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,pic单片机中断程序人口只有一个,在响应中断的请求时,pic单片机就会自动把全局中断的使能位(intcon的第7位gif)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。
    
    下面给出笔者设计程序时的思路。
    
    当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下:
    else if((rbie&rblf)==1){ //如果引脚变化引起中断
    if(rb4==0){ //rb4上的按钮接地
    key=1; //按键标志位置位
    }
    rbif=0; //清除引脚中断标志位
    }
    
    其中,if(rb4==0)语句相当于读取了portb端口数据寄存器,取消了状态变化的硬件信号。
    
    下面详细介绍怎么样进行按键去抖。
    
    首先,在定时器中断里设置一个lms的时间基准标志位“syslms”,每到lms,“syslms”便置位。程序如下:
    unsigned char count;
    if((toie&toif)==1){ //定时器中断
    tmro+=0x09; //每250μs中断一次
    if(count==4){
    count=0;
    syslms=l; //系统时间标志
    couot++;
    }
    t0if=0; //清除时钟中断标志位
    }
    
    有了这个时间基准,便可以在主程序里进行按键去抖处理了。为了更好地利用这个时间基准,定义一个消息标志systime,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能.定义了如下一个宏:
深圳服务热线:13692101218 13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)

深圳市碧威特网络技术有限公司
付款方式