// two-bit up/down counter FSM: B0 = count down, B1 = count up volatile int B0, B1, tick; // button and timer flags void C0(void) { tick = 1; } // FSM clock Timer t0( 1000, C0); // 1 second void setup() { pinMode( D0, OUTPUT); pinMode( D7, OUTPUT); // LEDs pinMode( A0, INPUT_PULLDOWN); pinMode( A1, INPUT_PULLDOWN); // buttons t0.start(); // timer } enum states { s00, s01, s10, s11 }; // enum creates distinct integer constants enum states state = s00, next; // current and next state variables void FSM(void) { B0 = digitalRead( A0); B1 = digitalRead( A1); // inputs next = state; // stay in current state by default switch( state) { case s00: digitalWrite( D0, 0); digitalWrite( D7, 0); if( B0) next = s11; else if( B1) next = s01; break; case s01: digitalWrite( D0, 0); digitalWrite( D7, 1); if( B0) next = s00; else if( B1) next = s10; break; case s10: digitalWrite( D0, 1); digitalWrite( D7, 0); if( B0) next = s01; else if( B1) next = s11; break; case s11: digitalWrite( D0, 1); digitalWrite( D7, 1); if( B0) next = s10; else if( B1) next = s00; break; } state = next; // update state } void loop() { if(tick) { FSM(); tick = 0; } }