(1)系统初始上电状态:LED1常亮、LED2亮起红色。 (2)S1为D1的控制按键,单击有效(按下生效)。单击后LED1状态发生翻转。 (3)S2为D2的控制按键,单击有效(松开生效)。每次单机后LED2颜色变化,LED2的颜色按照绿→红→蓝→黄→白的顺序循环(白色状态后重新回到红色)。 (4)S1与S2同时长按3s,松开按钮后,LED1、LED2恢复初始状态。在msp432上实现上述要求,注意S1为按下后生效 ,S2为松开有效
时间: 2023-12-14 11:38:30 浏览: 37
以下是基于MSP432的实现代码:
```c
#include <msp.h>
#define LED1 BIT0
#define LED2_RED BIT0
#define LED2_GREEN BIT1
#define LED2_BLUE BIT2
#define S1 BIT1
#define S2 BIT4
volatile uint8_t led1_value = 0;
volatile uint8_t led2_color = LED2_RED;
void port1_isr(void)
{
uint32_t status = P1->IFG;
P1->IFG &= ~status; // 清除中断标志位
if(status & S1) // 检测S1按键
{
if(!(P1->IN & S1)) // 检测S1是否按下(低电平有效)
{
led1_value ^= 1; // 翻转LED1状态
}
}
if(status & S2) // 检测S2按键
{
if(P1->IN & S2) // 检测S2是否松开(高电平有效)
{
switch(led2_color) // 切换LED2颜色
{
case LED2_RED:
led2_color = LED2_GREEN;
break;
case LED2_GREEN:
led2_color = LED2_BLUE;
break;
case LED2_BLUE:
led2_color = BIT0 | BIT1 | BIT2; // 白色
break;
case (BIT0 | BIT1 | BIT2):
led2_color = LED2_RED;
break;
}
}
}
}
void delay(uint32_t time)
{
uint32_t i;
for(i=0; i<time; i++);
}
int main(void)
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // 关闭看门狗
P1->DIR |= LED1 | LED2_RED | LED2_GREEN | LED2_BLUE; // 设定LED1、LED2引脚为输出模式
P1->OUT &= ~(LED1 | LED2_RED | LED2_GREEN | LED2_BLUE); // 初始化设定LED1、LED2关闭
P1->REN |= S1 | S2; // 启用S1、S2上拉电阻,使其默认为高电平
P1->IES |= S1 | S2; // 设定S1、S2为边沿触发(下降沿触发)
P1->IFG = 0; // 清除中断标志位
P1->IE |= S1 | S2; // 允许S1、S2中断
NVIC_EnableIRQ(PORT1_IRQn); // 允许PORT1中断
while(1)
{
if(led1_value)
{
P1->OUT |= LED1;
}
else
{
P1->OUT &= ~LED1;
}
P1->OUT &= ~(LED2_RED | LED2_GREEN | LED2_BLUE);
P1->OUT |= led2_color;
delay(100000);
}
}
```
以上代码实现了中断方式读取按键S1和S2的状态,并通过LED1和LED2展示状态。其中,按下S1会翻转LED1的状态,单击S2会依次切换LED2的颜色。当S1和S2同时长按3s后,LED1和LED2会恢复到初始状态。