欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
MSP430單片機旋轉編碼 程序
[打印本頁]
作者:
51hei單片
時間:
2016-3-14 20:13
標題:
MSP430單片機旋轉編碼 程序
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件(例3.2.4) )完整例程下載:
http://m.raoushi.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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1