В настоящее время я работаю над платой Arduino Uno и пытаюсь написать ее на чистом C
без использования библиотек Arduino.
Мой проект, над которым я работаю, должен работать следующим образом:
Установите светодиоды PB0
на BP7
ON
и OFF
.
Установите прерывание на PD2, подключенном к кнопке.
При нажатии кнопки светодиоды должны ОСТАНОВИТЬ (пауза).
При повторном нажатии кнопки светодиоды должны снова повернуть ON
начиная с последнего светодиода, который был OFF
.
Точнее:
- Функция
play()
называется - Если я нажимаю КНОПКУ, функция
play()
должна ОСТАНОВИТЬ
Это означает, что если светодиод, подключенный к PB3
, был последнимСветодиод горит, когда я снова нажимаю кнопку, функция play()
должна продолжаться с PB4
.
Вот что у меня есть:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void play( void );
volatile uint8_t buttonWasPressed = 0;
const unsigned char LEDS[] = { PB0, PB1, PB2, PB3, PB4, PB5 };
int main(void)
{
DDRB = 0xFF; /// Set PORTB as OUTPUT
DDRD |= ( 1 << PD7 ); /// Set PIN7 IN DDRD as INPUT
PORTD &= ~( 1 << PD7 ); /// Set PIN7 on PORTD to LOW
DDRD &= ~( 1 << PD2 ); // Clear the PD2 pin and set PD2 (PCINT0 pin) now as input
PORTD |= (1 << PD2); // Set PIN PD2 as INPUT with pull-up enabled
EICRA |= (1 << ISC00); // set INT0 to trigger on ANY logic change
EIMSK |= (1 << INT0); // Turns on INT0
sei(); // turn on interrupts
while(1)
{
play();
}
}
ISR (INT0_vect)
{
uint8_t buttonState = PIND & ( 1 << PD2 );
if ( buttonState )
{
if ( buttonWasPressed == 0 )
{
PORTD ^= ( 1 << PD7 ); /// SET PIN 4 IN PORT B TO LOW
_delay_ms( 200 );
buttonWasPressed = 1; /// update button state
}
}
else /// The button is not pressed
{
buttonWasPressed = 0; /// Update the button state
}
}
void play( void )
{
for ( uint8_t i = 0 ; i < 6 ; i++ )
{
PORTB |= ( 1 << LEDS[i] ); ///Turn LED ON
_delay_ms( 250 );
PORTB &= ~( 1 << LEDS[i] ); ///Turn LED OFF
_delay_ms( 250 );
}
}
Вв этот момент функция play()
работает вечно, и если я нажимаю кнопку, светодиод, подключенный к PD7
, гаснет ON
и OFF
.