PIC单片机引脚中断程序设计技巧

发布者:雷电狂舞最新更新时间:2018-03-06 来源: eefocus关键字:PIC单片机  中断程序 手机看文章 扫描二维码
随时随地手机看文章

    所有的中档系列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,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能.定义了如下一个宏:

    bit SYSTime;

    #defincTimeEnahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;)

    可以把TimeEnable()放到主程序死循环的任何地方,每当程序执行这个宏,SYSTime就会清零,这就是标志位的自我消失.如果在定时器时间基准标志位SYSlms已经置位的话,SYSTime就会置1,这样别的程序就可以利用这个时间消息了,这就是消息的自我发布。下面就是利用这个时间消息来进行按键延时去抖的,首先看一下按键扫描子程序;

    void seaakey(){

    unsigned char KeyTime,KeyTask;//定义任务时间参数、

    //任务参数

    switch(KeyTask){

    case0:if(key){

    KeyTime=30; //准备延时30 ms

    KeyTask++; //准备好下一个任务

    kcy=0;

    }

    break;

    case I:KeyTime--; //延时30 ms

    if(KeyTime==0)Key+ask++;

    break;

    case2;if(RB4==o){

    //调按键处理程序

    KeyTask=0;

    }

    else KeyTask=0;//退出任务

    break;

    }

    }

    在主程序的死循环中这样用:

    while(1){

    TimeEnable();

    If(SYSTime==1){sCANkey();)

    //在此可以添加其他程序

    只有有时问消息的时候才执行按键扫描程序。可以看到,进入扫描程序执行第一次的时候,程序首先判断按键标志位有没有置位,置位的话(也就是有按键按下的话),任务时间参数(KeyTime)赋值为30,这是延时30ms,去抖,当然你也可以设置为其他的时间值;同时任务参数 (KeyTask)加1。1ms后,再进入扫描程序,这个时候扫描程序执行casel的语句,这样30次后(延时了30ms),任务参数(KeyTask)加1,值为2。lms后,再进入扫描程序,将执行case 2的语句,首先在这里再次判断是不是按键还在按下,如果是就调按键的处理程序,如果不是。就退出按键扫描程序。在这里,还可以加入按键是否抬起的判断程序。

    这样设计的引脚变化程序,CPU开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。


关键字:PIC单片机  中断程序 引用地址:PIC单片机引脚中断程序设计技巧

上一篇:LED数码显示函数的应用
下一篇:基于PIC16F84A单片机编辑LED数码管秒显示器的程序

推荐阅读最新更新时间:2024-03-16 15:56

PIC单片机中断模块详细介绍
PIC单片机中断模块介绍: PIC16F87X系列单片机可以接收多达14个中断源。中断控制器寄存器INTCON标记着各个中断源的请求,对各个中断设置屏蔽位,对全部中断设置全局屏蔽位。   PIC16F87X系列的中断包含:TMR0溢出中断(TOIF)、外部中断(INTF)、端口B变化中断(RBIF)、并行从动端口中断(PSPIF)、A/D变换中断、USART异步接收中断(RCIF)和异步发送中断(TXIF)、同步串行端口中断(SSPIF)、CCP1中断(CCPIIF)、TMR2中断(TMR2IF)、TMR1中断、CCP1中断(CCP2)、E2PROM写中断(EEIF)、总线碰撞中断(BCLIF)。   各个中
[单片机]
PIC单片机调试总结
使用编程环境:MPLAB X IDE V3.40 单片机:p33FJ64GS606 仿真器:pickit3 问题:断点无法解析为有效的程序存储器地址,及仿真无法设置断点,看不了watch窗口变量。 解决方法:文件不能有中文路径。
[单片机]
STM32串口使用IDLE中断接收不定长数据原理与源程序
今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。 看了前面IDLE中断的定义,你就会明白了
[单片机]
STM32串口使用IDLE<font color='red'>中断</font>接收不定长数据原理与源<font color='red'>程序</font>
PIC单片机原理
据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对 于世界市场我国的占有率还不到1%。这说明单片机应用在我国才刚刚起步,有着广阔的前景。培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义。 当今单片机厂商琳琅满目,产品性能各异。针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC)。采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。这使得取指令和取数据可同时进行,且由于一般指
[单片机]
PIC单片机的BIN码转BCD码
;******************************************************************** ; Binary To BCD Conversion RouTIne ; This rouTIne converts a 16 Bit binary Number to a 5 Digit ; BCD Number. This rouTIne is useful since PIC16C55 & PIC16C57 ; have two 8 bit ports and one 4 bit port ( total of 5 BCD digits) ; ; The 16
[单片机]
PIC单片机入门_PICC头文件介绍
PICC支持下的C程序代码中一定要包含pic.h头文件,该文件安装在HT-PIC\include目录下。它是很多头文件的集合,C编译器在pic.h中根据用户选择的芯片自动载入相应的其它头文件,例如用户选择的芯片是PIC16F877,则pic.h会把pic1687x.h载入;例如用户选择的芯片是PIC16F877A,则pic.h会把pic168xa.h载入。载入的头文件中其实是声明芯片的寄存器和一些函数。例如以下程序片段: static volatile unsigned char PORTA@ 0x05; static volatile unsigned char PORTB@ 0x06; static unsign
[单片机]
LPC1114_外部中断程序_MDK编译环境
main.c #include LPC11XX.h #include gpio.h #include timer16.h #include main.h #include Key.h #include LCD.h void Delay_Sec(unsigned char Time) //1s*Time延时函数 { u16 i; while(Time) { for(i=0;i 3000000;i++); Time--; } } void Delay_Ms(unsigned int Time) //1Ms*Time延时函数 { u16 i; whil
[单片机]
PIC单片机控制Modem的串行通信设计
在工程中,常采用Modem通过模拟线路进行数据的远程传输。我们用工业级PIC16F87系列单片机控制Modem完成串行异步/同步通信,在较低速率的线路上实现了数据的实时传输,收到了很好的效果。   本文就系统中PIC单片机控制Modem的串行通信技术,在硬件、软件两方面进行了分析。   1 PIC单片机及其同步/异步串行接口USART模块功能简介   PIC16F877A单片机内部有8K*14的FLASH程序存储器和512字的RAM数据存储器:不仅采用哈佛体系结构,而且还采用哈佛总线结构,流水线操作,PIC16F877A大大提高了指令执行速度,PIC单片机的系统时钟可以工作在DC-20MHz的频率范围之内。优化的CPU结构
[单片机]
<font color='red'>PIC单片机</font>控制Modem的串行通信设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved