#include #include /* atoi() */ #include /* usleep() */ #define LED_A LP_PIN02 #define LED_B LP_PIN03 #define LED_C LP_PIN04 #define LED_D LP_PIN05 #define LED_E LP_PIN06 #define LED_F LP_PIN07 #define LED_G LP_PIN08 #define LED_DP LP_PIN09 #define LED_1 LP_PIN17 #define LED_2 LP_PIN16 #define LED_3 LP_PIN14 #define LED_POSITION_MASK (LED_1 | LED_2 | LED_3) #define LED_ALL (LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G | LED_DP | LED_1 | LED_2 | LED_3) #define DELAY 250 /* microsecond delay between displaying digits */ int digit2pins[] = { LED_A | LED_B | LED_C | LED_D | LED_E | LED_F, LED_B | LED_C, LED_A | LED_B | LED_G | LED_E | LED_D, LED_A | LED_B | LED_G | LED_C | LED_D, LED_F | LED_G | LED_B | LED_C, LED_A | LED_F | LED_G | LED_C | LED_D, LED_A | LED_F | LED_G | LED_E | LED_C | LED_D, LED_A | LED_B | LED_C, LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G, LED_A | LED_B | LED_C | LED_D | LED_F | LED_G }; int position2pins[] = { LED_1, LED_2, LED_3 }; void turnOnDigit(int digitPosition, int value); void shutDown(int p); int main(int argc, char * argv[]) { /* initialize the parapin user-land library */ pin_init_user(LPT1); /* set up pins as output pins */ pin_output_mode(LED_ALL); if (argc == 2) { /* get the value to display from the command-line */ int value = atoi(argv[1]); /* register an interrupt signal handler to clear the pins */ signal(SIGINT, shutDown); int digits[3]; register int i; for (i = 0; i < 3; i++) { digits[2-i] = value % 10; value /= 10; } /* loop displaying digits */ i = 0; for (;;) { turnOnDigit(i, digits[i]); usleep(DELAY); i++; if (i == 3) i = 0; } } else { clear_pin(LED_ALL); } } void turnOnDigit(int digitPosition, int value) { /* turn all pins off */ clear_pin(LED_ALL); /* enable the positional pin */ register int pinSet = LED_POSITION_MASK & ~position2pins[digitPosition]; pinSet |= digit2pins[value]; set_pin(pinSet); } void shutDown(int p) { clear_pin(LED_ALL); }