标题:
MSP430单片机旋转编码 程序
[打印本页]
作者:
51hei单片
时间:
2016-3-14 20:13
标题:
MSP430单片机旋转编码 程序
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件(例3.2.4) )完整例程下载:
http://www.51hei.com/bbs/dpj-46245-1.html
关于本程序的详细解说大家可以点击上图下载电子书
程序1:
#include <msp430x42x.h>
#include "LCD_Display.h"
#define PhaseA_BIT BIT5 /*A相I/O口的宏定义*/
#define PhaseB_BIT BIT6 /*B相I/O口的宏定义*/
// A相接P1.5 B相接P1.6
#define PhaseB_H ( P1IN & PhaseB_BIT) /*A相高电平的宏定义*/
#define PhaseB_L ((P1IN & PhaseB_BIT)==0) /*A相低电平的宏定义*/
int EncoderCnt=0; //计数变量
void main( void )
{
WDTCTL = WDTPW+WDTHOLD;
FLL_CTL0 |= XCAP18PF; // 设置晶振匹配电容18pF左右
P1IES |= PhaseA_BIT; // A相输入管脚设为上升沿中断
P1IE |= PhaseA_BIT; // 允许A相输入管脚中断
_EINT(); // 总中断允许
BTCTL=0;
LCD_Init();
while(1)
{
LCD_DisplayNumber(EncoderCnt); //主程序可以随时访问计数变量
LPM3;
}
}
#pragma vector = PORT1_VECTOR //P1口中断源
__interrupt void P1_ISR(void) //声明一个中断服务程序,名为P1_ISR()
{
_BIC_SR(SCG0); //从LPM3唤醒,恢复时钟准确性
if(P1IFG & PhaseA_BIT)
{
if(P1IES & PhaseA_BIT) //A下降中断
{
if(PhaseB_H) EncoderCnt--; //计数
P1IES &= ~PhaseA_BIT; //下一次改为上升沿触发
}
else //A上升中断
{
if(PhaseB_H) EncoderCnt++; //计数
P1IES |= PhaseA_BIT; //下一次改为下降沿触发
}
}
P1IFG=0; //清除P1中断标志位
__low_power_mode_off_on_exit();
}
复制代码
程序2:
#include <msp430x42x.h>
#include "LCD_Display.h"
#define A_H ( P1IN & BIT5)
#define A_L ((P1IN & BIT5)==0)
#define B_H ( P1IN & BIT6)
#define B_L ((P1IN & BIT6)==0)
int EncoderCnt=0;
unsigned char EncoderStatus=4;
void main( void )
{
WDTCTL = WDTPW+WDTHOLD;
FLL_CTL0 |= XCAP18PF; // 设置晶振匹配电容18pF左右
P1IES |= (BIT4 + BIT6) ; // P1.4、P1.6设为下降沿中断
P1IES &=~ (BIT5 + BIT7) ; // P1.5、P1.7设为上升沿中断
P1IE |= BIT4 + BIT5 + BIT6 + BIT7; // 允许P1.4567中断
P1IFG=0;
_EINT(); // 总中断允许
BTCTL=0;
LCD_Init();
while(1)
{
LCD_DisplayNumber(EncoderCnt);
LPM3;
}
}
#pragma vector = PORT1_VECTOR //P1口中断源
__interrupt void P1_ISR(void) //声明一个中断服务程序,名为P1_ISR()
{
_BIC_SR(SCG0);
if(P1IFG & BIT4) //A下降中断
{
if((EncoderStatus==4)&&(B_H)) {EncoderStatus=1;EncoderCnt--;}
if((EncoderStatus==3)&&(B_L)) {EncoderStatus=2;EncoderCnt++;}
}
if(P1IFG & BIT5) //A上升中断
{
if((EncoderStatus==1)&&(B_H)) {EncoderStatus=4;EncoderCnt++;}
if((EncoderStatus==2)&&(B_L)) {EncoderStatus=3;EncoderCnt--;}
}
if(P1IFG & BIT6) //B下降中断
{
if((EncoderStatus==1)&&(A_L)) {EncoderStatus=2;EncoderCnt--;}
if((EncoderStatus==4)&&(A_H)) {EncoderStatus=3;EncoderCnt++;}
}
if(P1IFG & BIT7) //B上升中断
{
if((EncoderStatus==2)&&(A_L)) {EncoderStatus=1;EncoderCnt++;}
if((EncoderStatus==3)&&(A_H)) {EncoderStatus=4;EncoderCnt--;}
}
P1IFG=0;
__low_power_mode_off_on_exit();
}
复制代码
作者:
Accordion
时间:
2016-3-15 10:50
晶振的匹配电容是多大的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1