151 lines
2.3 KiB
C
151 lines
2.3 KiB
C
|
|
/**
|
|
*
|
|
* Blinking LED ATTiny85 "hello world"
|
|
*
|
|
* Following the tutorial at:
|
|
* http://www.instructables.com/id/Honey-I-Shrunk-the-Arduino-Moving-from-Arduino-t/?ALLSTEPS
|
|
*
|
|
*/
|
|
|
|
#include <avr/io.h>
|
|
// F_CPU frequency to be defined at command line
|
|
#include <util/delay.h>
|
|
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
|
|
#define LED0 PB3
|
|
#define LED1 PB2
|
|
#define LED2 PB1
|
|
#define LED3 PB0
|
|
#define LED4 PB4
|
|
|
|
|
|
const int leds[] = {LED0, LED1, LED2, LED3, LED4};
|
|
#define LED_COUNT (sizeof(leds) / sizeof(leds[0]))
|
|
uint8_t led_states[LED_COUNT];
|
|
|
|
#define DELAY_NORMAL 100;
|
|
#define DELAY_SLOW 150;
|
|
#define DELAY_FAST 50;
|
|
const int DELAY = DELAY_NORMAL;
|
|
|
|
void led_on(int led_index)
|
|
{
|
|
PORTB |= (1 << leds[led_index]);
|
|
led_states[led_index] = 1;
|
|
}
|
|
|
|
void led_off(int led_index)
|
|
{
|
|
PORTB &= ~(1 << leds[led_index]);
|
|
led_states[led_index] = 0;
|
|
}
|
|
|
|
void setup_leds()
|
|
{
|
|
for (int i = 0; i != LED_COUNT; ++i)
|
|
{
|
|
DDRB |= (1 << leds[i]);
|
|
led_off(i);
|
|
led_states[i] = 0;
|
|
}
|
|
}
|
|
|
|
void accumulate_next(int led_index)
|
|
{
|
|
if(led_states[led_index])
|
|
{
|
|
led_off(led_index);
|
|
}
|
|
else
|
|
{
|
|
led_on(led_index);
|
|
}
|
|
_delay_ms(DELAY);
|
|
}
|
|
|
|
void accumulate()
|
|
{
|
|
for (int i = 0; i != LED_COUNT; ++i)
|
|
accumulate_next(i);
|
|
}
|
|
|
|
void accumulate_backwards()
|
|
{
|
|
for (int i = LED_COUNT - 1; i >= 0; --i)
|
|
accumulate_next(i);
|
|
}
|
|
|
|
void row_next(int led_index, int previous_led_index)
|
|
{
|
|
led_on(led_index);
|
|
led_off(previous_led_index);
|
|
_delay_ms(DELAY);
|
|
}
|
|
|
|
void row()
|
|
{
|
|
for (int i = 0; i != LED_COUNT; ++i)
|
|
{
|
|
int previous = (i + LED_COUNT - 1) % LED_COUNT;
|
|
row_next(i, previous);
|
|
}
|
|
}
|
|
|
|
void row_backwards()
|
|
{
|
|
for (int i = LED_COUNT - 1; i >= 0; --i)
|
|
{
|
|
int previous = (i + 1) % LED_COUNT;
|
|
row_next(i, previous);
|
|
}
|
|
}
|
|
|
|
void all_on()
|
|
{
|
|
for (int i = 0; i != LED_COUNT; ++i)
|
|
led_on(i);
|
|
}
|
|
|
|
void toggle_all()
|
|
{
|
|
for (int i = 0; i != LED_COUNT; ++i)
|
|
{
|
|
if(led_states[i])
|
|
led_off(i);
|
|
else
|
|
led_on(i);
|
|
}
|
|
}
|
|
|
|
void blink(int ntimes)
|
|
{
|
|
setup_leds();
|
|
for (int i = 0; i != ntimes * 2; ++i)
|
|
{
|
|
toggle_all();
|
|
_delay_ms(DELAY);
|
|
}
|
|
}
|
|
|
|
int main ()
|
|
{
|
|
setup_leds();
|
|
while (1)
|
|
{
|
|
accumulate();
|
|
accumulate_backwards();
|
|
accumulate();
|
|
accumulate_backwards();
|
|
row();
|
|
row_backwards();
|
|
row();
|
|
row_backwards();
|
|
blink(5);
|
|
}
|
|
return 0;
|
|
}
|
|
|