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;*/
} 开关用的【虹达】微型带线旋转编码器
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]