微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查是否按下了PORTx上的某个PIN

如何解决如何检查是否按下了PORTx上的某个PIN

所以我有一个作业,希望我在按下PD2上的按钮时执行某些代码

我现在遇到的问题是我真的不知道该检查什么也不做 我了解基本逻辑。

所以这是我到目前为止提出的代码

 DDRD=0x00;   //PORTD pin 0 as input
    PORTD=0x00;
    
    DDRB=0xFF;   //PORTB as output
    PORTB=0x00;
    
    
    while(1){
        if (PIND & (1<<PD2)==1) // check if PD2 is pressed on PIND2
        {
            // modify bits on PORTB here
        }
        
        }


我正在使用Atmega328,并在AtmelStudio 7上运行

解决方法

要将PD2设置为输入,请运行此C / C ++代码,该代码将清除寄存器DDRD中的位2。无需修改整个寄存器:

DDRD &= ~(1 << 2);

(您可以跳过此步骤,因为在AVR重置后,默认情况下每个引脚都是输入。)

我不知道您如何接线。如果按钮连接在引脚和GND之间,并且没有外部上拉电阻将您的引脚拉高,那么您应该通过运行以下代码(将第2位设为1)启用输入引脚后的内部上拉功能在寄存器PORTD中:

PORTD |= 1 << 2;

现在要读取按钮的状态,您可以使用此C / C ++表达式,如果该引脚为低电平,则该表达式为0;如果该引脚为高,则该表达式为非零:

PIND & (1 << 2)

以下表达式也适用。它的优点是总是求值为0或1:

PIND >> 2 & 1

这里有一些(未经测试的)代码将它们绑在一起,从PD2读取并将PD2的值写入PB3的输出:

#include <avr/io.h>

int main()
{
  // Make PD2 an input,pulled high.
  DDRD &= ~(1 << 2);
  PORTD |= 1 << 2;

  // Make PB3 an output.
  DDRB |= 1 << 3;

  while (1)
  {
    if (PIND >> 2 & 1)
    {
      // PD2 is high,so drive PB3 high.
      PORTB |= 1 << 3;
    }
    else
    {
      // PD2 is low,so drive PB3 low.
      PORTB &= ~(1 << 3);
    } 
  }
}

您可能必须调整处理输出的代码部分。我实际上不知道您的输出在什么引脚上以及想要什么样的行为,所以我只是做了一些简单的事情。

此代码充满了C位运算符。对于您而言,重要的是要获得一本有关C的好书并确切地了解这些运算符的工作,如果我尝试教给他们所有这些知识,这个答案将太长了。这是供您学习的运算符列表:<<>>&&=||=,{{1 }}。

,
unsigned char input_byte;
while(1){
    __no_operation(); /* using nop for synchronization */
    input_byte = PIND; /* read entire PIND */
}

这样,您应该能够在每个程序周期读取输入。但是我还没有测试过。在再次读取PIND之前,请务必使用__no_operation()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。