搜索
bottom↓
回复: 1

MSP430 编码开关

[复制链接]

出0入0汤圆

发表于 2010-9-20 20:55:20 | 显示全部楼层 |阅读模式
/*****************************************************************************\
文件名: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 int  uint;

//选用端口定义
#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;*/
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 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。

另这个开关的轴真的不好配,有个鼠标的滚轮,插进去太松了。
我拿打火机烧软中性笔芯插进去用一会儿就不行了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 12:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表