如何解决如何检查是否按下了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 举报,一经查实,本站将立刻删除。