1 -禁用看门狗计时器! 2 -使用上拉内部电阻器将开关(P1.1和 P1.4)配置为输入。 3 -将 LED (P1.0和 P2.0、P2.1、P2.2)配置为输出。 4 -初始化 LED 状态(全部关闭)。 5 -在您的配置之后创建一个无限循环("while (1)")、在这里应该执行其余逻辑。 6 -持续轮询开关(具有去抖功能)。 6.1 -按下按钮1时、所选 LED 将发生变化(默认为红色 LED)。 6.2 -按下按钮2时、当前 LED 将改变状态。
对于红色 LED、只有两种状态:打开和关闭。 这应通过按位切换来执行。 对于 RGB LED、有8种状态、对应于 OFF 和7种不同的颜色。 这应该通过按位清除和设置来执行。
换言之、一个按钮在红色 LED 和 RGB LED 之间切换:另一个按钮更改当前 LED 的当前状态、允许我们打开和关闭红色 LED、并循环显示 RGB LED 的所有颜色。
这是我写的内容、但它不起作用
#include
int main (void){
volatile int i;
//禁用看门狗计时器
WDTCTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
//GPIO 功能
P1->SEL0 &=(uint8_t)(~((1<<1)|(1<<4)));
P1->SEL1 &=(uint8_t)(~((1<<1)|(1<<4)));
//使用内部上拉设置输入方向
//电阻器
P1DIR |=(uint8_t)((0 << 1)|(0 << 4));
P1->REN |= BIT1;
P1->OUT |= BIT1;
//将 LED 配置为输出
P1DIR |=(uint8_t)((1 << 0));
P2DIR |=(uint8_t)((1 << 0)|(1 << 1)|(1 << 2));
//初始化 LED
P1->OUT &=~BIT0;
P2->OUT &=~BIT0;
P2->OUT &=~BIT1;
P2->OUT &=~BIT2;
//创建无限循环来实现剩余的逻辑
while (1){
I = 100;
//当它为0时不执行任何操作
while ((P1->IN & BIT1)==(P1->IN & BIT4)){}
//延迟循环
while (i > 0){i-;}
//如果值仍然为0;返回到等待
if ((P1->IN & BIT1)==(P1->IN & BIT4)){
继续;
}
否则{
//Real Press:执行所需的计算
//按下按钮1时,所选的 LED 将发生变化(红色 LED)
if (P1->IN & BIT1){
//如果按下 P1
(P1->OUT)^=(P1->OUT);//XOR on LED1和 LED2
}
//按下按钮2时,当前 LED 将改变状态。
if (P1->IN & BIT4){
//如果是红色 LED,则交替状态
if (P1->out){
P1->OUT ^=~BIT0;//切换位
}
//如果选择 RBG LED
if (P2->OUT){
//如果所有颜色都关闭,请打开第一个
if ((~BIT0)&~BIT1 &~BIT2){
P2->OUT &=~(~BIT0)&(~BIT1)&(~BIT2);
}
if ((~(~BIT0))&~BIT1 &~BIT2){
P2->OUT &=(~BIT0)&~(~BIT1)&(~BIT2);
}
if ((~BIT0)&~(~BIT1)&(~BIT2)){
P2->OUT &=(~BIT0)&(~BIT1)&~(~BIT2);
}
if ((~BIT0)&(~BIT1)&~(~BIT2)){
P2->OUT &=~(~BIT0)&~(~BIT1)&(~BIT2);
}
if (~(~BIT0)&~(~BIT1)&(~BIT2)){
P2->OUT &=(~BIT0)&~(~BIT1)&~(~BIT2);
}
if ((~BIT0)&~(~BIT1)&~(~BIT2)){
P2->OUT &=~(~BIT0)&(~BIT1)&~(~BIT2);
}
if (~(~BIT0)&(~BIT1)&~(~BIT2)){
P2OUT &=~(~BIT0)&~(~BIT1)&~(~BIT2);
}
if (~(~BIT0)&~(~BIT1)&~(~BIT2)){
P2->OUT &=(~BIT0)&(~BIT1)&(~BIT2);
}
}
}
}
}
}