標(biāo)題:
MSP430單片機(jī)旋轉(zhuǎn)編碼 程序
[打印本頁]
作者:
51hei單片
時(shí)間:
2016-3-14 20:13
標(biāo)題:
MSP430單片機(jī)旋轉(zhuǎn)編碼 程序
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書里面的源碼,(包含工程文件(例3.2.4) )完整例程下載:
http://www.torrancerestoration.com/bbs/dpj-46245-1.html
關(guān)于本程序的詳細(xì)解說大家可以點(diǎn)擊上圖下載電子書
程序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; //計(jì)數(shù)變量
void main( void )
{
WDTCTL = WDTPW+WDTHOLD;
FLL_CTL0 |= XCAP18PF; // 設(shè)置晶振匹配電容18pF左右
P1IES |= PhaseA_BIT; // A相輸入管腳設(shè)為上升沿中斷
P1IE |= PhaseA_BIT; // 允許A相輸入管腳中斷
_EINT(); // 總中斷允許
BTCTL=0;
LCD_Init();
while(1)
{
LCD_DisplayNumber(EncoderCnt); //主程序可以隨時(shí)訪問計(jì)數(shù)變量
LPM3;
}
}
#pragma vector = PORT1_VECTOR //P1口中斷源
__interrupt void P1_ISR(void) //聲明一個(gè)中斷服務(wù)程序,名為P1_ISR()
{
_BIC_SR(SCG0); //從LPM3喚醒,恢復(fù)時(shí)鐘準(zhǔn)確性
if(P1IFG & PhaseA_BIT)
{
if(P1IES & PhaseA_BIT) //A下降中斷
{
if(PhaseB_H) EncoderCnt--; //計(jì)數(shù)
P1IES &= ~PhaseA_BIT; //下一次改為上升沿觸發(fā)
}
else //A上升中斷
{
if(PhaseB_H) EncoderCnt++; //計(jì)數(shù)
P1IES |= PhaseA_BIT; //下一次改為下降沿觸發(fā)
}
}
P1IFG=0; //清除P1中斷標(biāo)志位
__low_power_mode_off_on_exit();
}
復(fù)制代碼
程序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; // 設(shè)置晶振匹配電容18pF左右
P1IES |= (BIT4 + BIT6) ; // P1.4、P1.6設(shè)為下降沿中斷
P1IES &=~ (BIT5 + BIT7) ; // P1.5、P1.7設(shè)為上升沿中斷
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) //聲明一個(gè)中斷服務(wù)程序,名為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();
}
復(fù)制代碼
作者:
Accordion
時(shí)間:
2016-3-15 10:50
晶振的匹配電容是多大的
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1