基于MSP430G2553单片机的带有按键消抖的中断法控制按键查询LED
参考资料来自用户手册P.328
一、设计任务:
用中断法识别按键的状态,按键一次LED亮;再按一次,LED熄灭,如此往复。并消除按键抖动。
二、基本原理:
按键查询一般可以通过扫描和中断来实现。中断实现可以免除频繁扫描的麻烦,在按键按下时,中断当前的程序执行中断处理函数,效率较高。中断发生时有一个硬件装置将信号输入单片机,该硬件部件叫中断控制器,它负责把引起中断的信号编号,并按照事先约定的优先级排队,并发信号给单片机的cpu。cpu检测到中断控制器的信号后,获得当前中断发生信号的编号,由中断向量表找到中断向量,转而去执行这个编号对应的中断处理程序。设置好P1端口低四位的中断触发方式为下降沿;打开相应的中断控制位和打开总中断,然后在中断服务程序中改变输出。按键的抖动一般是机械性抖动,当开关断开或闭合时接触点处不会一下子接通也不会一下子断开,而是会产生轻微的抖动导致电路的多次接通和断开,这个过程大致会持续5ms-10ms。按键消抖一般可用定时器和延时来实现。当按键按下中断标志位会改变,延时10ms后再检测中断标志位,若此时中断标志位与延时前状态不一致则代表按键已经按下,就改变输出;若状态一致则代表按键未按下,继续等待下一个中断触发。
三、流程图
四、代码
#include <msp430g2553.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer P1DIR |= BIT0; //将P1.0设为输出(LED) P1REN |= BIT3; //启用P1.3内部上下拉电阻 P1OUT |= BIT3; //将内部电阻设为上拉 P1DIR &= ~(BIT3); //将P1.3设为输入(按键) P1IE |= BIT3; //打开P1.3中断 P1IES |= BIT3; //设置P1.3为下降沿中断 P1IFG &= ~ BIT3; //清除中断标志位 _EINT(); //打开总中断 return 0; } /*------中断服务程序---------*/ # pragma vector = PORT1_VECTOR __interrupt void keypress(void) { if(P1IFG & BIT3)//检测中断标志位 { __delay_cycles(10000);//延时10ms while(!(P1IFG & BIT3));//再次检测 P1IFG &= ~BIT3; //清除中断标志位 P1OUT ^= BIT0; //改变输出 }
}