HuNB 发表于 2010-9-20 20:55:20

MSP430 编码开关

/*****************************************************************************\
文件名:stemp_button.c
编写者:沨
描述:MSP430编码开关。适用于MSP430F149,其他型号的需要适当改变。
      使用P1.5、P1.6、两个I/O口接AB相,公共端接地。
      UART1输出,波特率115200
版本:1.0        2010/09/20
\*****************************************************************************/

#include <MSP430x14x.h>
typedef unsigned char uchar;
typedef unsigned intuint;

//选用端口定义
#define KEYDIR P1DIR
#define KEYIES P1IES
#define KEYIE P1IE
#define KEYIN P1IN
#define KEYIFG P1IFG

//定义键盘管脚
#define KEY0 BIT5
#define KEY1 BIT6
#define KEY_MOD (KEY0+KEY1)
       
unsigned char KeyTemp;                         //调整量值

void InitKey()
{
        KEYDIR &= ~(KEY0+KEY1);         //设置端口为输入
        KEYIES |= KEY0+KEY1;            //设置下降沿中断
        KEYIE |= KEY0+KEY1;         //打开端口中断
        KeyTemp=127;                                                               //初始化量值
}

/*****************************************************************************
端口1中断函数
多中断中断源:P1IFG.0~P1IFG7,只用到P1.5 P1.6两个中断源
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断
******************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
        if((KEYIFG&KEY0) ==KEY0)
        {
                //处理P1IN.5中断
                KEYIFG &= ~KEY0;                //清除中断标志
                if((KEYIN&KEY1) !=0 &&(KEYIN&KEY0) ==0)
                {
                  KeyTemp=KeyTemp+0x01;
                  KEYIES &= ~(KEY0+KEY1);            //设置上升沿中断
                //LPM3_EXIT;
                }
                if((KEYIN&KEY1) !=0 &&(KEYIN&KEY0) !=0)
                {
                  KeyTemp=KeyTemp-0x01;
                  KEYIES |= KEY0+KEY1;            //设置下降沿中断
                //LPM3_EXIT;
                }
        }
        if((KEYIFG&KEY1) ==KEY1)
        {
                //处理P1IN.6中断
                KEYIFG &= ~KEY1;                //清除中断标志
                if((KEYIN&KEY0) !=0 && (KEYIN&KEY1) ==0)
                {
                  KeyTemp=KeyTemp-0x01;
                  KEYIES &= ~(KEY0+KEY1);            //设置上升沿中断
               // LPM3_EXIT;
                }
                if((KEYIN&KEY0) !=0 && (KEYIN&KEY1) !=0)
                {
                  KeyTemp=KeyTemp+0x01;
                  KEYIES |= KEY0+KEY1;            //设置下降沿中断
               // LPM3_EXIT;
                }
        }
               
}
/*****************************************************************************
串口1初始化(8M晶振,波特率=9600)
*****************************************************************************/
void UartInit()
{
U1CTL |= SWRST;      //开启设置
U1TCTL |= 0x30 ;//选择 SMCLK=8M      波特率=9600
// U1TCTL = SELS;   
U1BR0 = 0x45;         
U1BR1 = 0x00;
U1MCTL =0x4A;   //00000000
U1CTL |= CHAR;       //长度8位
U1CTL &= ~SWRST;
P3DIR |= 0x50;
P3SEL |= 0xC0;
ME2 |= UTXE1 + URXE1;
IE2 |= URXIE1;
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
   unsigned int iq0;

        //使用XT2振荡器
   BCSCTL1&=~XT2OFF;                                   //打开XT2振荡器
   do
   {
                IFG1 &= ~OFIFG;                                // 清除振荡器失效标志
                for (iq0 = 0xFF; iq0 > 0; iq0--);        // 延时,等待XT2起振
        }
        while ((IFG1 & OFIFG) != 0);                        // 判断XT2是否起振

        BCSCTL2 =SELM_2+SELS;                                //选择MCLK、SMCLK为XT2

        InitKey();                                                                                //初始化按键端口
        UartInit();                                                                                //初始化串行口

        _EINT();        //打开全局中断控制,若不需要打开,可以屏蔽本句
}
/*******************************************
函数名称:Delays
功    能:延时一会
参    数:无
返回值:无
********************************************/
void Delays(void)
{
    uchar i=20;
    uint j;

    while(i--)
    {
            j=2000;
            while(j--);
    }
}

/*****************************************************************************\
文件名:main.c
编写者:沨
描述:MSP430编码开关。适用于MSP430F149,其他型号的需要适当改变。
      使用P1.5、P1.6、两个I/O口接AB相,公共端接地。

版本:1.0        2010/09/20
\*****************************************************************************/
int main( void )
{
      unsigned char OldKey;                         //调整量值
        WDTCTL = WDTPW + WDTHOLD;           //关闭看门狗
        InitSys();                        //初始化
      
      while(1)
      if(OldKey!=KeyTemp)
      {        TXBUF1 = KeyTemp;
        while (!(IFG2 & UTXIFG1));
      OldKey=KeyTemp;
      }
      
      /*
start:
        TXBUF1 = KeyTemp;
        while (!(IFG2 & UTXIFG1));
        LPM3;
        goto start;*/
}

HuNB 发表于 2010-9-20 21:04:43

开关用的【虹达】微型带线旋转编码器
http://www.mailshop.cn/product_detail.jsp?kind=normal&id=6990&class_id=3540&super_id=1662
黑线接地,白线接P1.5、P1.6,
4.7K电阻上拉,104电容防抖,消抖效果尚可,偶尔有跳码。
观察时用串口调试助手,接UART1,波特率115200。

另这个开关的轴真的不好配,有个鼠标的滚轮,插进去太松了。
我拿打火机烧软中性笔芯插进去用一会儿就不行了。
页: [1]
查看完整版本: MSP430 编码开关