/* 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 }