我正在尝试在C中编写一个简单的程序,当我按下按钮时,它会关闭一排LED灯。我对嵌入式设备和使用按位运算符都很陌生,我无法弄清楚我做错了什么。
我正在使用带有Amega328p的Romeo板,它连接到I / O套件板,其中引脚分别连接到LED和按钮。
引脚具有DDRx PORTx和PINx设置。
我已将针脚D2-D7连接到JP3_1-6用于LED(我可以看到这部分有效)
我已将针脚D10(PB2)连接到JP2_5按钮(问题部分)
我连接了GND和amp;两个板上的VCC相互之间。
这是我的代码:
void main()
{
DDRD = 0b11111100; // open all registries to be used
PORTD = 0b11111100; // set all LEDs ON to start
DDRB = 0b00000000; // set as input
PORTB = 0b00000100; // set PB2 pull up resistors
if((PINB & 0b00000100)==0) // if buttons pressed
{
PORTD = 0b00000000; // turn all lights off
}
}
当我按下按钮时没有任何反应。我不认为这是董事会,因为我使用的是什么转换并不重要。
任何帮助或解决方案的方向将不胜感激。我认为这是代码,而不是我如何挂钩,但我是新手所以我可能是错的。
答案 0 :(得分:2)
发生的事情是if语句运行一次(可能在你按下按钮之前),然后是main返回。要解决此问题,您需要在while循环内运行if语句。类似的东西:
void main()
{
DDRD = 0b11111100; // open all registries to be used
PORTD = 0b11111100; // set all LEDs ON to start
DDRB = 0b00000000; // set as input
PORTB = 0b00000100; // set PB2 pull up resistors
while(1)
{
if((PINB & 0b00000100)==0) // if buttons pressed
{
PORTD = 0b00000000; // turn all lights off
}
//TODO: set LEDs on button release?
}
}
我不知道微控制器上的主要返回时会发生什么。一个常见的事情是主要被重新运行。