unsigned short values[16]; unsigned short limits[16]; enum { RESOLUTION=512 }; void setup( void ) { P1DIR = 0b11111111; P2DIR = 0b11111111; Serial.begin( 9600 ); for( unsigned x = 0; x < 16; x++ ) limits[x] = x * x + 1; } char cmd[4]; unsigned in = 0; int digit( char c ) { if( c >= '0' && c <= '9' ) return c - '0'; else if( c >= 'A' && c <= 'F' ) return 10 + c - 'A'; else if( c >= 'a' && c <= 'f' ) return 10 + c - 'a'; else return -1; } void tick( void ) { for( unsigned x = 0; x < 8; x++ ) { if( values[x] == limits[x] ) P1OUT &= ~(1 << x); // pin goes low else if( values[x] == 0 ) P1OUT |= 1 << x; // pin goes high values[x]++; if( values[x] > RESOLUTION ) values[x] = 0; } for( unsigned x = 0; x < 8; x++ ) { if( values[x+8] == limits[x+8] ) P2OUT &= ~(1 << x); // pin goes low else if( values[x+8] == 0 ) P2OUT |= 1 << x; // pin goes high values[x+8]++; if( values[x+8] > RESOLUTION ) values[x+8] = 0; } } void loop( void ) { if( Serial.available() ) { char c = Serial.read(); if( digit( c ) < 0 ) { in = 0; return; } cmd[in++] = c; if( in == 3 ) { in = 0; int pin = digit( cmd[0] ); if( pin >= 0 && pin <= 15 ) { unsigned val = (16 * digit( cmd[1] ) + digit( cmd[2] ) ) % RESOLUTION; limits[pin] = val; } else { in = 0; } } } tick(); }