Mit einer schleife ginge es so:
1 | //...
|
2 | uint8_t i;
|
3 | for(i=1; i!=0; i<<=1;) {
|
4 | if (pattern & i) {
|
5 | SETPIN();
|
6 | }
|
7 | else {
|
8 | CLRPIN();
|
9 | }
|
10 | }
|
Allerdings fehlt da die Möglichkeit, die Bits den Port zuzuordnen :(
Aber du weißt doch, welche Bits in "pattern" zu welchem Segment gehören
und im
Optimalfall gehören Bits 'auf einer Seite' (Low-, bzw. Highbits) zu
einem Port:
1 | #define SEG_PORT_A PORTD
|
2 | #define SEG_DDR_A DDRD
|
3 | // Wenn jeweils ein Nibble zu einem Port gehört
|
4 | // Pins PD0 bis PD3
|
5 | #define SEG_MASK_A 0x0F
|
6 |
|
7 | #define SEG_PORT_B PORTB
|
8 | #define SEG_DDR_B DDRB
|
9 | // Wenn jeweils ein Nibble zu einem Port gehört
|
10 | //Pins: PB4-PB7
|
11 | #define SEG_MASK_B 0xF0
|
12 | void sev_seg_display_digit(uint8_t digit)
|
13 | {
|
14 | uint8_t pattern;
|
15 | pattern = seg_dat[digit];
|
16 | // besser/spart RAM (#include <avr/pgmspace.h>, beim AVR-GCC):
|
17 | // pattern = pgm_read_byte(segdat[digit]);
|
18 | SEG_PORT_A = (SEG_PORT_A & ~SEG_MASK_A) | (pattern & SEG_MASK_A);
|
19 | // loesche SEG-Bits setze neue SEG-Bits
|
20 | SEG_PORT_B = (SEG_PORT_B & ~SEG_MASK_B) | (pattern & SEG_MASK_B);
|
21 |
|
22 | /* Falls die Pins nicht exakt auf das High- oder Low-nibble passen:
|
23 | z.B. PD2-PD5*/
|
24 | #define SEG_A_LOW_PIN 2
|
25 | SEG_PORT_A = (SEG_PORT_A & ~(SEG_MASK_A<<SEG_A_LOW_PIN)
|
26 | | ((pattern & SEG_MASK_A)<<SEG_A_LOW_PIN);
|
27 | /* Das High-Nibble muss ggf. in die andere Richtung geschoben werden*/
|
28 | }
|
Die schnellste Möglichkeit wäre jedoch 'pattern' zu vergrößern (z.B. als
struct),
so dass du für jeden Port gleich das passende Byte ansprechen kannst:
1 | struct pins {uint8_t port1, uint8_t port2, uint8_t port3};
|
2 | const struct pins segdat[] = {{0x00, 0x02,0x40}, ...};
|
3 | // um SRAM zu sparen dann: "struct digit PROGMEM segdat[] = "
|
4 | struct pins pattern;
|
5 | pattern = segdat[digit];
|
6 | // in MASKx ist jedes Bit gesetzt, das zu einem segment gehört
|
7 | PORTA = (PORTA & ~(MASKA) | pattern.port1);
|
8 | PORTB = (PORTB & ~(MASKB) | pattern.port2);
|
9 | //etc.
|
hth. Jörg