-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTM1637.h
More file actions
157 lines (117 loc) · 7.46 KB
/
TM1637.h
File metadata and controls
157 lines (117 loc) · 7.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#pragma once
// число цыферок у дисплейчика, в моём 4, бывают на 6 - 8, но у мня нет,я не тестил
//
constexpr uint8_t NUM_DIGITS = 4;
enum class enTM1637Type : bool { Number = false, Time = true }; // перечисление: тип дисплея числа/время
enum class enTM1637Align: bool {Left = false, Right = true}; // перечисление: выравнивание влево/вправа
class TM1637
{
private:
static const uint8_t CMD_SET_DATA = 0x40; // следом папруть данные
static const uint8_t CMD_SET_ADDR = 0xC0; // следом пойдёт адрес
static const uint8_t MAGIC_NUM = 0x88; // особо не разбиралса, для чего это
static constexpr uint8_t MAX_BRIGHT_MASK = 0x07;
protected:
uint8_t FClockPin; // пин для клока
uint8_t FDataPin; // пин для данных
enTM1637Type FDisplayType : 1; // тип дисплея, с точками или с двоеточием (для чисел/для времени)
bool FPointVisible : 1; // видна ли точка/двоеточие при выводе
uint8_t FPointIndex : 3; // позиция точки на экранчике 0..7
uint8_t FBrightness : 3; // яркость свечения дисплейчика 0..7
uint8_t FOutData[NUM_DIGITS]; // буфер выводимых данных (уже перекодированный под сегменты)
uint8_t *FSavedData; // здесь будут сохраняться данные перед уходом в Sleep
void Start(void) const; // выдает старт условие на шину
void Stop(void) const; // выдает стоп условие на шину
// выводит в шину 1 байт данных млатшым битом впердё
//
void WriteByte(int8_t wr_data) const;
// вывод последовательно всего буфера + установка яркости
//
void Update(void);
// вывод строки с выравниванием влево/вправо
// по умолчанию - выравнивание влево
// обычно строки выравниваются влево, цифры - вправо
// выводит не более NUM_DIGITS символов из строки, остальные игнорит
//
void OutString(const char *AString, const enTM1637Align AAlign = enTM1637Align::Left);
// На входе принимает букву/цифру, и ищет в PROGMEM сегментную маску для него
// возвращает маску символа, если такой есть, или 0х00, если символа в таблице нетю
//
uint8_t GetSegments(const uint8_t ASymbol) const;
TM1637() = delete;
TM1637(TM1637&) = delete;
TM1637(TM1637&&) = delete; // ненужные конструкторы явно удалены
bool ReadACK(void); // true - пришол ACK, false - не дождались
public:
// канструктор. Принимает 2 пина (обязательно) и тип дисплея (необязательно)
// AClockPin - номер пина для тактирования (вывод CLK на дисплейчике)
// ADataPin - номер пина для данных (вывод DAT на дисплейчике)
// ADisplayType - тип дисплея, для чисел или для времени (с точками/двоеточием)
// по умолчанию - выбран дисплей с двоеточием (для времени)
//
TM1637(uint8_t AClockPin, uint8_t ADataPin, enTM1637Type ADisplayType = enTM1637Type::Time);
// по многочисленным просьбам трудящихся добавил, хоть он не особо и нужен
// Если всё работает, специально вызывать этот метод НЕ нужно
//
void Init(void);
// Перед отправкой контроллера в глубокий сон вызвать:
//
void Sleep(void); // Это просто гасит экран, запоминая, что на нем было выведено раньше
// После пробуждения от сна вызвать
//
void Wakeup(void); // Проснулись - покажем запомненное перед сном
// печатает первые NUM_DIGITS символов переданной строки
// с выравниванием. По умолчанию, выравнивание - влево
//
void Print(const char *AString, const enTM1637Align AAlign = enTM1637Align::Left);
// печатает двухбайтовое целое число со знаком
// по основанию ARadix (по умолчанию 10)
// число выравнивается вправо
// печатается не более NUM_DIGITS начальных цыфр числа, включая знак
//
void Print(const int ANumber, const uint8_t ARadix = 10);
void Print(const unsigned ANumber, const uint8_t ARadix = 10);
void Print(const long ANumber) { Print(int(ANumber), 10); };
// печать дробных чисел со знаком.
// c точностью APrecision знаков после запятой, по умолчанию - 1
// Если число длинное - печатаются первые NUM_DIGITS символов
// Если индекс точки находится в пределах 0 - NUM_DIGITS то она тоже печатается
//
void Print(const double AValue, const uint8_t APrecision = 1);
// для удобства печати времени, передаёшь часы/минуты, печатает c ведущими нулями
// и на своих местах, слева и справа от двоеточия
//
void PrintTime(const uint8_t AHours, const uint8_t AMinutes, const bool AShowPoint = true);
// для удобства. Передаешь число (со знаком) - печатает его и символ градуса за ним
//
void PrintDeg(const int8_t ADegrees);
// очистка дисплея
//
void Clear(void);
// устанавливает яркость дисплея от 0 до 7. 7 - самый яркий.
//
void SetBrightness(const uint8_t AValue);
// включает/выключает показ десятичной точки
//
void ShowPoint(const bool APointVisible);
void ShowPointPos(const uint8_t APointPos, const bool AVisible = true);
// переключает точку. если была включена - выключает и наоборот
// удобно мигать двоеточием в часах, не надо самому запоминать состояние
//
void ToggleColon(void);
// печать символа в определенном месте экрана
// APosition - в какой позиции печатать 0..NUM_DIGITS-1
// ASymbol - символ, который надо напечатать
// символ сразу же перекодируется и выводится в нужном месте
// ничего больше вызывать не надо
//
void PrintAt(const uint8_t APosition, const char ASymbol);
// аналогично Print(const char *AString)
// только оператором, чтоб можно было писать
// tm1637<<"Err2";
//
const TM1637 &operator <<(const char *AString) {
OutString(AString);
return *this;
}
};