63 lines
2.0 KiB
C
63 lines
2.0 KiB
C
|
/*
|
||
|
www.electropepper.org
|
||
|
|
||
|
Beerright 2017.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "main.h"
|
||
|
|
||
|
#define diceDelay 100 // LED speed change while shuffling
|
||
|
#define toggleDelay 300 // LED speed when stoped
|
||
|
#define none 0
|
||
|
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
GIMSK |= _BV(PCIE); // Enable pin change interrupt
|
||
|
PCMSK |= _BV(PB4); // Enable PORTB4 for pin change interrupt
|
||
|
sei(); // Enable global interrupts
|
||
|
DDRB &= ~_BV(PB4); // Set PORTB4 to input
|
||
|
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode for Power-down(see datasheet)
|
||
|
|
||
|
|
||
|
uint8_t randSeed = eeprom_read_byte ((uint8_t*)1); // Reads eeprom byte 1, value
|
||
|
// into variable randSeed
|
||
|
++randSeed; // Increments it
|
||
|
eeprom_write_byte ((uint8_t*)1, randSeed); // Writes value back into
|
||
|
// eeprom byte 1
|
||
|
srand (randSeed); // Creates seed for random number
|
||
|
// generator from randSeed value
|
||
|
|
||
|
|
||
|
while (1) {
|
||
|
for (stand_cycle = 0; stand_cycle < 40; stand_cycle++){ // Repeats 40 times next 4 lines
|
||
|
what_led(cur_led); // Turn ON LED number inside variable cur_led
|
||
|
_delay_ms(toggleDelay); // Wait
|
||
|
what_led(none); // Truen off all LED's
|
||
|
_delay_ms(toggleDelay); // Wait
|
||
|
}
|
||
|
sleep_mode(); // Go into sleep mode to save power, will came back alive
|
||
|
// after interrupt is generated
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ISR(PCINT0_vect) // Interrupt routine on pin change
|
||
|
{
|
||
|
for (uint8_t i = 0; i < 25; i++){ // Repeats 25 times next 3 lines
|
||
|
cur_led = ((rand() % 7) + 1); // Creates random integer from 0 to 6 into cur_led
|
||
|
what_led(cur_led); // Turn ON LED number inside variable cur_led
|
||
|
_delay_ms(diceDelay); // Wait
|
||
|
}
|
||
|
stand_cycle = 0; // Resets the standby blinking times
|
||
|
}
|
||
|
|
||
|
|
||
|
void what_led(uint8_t led)
|
||
|
{
|
||
|
int8_t ledN = led_table[led]; // Reads led_table given number(led) into ledN
|
||
|
DDRB = ledN & 0x0F; // Copy first ledN nibble into DDRB
|
||
|
ledN = (ledN & 0xF0) >> 4; // Move second nibble into first nibble
|
||
|
PORTB = ledN & 0x0F; // Copy first ledN nibble into PORTB
|
||
|
}
|