使用Atmega328P编程罗密欧电路板上的按钮开关

时间:2018-02-25 16:21:33

标签: c io embedded atmega

我正在尝试在C中编写一个简单的程序,当我按下按钮时,它会关闭一排LED灯。我对嵌入式设备和使用按位运算符都很陌生,我无法弄清楚我做错了什么。

我正在使用带有Amega328p的Romeo板,它连接到I / O套件板,其中引脚分别连接到LED和按钮。

Romeo Schematic

I / O Tainer Board原理图: enter image description here

引脚具有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
    }
}

当我按下按钮时没有任何反应。我不认为这是董事会,因为我使用的是什么转换并不重要。

任何帮助或解决方案的方向将不胜感激。我认为这是代码,而不是我如何挂钩,但我是新手所以我可能是错的。

1 个答案:

答案 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?
    }
}

我不知道微控制器上的主要返回时会发生什么。一个常见的事情是主要被重新运行。