src/led7.c
author Tero Marttila <terom@paivola.fi>
Thu, 29 Jan 2015 23:11:44 +0200
changeset 107 05707929ff6f
parent 57 ee412c5be8b1
permissions -rw-r--r--
qmsk.web.async: handle HTTPExceptions
#define LED7_DDR    DDRB
#define LED7_PORT   PORTB
#define LED7_OE     PORTB1

// common anode?
#define LED7_ANODE  0

#define LED7_OFFSET 0
#define LED7_COUNT  2

static const uint8_t LED7SEG_FONT[] = {
    0b00111111,	// 0
    0b00000110,	// 1
    0b01011011,	// 2
    0b01001111,	// 3
    0b01100110,	// 4
    0b01101101,	// 5
    0b01111101,	// 6
    0b00000111,	// 7
    0b01111111,	// 8
    0b01100111,	// 9
    0b01110111,	// A
    0b01111100,	// B
    0b00111001,	// C
    0b01011110,	// D
    0b01111001,	// E
    0b01110001,	// F
};

enum {
    LED7SEG_DOT     = 0b10000000,
};

void led7_init (void)
{
    sbi(&LED7_PORT, LED7_OE); // disabled (low)
    sbi(&LED7_DDR, LED7_OE); // out
}

/*
 * Update external IO.
 */
void led7_update_raw (uint8_t *led7, char count)
{
    int i;

    for (i = 0; i < count; i++) {
        char raw = LED7SEG_FONT[led7[i]];

        spi_tx[LED7_OFFSET + i] = LED7_ANODE ? ~raw  : raw;
    } 
}

void led7_update_hex (unsigned char c)
{
    uint8_t led7[2];

    led7[0] = c >> 4;
    led7[1] = c & 0xF;
    
    return led7_update_raw(led7, sizeof(led7));
}

void led7_update (char state)
{
    static unsigned char i = 0;
    
    if (i) {
        // enable display
        cbi(&LED7_PORT, LED7_OE);
    }
    
    led7_update_hex(state);
 
    i++;
}