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/msp430fr5857:GPIO PxIN 寄存器。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/611469/ccs-msp430fr5857-gpio-pxin-register

器件型号:MSP430FR5857

工具/软件:Code Composer Studio

您好、

这个问题可能 看起来有点幼稚、但能听到我的声音。

当时、每个 PxIN 寄存器中的每个位反映相应 I/O 引脚上的输入信号值
引脚配置为 I/O 功能。 这些寄存器是只读的。
•位= 0:输入为低电平
•位= 1:输入为高电平

这是数据表中给出的值。 我的问题是、如果我将一个引脚设置为输出高电平、那么对于 PxIN 寄存器中的特定位、它是否会显示为高电平。?

谢谢你。

Viswanath

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

    查看 dataseet e.g.中的端口原理图 方框图中的第#85页显示输出信号被反馈回输入意味着、一旦您更改 PxOUT 值、同时将 PxDIR 设置为输出、您将在 PxIN 寄存器中看到这一点。

    此致、
    Dietmar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Deitmar、
    感谢您的回答。
    我之所以提出这个问题、是因为我编写了一个代码、将我的 MSP430fr5857与键盘相连。

    #include

    /*
    * main.c
    *
    //const char keypad[]={'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'*'、'0'、'#'};


    unsigned int keydetect()

    unsigned int p=15;
    unsigned int i=0;
    for (i=0;i<3;i++)

    unsigned int temp=0x00;
    unsigned int t2=0x00;
    unsigned int t3=0x00;
    P3DIR |= BIT0|BIT1|BIT2|BIT3;
    P3OUT &= 0x00;
    P3REN |= BIT4|BIT5|BIT6;
    P3OUT |=(0x01<<i);
    temp |= P3OUT;
    T2 |= P3IN;
    t3 |= t2|temp;
    交换机(T3)

    情况0x11:

    P=0;
    中断;

    情况0x21:

    P=1;
    中断;

    情况0x41:

    P=2;
    中断;

    情况0x12:

    P=3;
    中断;

    情况0x22:

    P=4;
    中断;

    案例42:

    P=5;
    中断;

    案例14:

    P=6;
    中断;

    案例24:

    P=7;
    中断;

    判例44:

    P=8;
    中断;

    案例18:

    P=9;
    中断;

    案例28:

    P=10;
    中断;

    情况48:

    P=11;
    中断;



    返回 p;

    空 led()

    P1DIR = BIT0|BIT1 |BIT2 | BIT3;
    unsigned int key;
    key=keydetect();
    P1OUT |=键;


    unsigned int main()


    WDTCTL = WDTPW | WDTHOLD;
    PM5CTL0 &=~LOCKLPM5;
    while (1)

    LED);



    以上是我的代码。 我连接了4个 LED、这些 LED 将在按下按钮后亮起。 但是、即使代码正确、它似乎也不起作用。 您能浏览一下代码、告诉我是否有任何错误?
    谢谢你
    Viswanath。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉。 这是修改后的代码。 请仔细阅读此内容。


    #include

    /*
    * main.c
    *
    //const char keypad[]={'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'*'、'0'、'#'};


    unsigned int keydetect()

    unsigned int p=15;
    unsigned int i=0;
    for (i=0;i<3;i++)

    unsigned int temp=0x00;
    unsigned int t2=0x00;
    unsigned int t3=0x00;
    P3DIR |= BIT0|BIT1|BIT2|BIT3;
    _DELAY_CYCLES (1600000);
    P3OUT &= 0x00;
    P3REN |= BIT4|BIT5|BIT6;
    P3OUT |=(0x01<<i);
    temp |= P3OUT;
    T2 |= P3IN;
    交换机(T3)

    情况0x11:

    P=0;
    中断;

    情况0x21:

    P=1;
    中断;

    情况0x41:

    P=2;
    中断;

    情况0x12:

    P=3;
    中断;

    情况0x22:

    P=4;
    中断;

    情况0x42:

    P=5;
    中断;

    情况0x14:

    P=6;
    中断;

    情况0x24:

    P=7;
    中断;

    情况0x44:

    P=8;
    中断;

    情况0x18:

    P=9;
    中断;

    情况0x28:

    P=10;
    中断;

    情况0x48:

    P=11;
    中断;



    返回 p;

    空 led()

    P1DIR = BIT0|BIT1 |BIT2 | BIT3;
    unsigned int key;
    key=keydetect();
    P1OUT |=键;


    unsigned int main()


    WDTCTL = WDTPW | WDTHOLD;
    PM5CTL0 &=~LOCKLPM5;
    while (1)

    LED);

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

    您好、Viswanath、

    那么、我假设您的 LED 连接到 P1.0 - P1.3、但我不会100%低估您对端口3所做的工作?

    您可以设置 P3.0-P3.3。 输出低电平、并在 for 循环中将1从 P3.0移位到 P3.3。
    在 P3.4 - P3.6上启用下拉电阻之前。 那么、您的按钮连接在哪里以及它们是如何连接的?
    P3.0-P3.3。 以某种方式连接到 P3.4 - P3.6?


    此外、为什么您不直接将 P3OUT 和 P3IN 写入变量、而是使用逻辑 OR 写入?

    在您修改的代码中、开关结构选择访问变量"t3" 、与之前的帖子相比、它从未写入、这是针对吗?

    为什么您不简单地将按钮连接到启用上拉/下拉的输入引脚并读取相应的输入寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Deitmar、
    P1.0- P1.3连接到 LED。 我使用的是3x4矩阵键盘(3列和4行)、其中行连接到 P3.0 - P3.3、列连接到 P3.4 - P3.6。 我想做的是、最初将列保持为输入(拉低)、然后将行和输出保持为低电平。 然后、在检查时、我将按顺序将每行设为高电平(通过使用 for loop)、然后检查按键操作。 如果任何列引脚为高电平(意味着按了键),则按'p'键的值,然后指定给 LED)功能。 这会使相应的 LED 亮起,然后我知道按下哪个键。 关于 T3、我忘记了在修改代码时删除变量声明。

    每个键都充当开关。 按下键时、开关关闭、因此连接了相应的列和行引脚。

    Viswanath
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    而不是开关情况下的 T3、我使用的是 T2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Viswanath、

    因此、您有12个按钮、您可以逐行激活这些按钮、并检查 P3.4-P3.6上的输入以检查列、对吧?

    但您使 t2 = t2 | p3IN、这意味着您之前的循环值存储在 t2上、因为您在 for 循环中循环0x01、0x02、0x04、0x08、我希望在 t2右侧的末尾有0xXF?  您可以通过调试器检查这一点吗?

    此外、您将 p 写入 KEY 和此值、或者将其写入 P1.0、这意味着您将已启用行的值写入 P1IN、我希望所有 LED 都正确亮起? 这意味着您需要确保在不再按下按钮时 LED 已关闭。

    那么、当您调试这个项目时、在没有按下按钮时、变量键的值是多少?
    这意味着您是否可以更具体地说什么不起作用? 变量是什么样的?

    希望这有道理。

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

    你(们)好。

    感谢你的帮助。 我已经编辑了代码、该代码起作用。

    这就是我想要做的。

    #include 
    
    /*
    * main.c
    *//
    /const char keystypad[]={'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'*'、'0'、'#'};
    unsigned int key= 0x00;
    unsigned int p;
    
    unsigned int keydetect (
    {)
    unsigned int temp、i、t2;
    P=15;
    for (i=0;i<4;i++)
    {
    温度= 0x00;
    T2=0x00;
    P3DIR = 0x00;
    P3DIR = BIT0|BIT1|BIT2|BIT3;
    P3OUT &= 0x00;
    P3REN = 0x70;
    温度=(0x01<<i);
    P3OUT =温度;
    T2 = P3IN;
    开关(T2)
    {
    情况0x11:
    {
    P=0;
    中断;
    }
    情况0x21:
    {
    P=1;
    中断;
    }
    情况0x41:
    {
    P=2;
    中断;
    }
    情况0x12:
    {
    P=3;
    中断;
    }
    情况0x22:
    {
    P=4;
    中断;
    }
    情况0x42:
    {
    P=5;
    中断;
    }
    情况0x14:
    {
    P=6;
    中断;
    }
    情况0x24:
    {
    P=7;
    中断;
    }
    情况0x44:
    {
    P=8;
    中断;
    }
    情况0x18:
    {
    P=9;
    中断;
    }
    情况0x28:
    {
    P=10;
    中断;
    }
    情况0x48:
    {
    P=11;
    中断;
    }
    }
    
    返回 p;
    }
    void led()
    {
    P1DIR = BIT0|BIT1 |BIT2 | BIT3;
    key=keydetect();
    P1OUT = KEY;
    }
    
    unsigned int main()
    {
    
    WDTCTL = WDTPW | WDTHOLD;
    PM5CTL0 &=~LOCKLPM5;
    while (1)
    {
    LED);
    }
    } 
    我只需要思考如何处理按键的去抖、但稍后会这样做 

    感谢您的所有帮助。



    Viswanath。