Files
Bizz-card/firmware/main.c

63 lines
2.0 KiB
C
Raw Normal View History

2018-06-06 09:26:03 +00:00
/*
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
}