MSP430 判断 旋转编码开关转动方向
msp430 是一款超低功耗的单片机,个人感觉市面上看到的教程远远少于Adrunio ,51和 stm32,可能是太底层了的原因吧。本文将使用MSP430F5529PL 来完成对于旋转编码开关转动方向的判断,以及使用串口工具进行结果显示。
目录
1. 旋转编码开关
2. 线路连接实物
3. 程序讲解
4. 效果展示
1、旋转编码开关
旋转编码开关,也就是所说的旋转编码器、数码电位器、Rotary Encoder 。它具有左转,右转功能,有的旋转编码开关还有按下功能。(本质上可以理解为3个开关)
端口接法
(1)A、B脚要接上拉电阻
(2)C 脚一般接地
(3)VCC、GDN 脚是下按键的开关接线
下面这张图是AC ,BC的信号
可以看到,要想获取到他的旋转方向,只要让A在上升沿或者下降沿来临时,检测B的电平即可。例如以A的上升沿为例,A在上升沿时,如果B的电位是低,那么是向右转,否则向左。那么怎么在A上升沿或者下降沿来临时获取B的值呢?聪明的大家一定想到了中断。
2、线路连接实物
A – P2.3
B – P2.4
C – GND
由于不用检测下压 VCC 和 GND 直接 空接。
上面两个导线,和旁边的短路环作用一样。
3. 程序讲解
#include <msp430f5529.h>
#define uchar unsigned char
uchar buffer0[] = {"逆时针\n"};
uchar buffer1[] = {"顺时针\n"};
// 启用串口调试, 波特率设置为9600
void setUart(){
P4SEL = BIT4 +BIT5; // 设置 4.4 和 4.5 为输出位
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_1; // CLK = ACLK
UCA1BR0 = 0x03; // 32kHz/9600=3.41 (see User's Guide)
UCA1BR1 = 0x00;
UCA1MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
}
// 串口输出字符串
void uartPrint(uchar code[], int len){
unsigned int i;
for(i=0; i<len; i++){
UCA1TXBUF = code[i];
while (!(UCA1IFG&UCTXIFG));
}
}
// 主程序
void main(void)
{
// 停止看门狗
WDTCTL=WDTPW+WDTHOLD;
// 设置1.0为输出啊端口,并且初始为低电平
P1DIR |= BIT0; P1OUT &=~ BIT0;
// 设置2.3为输入位, 接上拉电阻, 设置初始值为高电平
P2DIR &=~ BIT3; P2REN |= BIT3; P2OUT |= BIT3;
// 允许2.3触发中断, 中断标志位复位,设置中断
P2IES &=~ BIT3; P2IFG &=~ BIT3; P2IE |= BIT3;
// 设置2.4也位输入位, 接上拉电阻, 设置初始值位高电平
P2DIR &=~ BIT4; P2REN |= BIT4; P2OUT |= BIT4;
// 设置串口
setUart();
// CPU休息,GIE:打开全局中断使能
__bis_SR_register(LPM0_bits +GIE);
// 停止操作指令
__no_operation();
}
// 进入中断
#pragma vector = PORT2_VECTOR
__interrupt void Port_2(void){
if(P2IN & BIT4){ // 如果是2.4高电平
// 串口打印 ”逆时针“
uartPrint(buffer0, sizeof(buffer0));
}else{
// 串口打印 ”顺时针“
uartPrint(buffer1, sizeof(buffer1));
}
// 中断标复位
P2IFG &=~ BIT3;
}
4. 效果展示
结语:MSP430 的 生态等待大家一起去丰富,一起加油吧。