MSP430F5529学习笔记2-按键控制led闪烁
通过不同按键操作控制led闪烁
源码
主函数
//按下P2.1,LED1亮1s,快速按下P2.1两次,LED2亮1s
#include "msp430f5525.h"
unsigned int n=0;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
//DIR方向寄存器
P1DIR |= BIT0; //led1.0作为输出
P4DIR |= BIT7; //led4.7作为输出
P2DIR &= ~BIT1;
P2REN |= BIT1; //上下拉寄存器
P2OUT |= BIT1;
P1OUT &= ~BIT0;
P4OUT &= ~BIT7;
P2IE |= BIT1; //中断使能寄存器
P2IES |= BIT1;
P2IFG &= ~BIT1; //中断标志寄存器
_EINT();
while(1)
{
if(n==0) //两灯都不亮
{
P1OUT &= ~BIT0;
P4OUT &= ~BIT7;
}
else if(n==1) //P1.0亮
{
P1OUT |= BIT0;
P4OUT &= ~BIT7;
__delay_cycles(1000000);
n=0;
}
else if(n==2) //P4.7亮
{
P1OUT &= ~BIT0;
P4OUT |= BIT7;
__delay_cycles(1000000);
n=0;
}
}
return 0;
}
中断函数
控制按键与led灯闪烁
#pragma vector = PORT2_VECTOR
__interrupt void Port2()
{
unsigned int i=0;
if(!(P2IN & BIT1)) //如果2.1按键没有按下
{
__delay_cycles(5000); //消抖
if(!(P2IN & BIT1))
{
//__delay_cycles(5000); //如果还是处于按下的状态,即视作未松手,第一次按下
while(!(P2IN & BIT1)){} //第一次松手
n = 1;
P2IFG &= ~BIT1;
//__delay_cycles(50000); //500ms后如果有按键按下,视作第二次按下
while((P2IN & BIT1)) //500ms-1000ms内如果不按下,视为只按一次
{
i++;
__delay_cycles(1000);
if(i>1000)
return;
} //程序因按下按键在此处跳出
if(!(P2IN & BIT1))
{
__delay_cycles(5000); //消抖
if(!(P2IN & BIT1))
{
while(!(P2IN & BIT1)){} //第二次松手
n = 2;
P2IFG &= ~BIT1;
}
}
}
}
}
各种寄存器名称及用法
PxDIR | PxREN | PxOUT | I/O功能 |
---|---|---|---|
0 | 0 | x | 输入 |
0 | 1 | 0 | 输入带下拉电阻 |
0 | 1 | 1 | 输入带上拉电阻 |
1 | x | x | 输出 |
-
方向寄存器PxDIR
BIT = 0 输入
BIT = 1 输出
无论使用I/O功能还是其他功能(比如中断,比较器,定时器),方向寄存器都必须初始化 -
输入寄存器PxIN
BIT = 1 输入为高
BIT = 0 输入为低
PxIN为只读寄存器,当尝试对这些寄存器进行写操作时,会消耗大量电流 -
输出寄存器PxOUT
BIT = 0 输出为低
BIT = 1 输出为高
当引脚设定为IO功能,输入方向,上下拉寄存器使能时,
BIT = 0 下拉
BIT =1 上拉 -
输出驱动强度寄存器PxDS
BIT = 0 弱驱动(默认)
BIT = 1 强驱动
使用强驱动会增强I/O口的驱动能力。但MSP430属于超低功耗系列单片机,驱动能力有限,多个I/O工作于强驱动模式可能会导致电磁兼容问题甚至损坏单片机,不推荐使用强驱动模式。 -
功能选择寄存器PxSEL
BIT = 0 I/O功能
BIT = 1 外围模块功能
注意:当PxSEL = 1时,P1和P2的中断功能被关闭 -
中断标志寄存器PxIFG
BIT = 0 清除中断标志
BIT = 1 出现中断,标记 -
中断使能寄存器PxIE
BIT = 1 进行使能
P1IE |=0x01;//引脚P1.0中断使能 -
中断触发边沿选择PxIES
BIT = 0 上升沿触发
BIT = 1 下降沿触发
注意:当向PxIES写入时,当前的PxIN状态将会影响中断触发
PxIES | PxIN | PxIFG |
---|---|---|
0→1 | 0 | 触发 |
0→1 | 1 | 不触发 |
1→0 | 0 | 不触发 |
1→0 | 1 | 触发 |