#include #include //include to get access to port defenitions #include #include #include /* Definitions and globals */ typedef enum { SCROLLING, MORSE_CODE } Mode; Mode led_mode; int num_passes; ticks_t next_event; // Scrolling int scroll_count; #define SCROLL_PASSES 2 #define SCROLL_LED_DELAY 15 #define SCROLL_SPACE_DELAY 3 // Morse code typedef enum {DASH, DOT, SPACE} MorseState; #define MORSE_SYMBOL_DELAY 35 #define MORSE_INTRA_CHAR_DELAY 25 #define MORSE_PASSES 2 #define NUM_MORSE_STATES 18 MorseState three_four_nine[NUM_MORSE_STATES] = {DOT, DOT, DOT, DASH, DASH, SPACE, DOT, DOT, DOT, DOT, DASH, SPACE, DASH, DASH, DASH, DASH, DOT, SPACE}; int morse_count; typedef enum {SYMBOL, INTRACHAR} MorseMode; MorseMode morse_mode; /* Prototypes */ void timer_handler(ticks_t ticks); void update_next_event(ticks_t ticks, ticks_t delay); void display_morse(MorseState m); void display_morse(MorseState m) { switch (m) { case DOT: LED_OFF(RED); LED_ON(BLUE); LED_OFF(YELLOW); break; case DASH: LED_ON(RED); LED_ON(BLUE); LED_ON(YELLOW); break; case SPACE: leds_off(); break; } } void update_next_event(ticks_t ticks, ticks_t delay) { next_event = ticks + delay; } void timer_handler(ticks_t ticks) { if (ticks == next_event) { switch (led_mode) { case SCROLLING: leds_off(); switch (scroll_count) { case 0: LED_ON(RED); update_next_event(ticks, SCROLL_LED_DELAY); break; case 2: LED_ON(BLUE); update_next_event(ticks, SCROLL_LED_DELAY); break; case 4: LED_ON(YELLOW); update_next_event(ticks, SCROLL_LED_DELAY); break; case 6: LED_ON(RED); update_next_event(ticks, SCROLL_LED_DELAY); break; default: update_next_event(ticks, SCROLL_SPACE_DELAY); break; } scroll_count++; if (scroll_count > 7) { scroll_count = 0; num_passes++; if (num_passes >= SCROLL_PASSES) { num_passes = 0; led_mode = MORSE_CODE; morse_count = 0; update_next_event(ticks, SCROLL_SPACE_DELAY*10); } } break; case MORSE_CODE: switch (morse_mode) { case SYMBOL: display_morse(three_four_nine[morse_count]); morse_mode = INTRACHAR; update_next_event(ticks, MORSE_SYMBOL_DELAY); break; case INTRACHAR: leds_off(); morse_mode = SYMBOL; update_next_event(ticks, MORSE_INTRA_CHAR_DELAY); morse_count++; break; } if (morse_count >= NUM_MORSE_STATES) { num_passes++; morse_count = 0; if (num_passes >= MORSE_PASSES) { num_passes = 0; led_mode = SCROLLING; update_next_event(ticks, MORSE_INTRA_CHAR_DELAY*2); } } break; } } } int main(void) { led_init(); init_timer0(timer_handler); next_event = 1; led_mode = SCROLLING; num_passes = 0; scroll_count = 0; morse_count = 0; morse_mode = SYMBOL; sei(); while (1); }