This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR4133:无法读取板上的按钮

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430FR4133

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/629605/ccs-msp430fr4133-can-t-read-in-the-buttons-of-the-board

部件号:MSP430FR4133

工具/软件:Code Composer Studio

大家好,

我无法在按钮S1 (WFP 1.2)中阅读。 如果我按S2 (WFP 2.6),那么现在的WFP就会改变1.0。 在我看来,第一条"if"-语句不起作用,如果我按S1,则什么也没有。 如果我按NONE (无),那么WFP的1.0 将闪烁,而且WFP的4.0 将一直打开。









~<msp430fr4133.h>#include <driverlib.h>#include "main.h"#include "hal_lcd.h"#include <stdio.h> void main(void){ WDTCTTL = WDTPW + WHO1DLD;//停止WDT PM5CTL0 &=配置		的电源/高阻抗;配置的PIR/
							禁用PIR/
// WFP 1.0 引脚设置为输出,其余为输入
P4DIR |= BIT0;// WFP 4.0 引脚设置为输出,其余为输入

P2REN = BIT6;//为WFP 2.6
P2OUT |= BIT6启用内部上/下电阻;//为WFP 2.6
P1REN = BIT2选择上拉模式; //为WFP 1.2
P1OUT启用内部上拉/下拉电阻器|= BIT2;//为WFP 1.2

P1OUT = BIT0;//选择上拉模式;//打开LED
P4OUT = BIT0;//
同时打开LED (1)
{

	IF (P1IN & BIT2)=BIT2)//如果按下按钮S1 ...
	{
		P4OUT ^= BIT0;
	}
	ELSE IF (P2IN & 0x40)=0x40)// IF按钮S2被按下...
	{
		P1OUT ^= BIT0;
	}
	_DELAY周期(10万);//		延迟时间
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Daniel:

    您希望代码具有什么行为,并且您正在使用MSP430FR4133 Launchpad?

    根据您提供的代码,如果两个按钮都未按下,那么WFP 4.0 指示灯将闪烁。 这是因为启动板上的按钮处于低活动状态,这意味着在未按下该按钮时,其输入值将为'1',并且将执行以下代码行:

    	如果(P1IN和BIS2)==BIS2 //如果按下按钮S1 ...
    	{
    		P4OUT ^= BIT0;
    	} 

    由于P4OUT使用_DELAY周期(10万)时间切换BIT0,因此未按下任何按钮时,WFP 4.0 LED指示灯将闪烁。

    如果按下按钮S1,其值将变为'0',第一个IF语句将变为假,使WFP 4.0 LED保持按下按钮时的状态。 然后,该故障码将检查按钮S2是否被按下。 如果未按下按钮S2,其值将为'1',并执行以下代码:

    	否则IF ((P2IN和0x40)= 0x40)//如果按下按钮S2 ...
    	{
    		P1OUT ^= BIT0;
    	} 

    只要按下S1和S2不放,WFP 1.0 指示灯就会开始闪烁。 如果同时按下两个按钮,其连接的LED将不再闪烁,并保持按下按钮时的状态。

    此致,

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Rayn,

    我希望有以下行为:

    -未按下按钮= LED WFP 1.0 和WFP 4.0 已打开

    -按钮S1被按下= TOOGLE WFP 4.0

    按钮S2被按下= TOOGLE WFP 1.0


    我为我的问题找到了更好的解决方案。 如果您有一个用于我的旧代码的高级解决方案,我将为您解决这个问题。

    #include <msp430fr4133.h>
    #include <driverlib.h>
    包含"main.h"
    包含"hal_lcd.h"
    #include <stdio.h>
    #include <stdlib.h>

    //端口2中断服务例程
    #pragma vector=port2_vector
    __interrupt void Port_2 (void)

    P4OUT ^= BIT0;
    P2IFG &=~BIT6;// WFP 2.6 IFG已清除
    }

    //端口1中断服务例程
    #pragma vector=Port1_vector
    __interrupt void Port_1 (void)

    P1OUT ^= BIT0;
    P1IFG &=~BIT2; //已清除WFP 1.2 IFG
    }
    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;//停止WDT
    PM5CTL0 &=~LCKLPM5; //禁用GPIO开机默认高阻抗模式
    //以激活先前配置的端口设置
    P1OUT &= 0x00; //关闭P1上的所有内容
    P1DIR &= 0x00;
    P4OUT &= 0x00; //关闭P4上的所有内容
    P4DIR &= 0x00;
    P1DIR || BIT0;// WFP 1.0 引脚设置为输出,其余的为输入
    P4DIR || BIT0;// WFP 4.0 引脚设置为输出,其余的为输入

    P1OUT |= BIT0;//打开LED
    P4OUT |= BIT0;//打开LED

    P2REN |= BIT6;//为WFP 2.6 启用内部上/下电阻器
    P2OUT |= BIT6;//为WFP 2.6 选择上拉模式
    P2IE |= BIT6;//已启用WFP 2.6 中断
    P2IES |= BIT6;// WFP 2.6 高/低边缘
    P2IFG &=~BIT6;//WFP 2.6 IFG已清除

    P1REN |= BIT2;//为WFP 1.2 启用内部上/下电阻器
    P1OUT |= BIT2;//为WFP 1.2 选择上拉模式
    P1IE |= BIT2;//已启用WFP 1.2 中断
    P1IES |= BIT2;// WFP 1.2 高/低边缘
    P1IFG &=~BIT2;//已清除WFP 1.2 IFG
    __bis_sr_register(CPUOFF + GIE);//输入带中断的LPM0
    while (1){}//永远循环,我们使用中断
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Daniel:

    您不能获得比刚刚显示的中断代码更有效的代码! 如果您想节省更多电量,您可以更改为以下代码行以进入低功耗模式4,而不是低功耗模式0:

    __bis_sr_register(LPM4 | GIE);//输入带中断的LPM4 

    是否要在松开按钮时重新打开LED指示灯? 如果是这样,您应该在中断中切换边选择:

    //端口2中断服务例程
    #pragma vector=port2_vector
    __interrupt void Port_2(void)
    {
    P4OUT ^= BIT0;
    P2IES ^= BIT6;
    P2IFG &=~BIT6;//已清除2.6 IFG }//
    
    
    端口1中断服务例程#pragma
    vector=Port1_vector
    __interrupt Port_1(ITO_1=
    
    ^ 1PIT1;
    ^
    ~p= 1PIT1; //已清除WFP 1.2 IFG
    } 

    如果您想知道旧代码如何具有与您刚刚发布的带有中断的代码相同的功能,我可以向您展示如何执行此操作,但它不会比使用中断更有效。 :)

    此致,

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "如果您想知道旧代码如何具有与您刚刚发布的中断代码相同的功能,我可以向您展示如何操作,"

    哦,是的,请说,那会很好。 我要为你做一件事。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    技巧是检查按钮上的边线何时出现,而不是按钮的当前状态。 为此,您需要几个变量来存储While循环中上次检查的按钮状态。 我叫他们s1last和s2last。 在对输入进行所有计算之前,最好先存储输入的状态,以防代码行之间的输入值发生变化(硬件可能很棘手), 所以我添加了变量s1current和s2current来保存while循环开始时的输入值。

    然后,您将检查按钮的当前状态是否在按钮的最后一个状态未按下时被按下,这表示出现了下降边缘。 然后,您将相应地切换LED。 您还希望将IF-ELSE IF语句分成两个单独的IF语句,因为您总是要检查两个按钮的状态。 然后,在下次运行while循环时,您需要将最后一个按钮状态变量更新为当前按钮状态变量。 您可以缩短While循环结束时的延迟周期数,以便更好地响应用户输入。 您仍然需要一些延迟来抵消按钮弹跳的影响(同样,硬件也可能很棘手)。 您的代码应如下所示:

    #include <msp430fr4133.h>
    #include <driverlib.h>
    #include "main.h"
    #include <stdio.h>
    
    #include <stdlib.h>
    
    void main(void)
    {
    
    WDTCTL = WDTPW + WHODTLD;//停止WDT
    
    ,s1current,s2pmscar
    
    
    ,最后一个未签名的~ //禁用GPIO开机默认高阻抗模式
    //要激活先前配置的端口设置
    P1DIR |= BIT0;// WFP 1.0 引脚设置为输出,其余的为输入
    P4DIIR |= BIT0;// WFP 4.0 引脚设置为输出,其余的为输入
    
    P2REN = BIT6;//为WFP 2.6
    P2OUT |= BIT6启用内部上拉/下拉电阻器; //为WFP 2.6
    P1REN选择上拉模式= BIT2;//为WFP 1.2
    P1OUT |= BIT2启用内部上拉/下拉电阻器;//为WFP 1.2
    
    s1last选择上拉模式= BIT2;
    s2last = BIT6;
    
    P1OUT = BIT0;//
    
    打开LED P4OUT = BIT0;
    //同时打开LED
    
    s1电流= P1IN;
    s2电流= P2IN;
    
    
    IF (((s1current & BIt2)== 0)&&(s1last & BIt2)== BIt2)//如果按下按钮S1 ...
    {
    P4OUT ^= BIT0;
    }
    
    
    如果((s2current & BIT6)== 0)&&(s2last & BIT6)== BIT6)//如果按了按钮S2 ...
    {
    P1OUT ^= BIT0;
    }
    
    s1last = s1current;
    s2last = s2current;
    
    _DELAY周期(1000); //延迟时间
    }
    

    此致,

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的代码不起作用。
    在很短的时间内,您可以看到WFP 4.0 的闪烁,但立即可以看到WFP 1.0。 您也只能按S2。 S1失效。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    啊,我明白问题是什么。 当P1OUT和P4OUT设置在While循环之前时,它们将被设置为等于BIT0。 对于P1OUT,这会使BIT2成为'0',当上一行代码启用上/下拉电阻时,该值设置为'0'。 当在P1OUT中设置BIT2时,它成为一个上拉电阻,但当它再次被清除时,它变成了下拉电阻。

    按钮用于连接上拉电阻器,因为当按下按钮时,它们将输入连接到接地,输入值从'1'下降到'0'。 因为它连接到下拉电阻器,所以输入值一直是'0',所以按下按钮时没有看到任何变化。

    当您想在寄存器中设置一个位以避免意外更改其它位值时,最好使用“|=”。 对不起,我以前应该提到这一点。 同样,如果要清除位值,最好使用“&=”运算符来否定要清除的位,以避免更改其他位值。 以下是一个示例:

    PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式 

    因此,对于代码,您只需在打开LED时将"="更改为"|="即可。 以下是更新的代码:

    #include <msp430fr4133.h>
    #include <driverlib.h>
    #include "main.h"
    #include "hal_lcd.h>
    
    #include <stdio.h>
    
    void main(void)
    {
    unsigned char s1current, s2current;
    unsigned char s1last; s2last;
    
    wtctl = DTTPTT;~wlv/HOLD= WWD0 = WCLP;
    
    //禁用GPIO开机默认高阻抗模式
    //要激活先前配置的端口设置
    P1DIR |= BIT0;// WFP 1.0 引脚设置为输出,其余的为输入
    P4DIIR |= BIT0;// WFP 4.0 引脚设置为输出,其余的为输入
    
    P2REN |= BIT6;//为WFP 2.6
    P2OUT |= BIT6启用内部上拉/下拉电阻器; //为2.6
    P1REN选择上拉模式|= BIT2;//为WFP 1.2
    P1OUT选择内部上拉/下拉电阻器|= BIT2;//为WFP 1.2
    
    P1OUT选择上拉模式|= BIT0;//打开LED
    P4OUT |= BIT0;//打开LED
    
    s1last= BIT2
    
    
    
    
    s1电流= P1IN;
    s2电流= P2IN;
    
    
    IF (((s1current & BIt2)== 0)&&(s1last & BIt2)== BIt2)//如果按下按钮S1 ...
    {
    P4OUT ^= BIT0;
    }
    
    
    如果((s2current & BIT6)== 0)&&(s2last & BIT6)== BIT6)//如果按了按钮S2 ...
    {
    P1OUT ^= BIT0;
    }
    
    s1last = s1current;
    s2last = s2current;
    
    _DELAY周期(1000); //延迟时间
    }
    

    此致,

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ryan:

    您再次编码失败。 理由是,第21和第23行必须符合第33和第34行。 请参阅以下更正:

    #include <msp430fr4133.h>
    #include <driverlib.h>
    包含"main.h"
    包含"hal_lcd.h"
    #include <stdio.h>
    #include <stdlib.h>

    volatile unsigned char s1current, s2current;
    volatile unsigned char s1last, s2last;
    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;//停止WDT
    PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式
    //以激活先前配置的端口设置
    P1DIR || BIT0;// WFP 1.0 引脚设置为输出,其余的为输入
    P4DIR || BIT0;// WFP 4.0 引脚设置为输出,其余的为输入

    P2REN |= BIT6;//为WFP 2.6 启用内部上/下电阻器
    P2IN |= BIT6;//为WFP 2.6 选择上拉模式
    P1REN |= BIT2;//为WFP 1.2 启用内部上/下电阻器
    P1IN |= BIT2;//为WFP 1.2 选择上拉模式

    P1OUT |= BIT0;//打开LED
    P4OUT |= BIT0;//打开LED

    s1last = BIT2;
    s2last = BIT6;


    同时(1)


    s1电流= P1IN; //P1IN,非P1OUT
    s2电流= P2IN; //P2IN,非P2OUT


    IF (((s1current & BIt2)== 0)&&(s1last & BIt2)== BIt2)//如果按下按钮S1 ...

    P4OUT ^= BIT0;
    }


    如果((s2current & BIT6)== 0)&&(s2last & BIT6)== BIT6)//如果按了按钮S2 ...

    P1OUT ^= BIT0;
    }

    s1last = s1current;
    s2last = s2current;

    _DELAY周期(1000); //延迟时间
    }

    }