#include #include #define output(directions,pin) (directions |= pin) // set port direction for output #define input(directions,pin) (directions &= (~pin)) // set port direction for input #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define led_delay() _delay_ms(1) // LED delay #define blink_delay() _delay_ms(100) // blink delay #define led_port PORTA #define led_direction DDRA #define A (1 << PA1) // row 1 #define B (1 << PA2) // row 2 #define C (1 << PA3) // row 3 #define D (1 << PA4) // row 4 #define E (1 << PA5) // row 5 void flash(uint8_t from, uint8_t to, uint8_t delay) { // // source from, sink to, flash // static uint8_t i; set(led_port,from); clear(led_port,to); output(led_direction,from); output(led_direction,to); for (i = 0; i < delay; ++i) led_delay(); input(led_direction,from); input(led_direction,to); } void led_cycle(uint8_t number, uint8_t delay) { // // cycle through LEDs // uint8_t i; for (i = 0; i < number; ++i) { flash(B,A,delay); flash(C,A,delay); flash(D,A,delay); flash(E,A,delay); flash(A,B,delay); flash(C,B,delay); flash(D,B,delay); flash(E,B,delay); flash(A,C,delay); flash(B,C,delay); flash(D,C,delay); flash(E,C,delay); flash(A,D,delay); flash(B,D,delay); flash(C,D,delay); flash(E,D,delay); flash(A,E,delay); flash(B,E,delay); flash(C,E,delay); flash(D,E,delay); } } void display_H(uint8_t number, uint8_t delay) { // // letter H // uint8_t i; for (i = 0; i < number; ++i) { // left leg flash(B,A,delay); flash(A,B,delay); flash(A,C,delay); flash(A,D,delay); flash(A,E,delay); // middle line flash(B,C,delay); flash(D,C,delay); //right leg flash(D,E,delay); flash(E,D,delay); flash(E,C,delay); flash(E,B,delay); flash(E,A,delay); } } void display_E(uint8_t number, uint8_t delay) { // // letter E // uint8_t i; for (i = 0; i < number; ++i) { // left leg flash(B,A,delay); flash(A,B,delay); flash(A,C,delay); flash(A,D,delay); flash(A,E,delay); // middle line flash(B,C,delay); flash(D,C,delay); //top leg flash(B,A,delay); flash(C,A,delay); flash(D,A,delay); flash(E,A,delay); // bottom leg flash(A,E,delay); flash(B,E,delay); flash(C,E,delay); flash(D,E,delay); } } void display_L(uint8_t number, uint8_t delay) { // // letter L // uint8_t i; for (i = 0; i < number; ++i) { // left leg flash(B,A,delay); flash(A,B,delay); flash(A,C,delay); flash(A,D,delay); flash(A,E,delay); // bottom leg flash(A,E,delay); flash(B,E,delay); flash(C,E,delay); flash(D,E,delay); } } void display_O(uint8_t number, uint8_t delay) { // // letter O // uint8_t i; for (i = 0; i < number; ++i) { // left leg flash(B,A,delay); flash(A,B,delay); flash(A,C,delay); flash(A,D,delay); flash(A,E,delay); //top leg flash(B,A,delay); flash(C,A,delay); flash(D,A,delay); flash(E,A,delay); // bottom leg flash(A,E,delay); flash(B,E,delay); flash(C,E,delay); flash(D,E,delay); //right leg flash(D,E,delay); flash(E,D,delay); flash(E,C,delay); flash(E,B,delay); flash(E,A,delay); } } int main(void) { // // set clock divider to /1 // CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // // main loop // while (1) { // cycle thorugh 1 time with 100 ms between //led_cycle(1,100); // led_cycle(3,20); // cycle through 100 times with 1 ms between display_H(10,1); blink_delay(); display_E(10,1); blink_delay(); display_L(15,1); blink_delay(); display_L(15,1); blink_delay(); display_O(10,1); blink_delay(); } }