====== 7-Segment-Anzeige ====== {{:examples:7-seg.jpg|}} Das Study Board ist meiner einer 7-Segment LED Anzeige und dem entsprechendem Treiber (A6275) ausgestattet. ({{:examples:datasheets:a6275_led_driver.pdf|datasheet}}). Der Treiber ist an PORT-C und PORT-G des Controllers angeschlossen. Der Schaltplan zeigt: Das Auffangregister (latch) liegt an PORT-G2, Serial an PORT-C6 und Clock an PORT-C7. {{:examples:7seg_schematics.jpg?500}} ===== Beispiel 1 ===== /* Basic ver 3 demo program 7-seg function and demo Raivo Sell/Erki Leitaru */ #define F_CPU 14745600UL #include #include #define SET(x) |= (1<=0; i--) //for every bit in the byte { //if bit is set, sets the data out pin if (bit_get(nr, BIT(i))) PORTC SET (6); //serial out else PORTC CLR (6); //serial out PORTC SET (7); //clock high nop_delay(8);//series of one cycle delays to ensure required timing (according to datasheet) PORTC CLR (7); //clock low nop_delay(8); } PORTG SET (2); //latch high } int main(void){ //7-seg init PORTC = 0xFF; // set output high -> turn all LEDs off DDRC = 0xF8; // PC0...PC2 -> input; PC3...PC5 -> output for LED; PC7 & PC6 outputs for clock and data DDRG = 0x04;//PG2 is latch output digit = 8; delta = 1;//increment or decrement while(1) { num++; _delay_ms(1000); digit=digit+delta;//change digit by delta if(digit>8) {delta=-1*delta;};//upper limit if(digit<1) {delta=-1*delta;};//lower limit write_display(); } } ===== Beispiel 2 ===== Dieses Bsp. nutzt die Header Datei pin.h für Pin-Operationen [[en:examples:digi:pin|"pin.h"]] // // Simple up/down counting single 7-segment digit example. // // Raivo Sell, Erki Leitaru, Mikk Leini // // 2009 // // Include avrlibc #include #include // Include common library #include "pin.h" // Configure pins #define SEGMENT_DISPLAY_LATCH PORTPIN(G, 2) #define SEGMENT_DISPLAY_DATA_OUT PORTPIN(C, 6) #define SEGMENT_DISPLAY_CLOCK PORTPIN(C, 7) // // 7 segment display initialization // void segment_display_init(void) { // Set latch, data out and clock pins as output pin_setup_output(SEGMENT_DISPLAY_LATCH); pin_setup_output(SEGMENT_DISPLAY_DATA_OUT); pin_setup_output(SEGMENT_DISPLAY_CLOCK); } // // Digit writing to 7 segment display // void segment_display_write(unsigned char digit) { unsigned char map; // Decimal to segment map switch (digit) { case 0 : map = 0b00111111; break; // Every bit corresponds to one segment case 1 : map = 0b00000110; break; // "1" case 2 : map = 0b01011011; break; // "2" case 3 : map = 0b01001111; break; // "3" and so on case 4 : map = 0b01100110; break; case 5 : map = 0b01101101; break; case 6 : map = 0b01111100; break; case 7 : map = 0b00000111; break; case 8 : map = 0b01111111; break; case 9 : map = 0b01100111; break; default: map = 0b01111001; // E like Error } // Latch low pin_clear(SEGMENT_DISPLAY_LATCH); // Send every bit in the byte. MSB (most significant bit) first. for (signed char i = 7; i >= 0; i--) { // If bit is set, sets the data out pin, otherwise not pin_set_to(SEGMENT_DISPLAY_DATA_OUT, IS_BIT_SET(map, i)); // Clock high for certain period pin_set(SEGMENT_DISPLAY_CLOCK) _delay_us(1); // Clock low for certain period pin_clear(SEGMENT_DISPLAY_CLOCK) _delay_us(1); } // Latch high pin_set(SEGMENT_DISPLAY_LATCH); } // // Program entrance function // int main(void) { unsigned char digit = 0; // Digit to display on segment signed char delta = 1; // Digit modifying value //digit = int (void) { return 2; }; // 7 segment display initialization segment_display_init(); // Endless loop while (1) { // Write digit segment_display_write(digit); // Increase digit value by delta (which can be negative also) digit += delta; // Swap counting direction on 0 and 9 if (digit == 0) delta = +1; if (digit == 9) delta = -1; // Wait 1000 ms _delay_ms(1000); } } ===== Externe Links ===== [[http://en.wikipedia.org/wiki/Seven-segment_display|7-segment display in Wikipedia]]