| Code: // Светодиодный чарлиплексинг: 3x8 LED DL3-2532RB-6
#define L1 2 #define L2 3 #define L3 4 #define L4 5 #define L5 6 #define L6 7
#define T_SYS_US 500 //24 * 500 = 12000
#define in(x) DDRD &= ~(1<<(x)) #define out(x) DDRD |= 1<<(x) #define on(x) PORTD |= 1<<(x) #define off(x) PORTD &= ~(1<<(x))
void setup() { display(0, false, false); }
void loop() { every_us(T_SYS_US) led();
static uint16_t cnt; //тест every(500) { if (++cnt >= 1000 * 4) cnt = 0; display(cnt % 1000, cnt >= 1000, cnt >= 2000); } }
const uint8_t pins[] = { //распиновка: анод, катод //a b c d e f g h L3,L2, L4,L2, L2,L5, L6,L2, L5,L2, L2,L3, L2,L4, L1,L2, L4,L5, L5,L3, L5,L4, L4,L3, L3,L6, L3,L4, L3,L5, L1,L3, L6,L1, L6,L3, L6,L5, L4,L6, L6,L4, L5,L6, L5,L1 };
static uint8_t segment[] = { 0, 0, 0 }; //буфер индикатора
void led() { static uint8_t i; //индекс на текущий сегмент static uint8_t j; //индекс буфера (текущее знакоместо) static uint8_t mask = 1<<6; //маска на текущий сегмент в буфере
off(pins[i]); //выключим ранее включенный сегмент in(pins[i++]); //анод in(pins[i++]); //катод if (i >= sizeof(pins)) { //на следующий с начала i = 0; j = 0; mask = 1<<7; }
if (segment[j] & mask) { //включим новый сегмент on(pins[i]); out(pins[i++]); //анод = 1 out(pins[i--]); //катод = 0 } mask >>= 1; //новая маска if (!mask) { mask = 1<<7; ++j; } }
const uint8_t font[] = { //abcdefgh B11111100, //0 B01100000, //1 B11011010, //2 B11110010, //3 B01100110, //4 B10110110, //5 B10111110, //6 B11100000, //7 B11111110, //8 B11110110 //9 };
// преобразуем в шрифт static uint8_t getFont(uint8_t bin) { return bin <= 9 ? font[bin] : 0; }
void display(uint16_t bin, bool dot1, bool dot2) { segment[0] = getFont(bin / 100) | dot1; segment[1] = getFont(bin / 10 % 10) | dot2; segment[2] = getFont(bin % 10); }
| |