You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.8 KiB
72 lines
1.8 KiB
#include "ufb/fb_7seg.h"
|
|
#include "ufb/progmem.h"
|
|
|
|
enum SevenSegBars {
|
|
T = 1, RT = 2, RB = 4, B = 8, LB = 16, LT = 32, M = 64
|
|
};
|
|
|
|
static const uint8_t PROGMEM seven[] = {
|
|
[0] = T | RT | RB | B | LB | LT,
|
|
[1] = RT | RB,
|
|
[2] = T | RT | M | LB | B,
|
|
[3] = T | RT | M | RB | B,
|
|
[4] = RT | RB | M | LT,
|
|
[5] = T | LT | M | RB | B,
|
|
[6] = T | LT | LB | B | RB | M,
|
|
[7] = T | RT | RB,
|
|
[8] = T | LT | RT | LB | RB | B | M,
|
|
[9] = T | LT | RT | RB | B | M,
|
|
};
|
|
|
|
fbpos_t fb_7seg_dig(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, fbpos_t th, uint8_t digit, fbcolor_t color)
|
|
{
|
|
const uint8_t mask = digit > 9 ? 0 : pgm_read_byte(&seven[digit]);
|
|
const fbpos_t wi = w - th * 2;
|
|
const fbpos_t hi = (h - th * 3) / 2;
|
|
|
|
bool bcolor = !color; // changed for XOR
|
|
|
|
fb_rect(x + th,
|
|
y,
|
|
wi,
|
|
th, bcolor ^ (bool) (mask & T));
|
|
|
|
fb_rect(x + th,
|
|
y + th + hi,
|
|
wi,
|
|
th, bcolor ^ (bool) (mask & M));
|
|
|
|
fb_rect(x + th,
|
|
y + th * 2 + hi * 2,
|
|
wi,
|
|
th, bcolor ^ (bool) (mask & B));
|
|
|
|
fb_rect(x,
|
|
y + th,
|
|
th,
|
|
hi, bcolor ^ (bool) (mask & LT));
|
|
|
|
fb_rect(x + th + wi,
|
|
y + hi + th,
|
|
th,
|
|
hi, bcolor ^ (bool) (mask & LB));
|
|
|
|
fb_rect(x + th + wi,
|
|
y + th,
|
|
th,
|
|
hi, bcolor ^ (bool) (mask & RT));
|
|
|
|
fb_rect(x + th + wi,
|
|
y + th * 2 + hi,
|
|
th,
|
|
hi, bcolor ^ (bool) (mask & RB));
|
|
|
|
return w;
|
|
}
|
|
|
|
fbpos_t fb_7seg_period(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, fbpos_t th, fbcolor_t color)
|
|
{
|
|
const fbpos_t hi = (h - th * 3) / 2;
|
|
fb_rect(x, y + hi * 2 + th * 2, th, th, color);
|
|
return th;
|
|
}
|
|
|