-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
HT16K33.h
173 lines (134 loc) · 5.02 KB
/
HT16K33.h
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#pragma once
//
// FILE: HT16K33.h
// AUTHOR: Rob Tillaart
// VERSION: 0.4.1
// DATE: 2019-02-07
// PURPOSE: Arduino Library for HT16K33 4x7segment display
// http://www.adafruit.com/products/1002
// URL: https://github.com/RobTillaart/HT16K33.git
#include "Arduino.h"
#include "Wire.h"
#define HT16K33_LIB_VERSION (F("0.4.1"))
// Supported characters
#define HT16K33_0 0
#define HT16K33_1 1
#define HT16K33_2 2
#define HT16K33_3 3
#define HT16K33_4 4
#define HT16K33_5 5
#define HT16K33_6 6
#define HT16K33_7 7
#define HT16K33_8 8
#define HT16K33_9 9
#define HT16K33_A 10
#define HT16K33_B 11
#define HT16K33_C 12
#define HT16K33_D 13
#define HT16K33_E 14
#define HT16K33_F 15
#define HT16K33_SPACE 16
#define HT16K33_MINUS 17
#define HT16K33_TOP_C 18 // c
#define HT16K33_DEGREE 19 // °
#define HT16K33_NONE 99
// Raw segments, See #28
//
// HEX codes 7 segment
//
// A 0x01
// F B 0x20 0x02
// G 0x40
// E C 0x10 0x04
// D dp 0x08 0x80
//
const uint8_t SEG_NONE = 0x00;
const uint8_t SEG_A = 0x01;
const uint8_t SEG_B = 0x02;
const uint8_t SEG_C = 0x04;
const uint8_t SEG_D = 0x08;
const uint8_t SEG_E = 0x10;
const uint8_t SEG_F = 0x20;
const uint8_t SEG_G = 0x40;
const uint8_t SEG_DP = 0x80;
class HT16K33
{
public:
HT16K33(const uint8_t address, TwoWire *wire = &Wire); // 0x70 .. 0x77
bool begin();
void reset();
bool isConnected();
// default _cache is true as it is ~3x faster but if one has noise
// on the I2C and wants to force refresh one can disable caching
// for one or more calls.
void clearCache();
void cacheOn();
void cacheOff();
void refresh(); // force writing of cache to display
void displayOn();
void displayOff();
void setBrightness(uint8_t value); // 0 .. 15
uint8_t getBrightness();
void setBlink(uint8_t value); // 0 .. 3 0 = off
uint8_t getBlink();
// 0,1,2,3,4 digits - will replace suppressLeadingZeroPlaces
void setDigits(uint8_t value);
uint8_t getDigits();
void displayClear();
bool displayInt(int n); // -999 .. 9999
bool displayHex(uint16_t n); // 0000 .. FFFF
// Date could be {month.day} or {day.hour} . as separator
// Time could be hh:mm or mm:ss or ss:uu (hundreds : as separator
// colon displays : lz = Leading Zero or space
bool displayDate(uint8_t left, uint8_t right, bool lz = true); // 00.00 .. 99.99
bool displayTime(uint8_t left, uint8_t right, bool colon = true, bool lz = true); // 00:00 .. 99:99
bool displaySeconds(uint16_t seconds, bool colon = true, bool lz = true); // 00:00 .. 99:99
// -999 .. 0.000 .. 9999
bool displayFloat(float f, uint8_t decimals = 3);
// -99 .. 0.00 .. 999
bool displayUnit(float f, uint8_t decimals = 2, uint8_t unitChar = HT16K33_SPACE);
void display(uint8_t *array); // array with 4 elements
void display(uint8_t *array, uint8_t point); // point = digit with . (0..3)
void displayColon(uint8_t on); // 0 = off
void displayRaw(uint8_t *array, bool colon = false); // max control
// from issue #21 - used in special layout :88:8'8 normal = 88:88 or 8.8.8.8
// value = 0 ==> all off.
// 2 = colon
// 4 = upper left point, left of the 1st digit
// 8 = lower left point, left of the 1st digit
// 16 = upper point between 3rd and 4th digit
void displayExtraLeds(uint8_t value);
bool displayVULeft(uint8_t value); // 0..8
bool displayVURight(uint8_t value); // 0..8
// DEBUG
void displayTest(uint8_t del);
// array as numbers
void dumpSerial(uint8_t *array, uint8_t point);
// display cache in HEX format
void dumpSerial();
uint8_t getAddress();
// EXPERIMENTAL
bool displayFixedPoint0(float f);
bool displayFixedPoint1(float f);
bool displayFixedPoint2(float f);
bool displayFixedPoint3(float f);
// use setDigits(); instead.
// 0 = off, 1,2,3,4 digits space instead of 0
void suppressLeadingZeroPlaces(uint8_t value);
// OBSOLETE 0.4.x
void brightness(uint8_t value) { setBrightness(value); };
void blink(uint8_t value) { setBlink(value); };
private:
void _refresh();
void writeCmd(uint8_t cmd);
void writePos(uint8_t pos, uint8_t mask);
void writePos(uint8_t pos, uint8_t mask, bool point);
uint8_t _address;
uint8_t _displayCache[5]; // for performance
bool _cache = true;
uint8_t _digits = 0;
uint8_t _bright;
uint8_t _blink;
TwoWire* _wire;
};
// -- END OF FILE --