1)系统初始上电状态:LED1常亮、LED2亮起红色。 (2)S1为D1的控制按键,单击有效(按下生效)。单击后LED1状态发生翻转。 (3)S2为D2的控制按键,单击有效(松开生效)。每次单机后LED2颜色变化,LED2的颜色按照绿→红→蓝→黄→白的顺序循环(白色状态后重新回到红色)。 S1与S2同时长按3s,松开按钮后,LED1、LED2恢复初始状态。在msp432上实现上述要求的代码
时间: 2023-12-14 16:37:19 浏览: 108
以下是在msp432上实现上述要求的代码,供参考:
```c
#include <msp.h>
#define LED1 BIT0 // P1.0
#define LED2_RED BIT0 // P2.0
#define LED2_GREEN BIT1 // P2.1
#define LED2_BLUE BIT2 // P2.2
#define S1 BIT1 // P1.1
#define S2 BIT4 // P1.4
#define DELAY_TIME 100000 // 延时时间,可根据需要调整
void delay(uint32_t t) {
uint32_t i;
for (i = 0; i < t; i++);
}
void main(void) {
uint8_t led2_state = 0; // LED2状态,0代表红色,1代表绿色,2代表蓝色,3代表黄色,4代表白色
uint8_t s1_pressed = 0; // S1是否被按下
uint8_t s2_pressed = 0; // S2是否被按下
uint32_t s1_press_time = 0; // S1按下时间
uint32_t s2_press_time = 0; // S2按下时间
WDTCTL = WDTPW | WDTHOLD; // 停用看门狗定时器
P1DIR &= ~(S1 | S2); // S1、S2设为输入模式
P1REN |= S1 | S2; // S1、S2开启上拉电阻
P1OUT |= S1 | S2; // S1、S2上拉
P1DIR |= LED1; // LED1设为输出模式
P1OUT &= ~LED1; // LED1初始状态为熄灭
P2DIR |= LED2_RED | LED2_GREEN | LED2_BLUE; // LED2设为输出模式
P2OUT &= ~(LED2_RED | LED2_GREEN | LED2_BLUE); // LED2初始状态为红色
while (1) {
if ((P1IN & S1) == 0) { // 检测S1是否被按下
s1_pressed = 1;
s1_press_time++;
} else {
if (s1_pressed && s1_press_time < 3000 / DELAY_TIME) { // S1单击事件
s1_pressed = 0;
P1OUT ^= LED1; // LED1状态翻转
}
s1_press_time = 0;
}
if ((P1IN & S2) == 0) { // 检测S2是否被按下
s2_pressed = 1;
s2_press_time++;
} else {
if (s2_pressed && s2_press_time < 3000 / DELAY_TIME) { // S2单击事件
s2_pressed = 0;
led2_state = (led2_state + 1) % 5;
switch (led2_state) {
case 0: // 红色
P2OUT = (P2OUT & ~(LED2_RED | LED2_GREEN | LED2_BLUE)) | LED2_RED;
break;
case 1: // 绿色
P2OUT = (P2OUT & ~(LED2_RED | LED2_GREEN | LED2_BLUE)) | LED2_GREEN;
break;
case 2: // 蓝色
P2OUT = (P2OUT & ~(LED2_RED | LED2_GREEN | LED2_BLUE)) | LED2_BLUE;
break;
case 3: // 黄色
P2OUT = (P2OUT & ~(LED2_RED | LED2_GREEN | LED2_BLUE)) | (LED2_RED | LED2_GREEN);
break;
case 4: // 白色
P2OUT = (P2OUT & ~(LED2_RED | LED2_GREEN | LED2_BLUE)) | (LED2_RED | LED2_GREEN | LED2_BLUE);
break;
}
}
s2_press_time = 0;
}
if (s1_pressed && s2_pressed && s1_press_time >= 3000 / DELAY_TIME && s2_press_time >= 3000 / DELAY_TIME) { // S1、S2同时长按事件
s1_pressed = 0;
s2_pressed = 0;
s1_press_time = 0;
s2_press_time = 0;
P1OUT &= ~LED1;
led2_state = 0;
P2OUT = (P2OUT & ~(LED2_RED | LED2_GREEN | LED2_BLUE)) | LED2_RED;
}
delay(DELAY_TIME); // 程序延时,防止按键抖动
}
}
```
阅读全文