2023-08-26 17:08:09 +00:00
|
|
|
#include <avr/io.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Display pins should be mapped like this:
|
|
|
|
* a b c d e f g DP
|
|
|
|
* 0 1 2 3 4 5 6 7
|
|
|
|
*
|
2023-08-27 19:01:23 +00:00
|
|
|
* d1 d2 d3 d4
|
|
|
|
* 1 2 3 4
|
2023-08-26 17:08:09 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
void set_display_raw(volatile uint8_t * header, uint8_t data) {
|
|
|
|
*header = data;
|
|
|
|
}
|
|
|
|
|
2023-08-27 19:01:23 +00:00
|
|
|
uint8_t digit_to_binary(uint8_t input, uint8_t digit) {
|
|
|
|
switch(digit) {
|
|
|
|
case 0: return input | 0x3f;
|
|
|
|
case 1: return input | 0x06;
|
|
|
|
case 2: return input | 0x5b;
|
|
|
|
case 3: return input | 0x4f;
|
|
|
|
case 4: return input | 0x66;
|
|
|
|
case 5: return input | 0x6d;
|
|
|
|
case 6: return input | 0x7d;
|
|
|
|
case 7: return input | 0x07;
|
|
|
|
case 8: return input | 0x7f;
|
|
|
|
case 9: return input | 0x6f;
|
|
|
|
// by default only draw the period if it was provided in the input
|
|
|
|
default: return input & (uint8_t) 0x10000000;
|
2023-08-26 17:08:09 +00:00
|
|
|
}
|
2023-08-27 19:01:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void set_display(volatile uint8_t * header, uint8_t value, bool period) {
|
|
|
|
uint8_t byte = digit_to_binary(period << 7, value);
|
2023-08-26 17:08:09 +00:00
|
|
|
|
|
|
|
set_display_raw(header, byte);
|
|
|
|
}
|