MSP430 利用中断做
#include "includes.h"
void init( void )
{
P2IES |= BIT4+BIT6 ; //P1.4、P1.6设为下降沿中断
P2IES &=~(BIT5+BIT7); //P1.5、P1.7设为上升沿中断
P2IE |=BIT4+BIT5+BIT6+BIT7; //允许P1.4567中断
P2IFG = 0; //避免第一次误动作
timerB_Init();
_EINT(); //总中断允许
}
unsigned int EncoderCnt= 2001; //旋转角度计数值,全局变量,供其他程序访问
uchar EncoderStatus = 1; //旋转时序状态变量
#pragma vector =PORT2_VECTOR //P1口中断源
__interrupt void P2_ISR( void ) //声明一个中断服务程序,名为P1_ISR();
{
_BIC_SR(SCG0); //如果从LPM3唤醒,恢复时钟准确性
if(P2IFG&BIT4) //-------------------A 下降中断(P1.4中断入口)-------------//
{
if (EncoderStatus ==1) { EncoderStatus = 2; EncoderCnt++ ;} //A 下沿,1->2
if (EncoderStatus == 4) { EncoderStatus= 3; EncoderCnt-- ;} //A 下沿,4->3
}
if(P2IFG&BIT5) //-------------------A 上升中断(P1.5中断入口)-------------//
{
if (EncoderStatus ==3) { EncoderStatus = 4; EncoderCnt++;} //A 上沿,3->4
if (EncoderStatus == 2) { EncoderStatus= 1; EncoderCnt-- ;} //A 上沿,2->1
}
if(P2IFG&BIT6) //-------------------B 下降中断(P1.6中断入口)-------------//
{
if (EncoderStatus ==4) { EncoderStatus = 1; EncoderCnt++ ;} //B 下沿,4->1
if (EncoderStatus == 3) { EncoderStatus= 2; EncoderCnt-- ;} //B 下沿,3->2
}
if(P2IFG&BIT7) //-------------------B 上升中断(P1.7中断入口)-------------//
{
if (EncoderStatus ==2) { EncoderStatus = 3; EncoderCnt++ ;} //B 上沿,2->3
if (EncoderStatus == 1) { EncoderStatus= 4; EncoderCnt-- ;} //B 上沿,1->4
}
//if(P2IFG&BIT1) EncoderCnt=2200;//转一圈,清零标志
P2IFG = 0; //清楚P1口中断标志位
if(EncoderCnt<=1)EncoderCnt=1;
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
一周热门 更多>