参考资料来自用户手册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; //改变输出
}
}