用iar编写程序,用msp430开发板的两个按键控制开发板的LED灯沿两个不同方向实现流水灯,要求按键用中断方式工作
时间: 2024-02-15 20:05:19 浏览: 78
好的,请参考以下的 MSP430F5529 代码:
```c
#include "msp430.h"
#define LED1 BIT0 //LED1在P1.0引脚
#define LED2 BIT7 //LED2在P4.7引脚
#define BTN1 BIT1 //BTN1在P2.1引脚
#define BTN2 BIT2 //BTN2在P2.2引脚
volatile unsigned int delay_cnt = 0; //延时计数器
volatile unsigned char dir = 0; //方向标志,0为左,1为右
void delay(unsigned int i) //延时函数
{
delay_cnt = i;
while(delay_cnt);
}
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; //停用看门狗定时器
P1DIR |= LED1; //LED1输出
P4DIR |= LED2; //LED2输出
P2DIR &= ~(BTN1 | BTN2); //BTN1和BTN2输入
P2REN |= BTN1 | BTN2; //BTN1和BTN2内部上拉电阻使能
P2OUT |= BTN1 | BTN2; //BTN1和BTN2内部上拉电阻设置为上拉
P2IES |= BTN1 | BTN2; //BTN1和BTN2下降沿触发中断
P2IFG &= ~(BTN1 | BTN2); //清除BTN1和BTN2中断标志位
P2IE |= BTN1 | BTN2; //BTN1和BTN2中断使能
__enable_interrupt(); //开启总中断
while(1)
{
if(dir == 0) //向左移动
{
P1OUT <<= 1; //LED1左移
if(P1OUT == 0x80) dir = !dir; //到达LED1的最左端,切换方向
delay(10000); //延时一段时间
}
else //向右移动
{
P1OUT >>= 1; //LED1右移
if(P1OUT == 0x01) dir = !dir; //到达LED1的最右端,切换方向
delay(10000); //延时一段时间
}
}
}
#pragma vector=PORT2_VECTOR //BTN1和BTN2中断向量
__interrupt void Port2_ISR(void)
{
if(P2IFG & BTN1) //BTN1中断
{
dir = !dir; //切换方向
P2IFG &= ~BTN1; //清除BTN1中断标志位
}
if(P2IFG & BTN2) //BTN2中断
{
delay_cnt = 0; //复位延时计数器
P2IFG &= ~BTN2; //清除BTN2中断标志位
}
}
```
代码中使用了两个按键 BTN1 和 BTN2,其中 BTN1 用于切换流水灯的方向,BTN2 用于停止流水灯的移动。按键使用中断方式工作,BTN1 按下后会触发 `Port2_ISR()` 中断函数,切换流水灯的方向;BTN2 按下后同样会触发 `Port2_ISR()` 中断函数,将延时计数器 `delay_cnt` 的值设为0,实现停止流水灯的移动。在 `main()` 函数中,程序通过不断左右移动 LED1 实现流水灯的移动,并根据方向标志 `dir` 的值判断移动方向,同时使用延时函数 `delay()` 控制移动速度。
阅读全文