1
1
//
2
2
// FILE: HT16K33.cpp
3
3
// AUTHOR: Rob Tillaart
4
- // VERSION: 0.3.6
4
+ // VERSION: 0.3.7
5
5
// DATE: 2019-02-07
6
6
// PURPOSE: Arduino Library for HT16K33 4x7segment display
7
7
// URL: https://github.com/RobTillaart/HT16K33
12
12
#include " HT16K33.h"
13
13
14
14
15
- // Commands
15
+ // Commands
16
16
#define HT16K33_ON 0x21 // 0=off 1=on
17
17
#define HT16K33_STANDBY 0x20 // bit xxxxxxx0
18
18
42
42
// 10 04
43
43
// 08
44
44
//
45
- static const uint8_t charmap[] = { // TODO PROGMEM ?
46
-
47
- 0x3F , // 0
48
- 0x06 , // 1
49
- 0x5B , // 2
50
- 0x4F , // 3
51
- 0x66 , // 4
52
- 0x6D , // 5
53
- 0x7D , // 6
54
- 0x07 , // 7
55
- 0x7F , // 8
56
- 0x6F , // 9
57
- 0x77 , // A
58
- 0x7C , // B
59
- 0x39 , // C
60
- 0x5E , // D
61
- 0x79 , // E
62
- 0x71 , // F
63
- 0x00 , // space
64
- 0x40 , // minus
45
+ static const uint8_t charmap[] = { // TODO PROGMEM ?
46
+
47
+ 0x3F , // 0
48
+ 0x06 , // 1
49
+ 0x5B , // 2
50
+ 0x4F , // 3
51
+ 0x66 , // 4
52
+ 0x6D , // 5
53
+ 0x7D , // 6
54
+ 0x07 , // 7
55
+ 0x7F , // 8
56
+ 0x6F , // 9
57
+ 0x77 , // A
58
+ 0x7C , // B
59
+ 0x39 , // C
60
+ 0x5E , // D
61
+ 0x79 , // E
62
+ 0x71 , // F
63
+ 0x00 , // space
64
+ 0x40 , // minus
65
+ 0x61 , // TOP_C
66
+ 0x63 , // degree °
65
67
};
66
68
67
69
68
70
// //////////////////////////////////////////////////
69
71
//
70
- // CONSTRUCTOR
72
+ // CONSTRUCTOR
71
73
//
72
74
HT16K33::HT16K33 (const uint8_t address, TwoWire *wire)
73
75
{
@@ -118,6 +120,10 @@ void HT16K33::reset()
118
120
}
119
121
120
122
123
+ // //////////////////////////////////////////////////
124
+ //
125
+ // CACHE
126
+ //
121
127
void HT16K33::clearCache ()
122
128
{
123
129
for (uint8_t i = 0 ; i < 5 ; i++)
@@ -127,6 +133,29 @@ void HT16K33::clearCache()
127
133
}
128
134
129
135
136
+ void HT16K33::cacheOn ()
137
+ {
138
+ _cache = true ;
139
+ }
140
+
141
+
142
+
143
+ void HT16K33::cacheOff ()
144
+ {
145
+ _cache = false ;
146
+ }
147
+
148
+
149
+ void HT16K33::refresh ()
150
+ {
151
+ _refresh ();
152
+ }
153
+
154
+
155
+ // //////////////////////////////////////////////////
156
+ //
157
+ // DISPLAY
158
+ //
130
159
void HT16K33::displayOn ()
131
160
{
132
161
writeCmd (HT16K33_ON);
@@ -142,12 +171,6 @@ void HT16K33::displayOff()
142
171
}
143
172
144
173
145
- void HT16K33::refresh ()
146
- {
147
- _refresh ();
148
- }
149
-
150
-
151
174
void HT16K33::blink (uint8_t value)
152
175
{
153
176
if (value > 0x03 ) value = 0x00 ;
@@ -178,7 +201,7 @@ void HT16K33::suppressLeadingZeroPlaces(uint8_t value)
178
201
179
202
// ////////////////////////////////////////
180
203
//
181
- // display functions
204
+ // display functions
182
205
//
183
206
void HT16K33::displayClear ()
184
207
{
@@ -188,7 +211,7 @@ void HT16K33::displayClear()
188
211
}
189
212
190
213
191
- // DIV10 & DIV100 optimize?
214
+ // DIV10 & DIV100 optimize?
192
215
bool HT16K33::displayInt (int n)
193
216
{
194
217
bool inRange = ((-1000 < n) && (n < 10000 ));
@@ -224,7 +247,7 @@ bool HT16K33::displayInt(int n)
224
247
}
225
248
226
249
227
- // 0000..FFFF
250
+ // 0000..FFFF
228
251
bool HT16K33::displayHex (uint16_t n)
229
252
{
230
253
uint8_t x[4 ], h, l;
@@ -239,7 +262,7 @@ bool HT16K33::displayHex(uint16_t n)
239
262
}
240
263
241
264
242
- // 00.00 .. 99.99
265
+ // 00.00 .. 99.99
243
266
bool HT16K33::displayDate (uint8_t left, uint8_t right, bool lz)
244
267
{
245
268
bool inRange = ((left < 100 ) && (right < 100 ));
@@ -256,7 +279,7 @@ bool HT16K33::displayDate(uint8_t left, uint8_t right, bool lz)
256
279
}
257
280
258
281
259
- // 00:00 .. 99:99
282
+ // 00:00 .. 99:99
260
283
bool HT16K33::displayTime (uint8_t left, uint8_t right, bool colon, bool lz)
261
284
{
262
285
bool inRange = ((left < 100 ) && (right < 100 ));
@@ -273,7 +296,7 @@ bool HT16K33::displayTime(uint8_t left, uint8_t right, bool colon, bool lz)
273
296
}
274
297
275
298
276
- // seconds / minutes max 6039 == 99:99
299
+ // seconds / minutes max 6039 == 99:99
277
300
bool HT16K33::displaySeconds (uint16_t seconds, bool colon, bool lz)
278
301
{
279
302
uint8_t left = seconds / 60 ;
@@ -316,15 +339,15 @@ bool HT16K33::displayFloat(float f, uint8_t decimals)
316
339
x[1 ] = h - x[0 ] * 10 ;
317
340
x[2 ] = l / 10 ;
318
341
x[3 ] = l - x[2 ] * 10 ;
319
- if (neg) // corrections for neg => all shift one position
342
+ if (neg) // corrections for neg => all shift one position
320
343
{
321
344
x[3 ] = x[2 ];
322
345
x[2 ] = x[1 ];
323
346
x[1 ] = x[0 ];
324
347
x[0 ] = HT16K33_MINUS;
325
348
point++;
326
349
}
327
- // add leading spaces
350
+ // add leading spaces
328
351
while (point + decimals < 3 )
329
352
{
330
353
x[3 ] = x[2 ];
@@ -340,9 +363,65 @@ bool HT16K33::displayFloat(float f, uint8_t decimals)
340
363
}
341
364
342
365
366
+ bool HT16K33::displayUnit (float f, uint8_t decimals, uint8_t unitChar)
367
+ {
368
+ bool inRange = ((-99.5 < f) && (f < 999.5 ));
369
+
370
+ bool neg = (f < 0 );
371
+ if (neg) f = -f;
372
+
373
+ if (decimals == 2 ) f = round (f * 100 ) * 0.01 ;
374
+ if (decimals == 1 ) f = round (f * 10 ) * 0.1 ;
375
+ if (decimals == 0 ) f = round (f);
376
+
377
+ int whole = f;
378
+ int point = 2 ;
379
+ if (whole < 100 ) point = 1 ;
380
+ if (whole < 10 ) point = 0 ;
381
+
382
+ if (f >= 1 )
383
+ {
384
+ while (f < 100 ) f *= 10 ;
385
+ whole = round (f);
386
+ }
387
+ else
388
+ {
389
+ whole = round (f * 100 );
390
+ }
391
+
392
+ uint8_t x[4 ];
393
+ x[0 ] = whole / 100 ;
394
+ whole = whole - x[0 ] * 100 ;
395
+ x[1 ] = whole / 10 ;
396
+ x[2 ] = whole % 10 ;
397
+ x[3 ] = unitChar;
398
+ if (neg) // corrections for neg => all shift one position
399
+ {
400
+ x[3 ] = unitChar;
401
+ x[2 ] = x[1 ];
402
+ x[1 ] = x[0 ];
403
+ x[0 ] = HT16K33_MINUS;
404
+ point++;
405
+ }
406
+ // add leading spaces
407
+ while (point + decimals < 2 )
408
+ {
409
+ x[3 ] = unitChar;
410
+ x[2 ] = x[1 ];
411
+ x[1 ] = x[0 ];
412
+ x[0 ] = HT16K33_SPACE;
413
+ point++;
414
+ }
415
+
416
+ display (x, point);
417
+
418
+ return inRange;
419
+ }
420
+
421
+
343
422
// ///////////////////////////////////////////////////////////////////
344
423
//
345
- // EXPERIMENTAL
424
+ // EXPERIMENTAL
346
425
//
347
426
bool HT16K33::displayFixedPoint0 (float f)
348
427
{
@@ -400,13 +479,13 @@ void HT16K33::displayRaw(uint8_t *array, bool colon)
400
479
401
480
bool HT16K33::displayVULeft (uint8_t value)
402
481
{
403
- bool inRange = (value < 9 ); // can display 0..8 bars
482
+ bool inRange = (value < 9 ); // can display 0..8 bars
404
483
uint8_t ar[4 ];
405
484
for (int idx = 3 ; idx >=0 ; idx--)
406
485
{
407
486
if (value >= 2 )
408
487
{
409
- ar[idx] = 0x36 ; // ||
488
+ ar[idx] = 0x36 ; // ||
410
489
value -= 2 ;
411
490
}
412
491
else if (value == 1 )
@@ -429,7 +508,7 @@ bool HT16K33::displayVURight(uint8_t value)
429
508
{
430
509
if (value >= 2 )
431
510
{
432
- ar[idx] = 0x36 ; // ||
511
+ ar[idx] = 0x36 ; // ||
433
512
value -= 2 ;
434
513
}
435
514
else if (value == 1 )
@@ -456,15 +535,16 @@ void HT16K33::display(uint8_t *array)
456
535
writePos (3 , charmap[array[2 ]]);
457
536
writePos (4 , charmap[array[3 ]]);
458
537
459
- // debug to Serial
460
- // dumpSerial(array, 0);
538
+ // debug to Serial
539
+ // dumpSerial(array, 0);
461
540
}
462
541
463
542
464
543
void HT16K33::display (uint8_t *array, uint8_t point)
465
544
{
466
- // debug to Serial
467
- // dumpSerial(array, point);
545
+ // debug to Serial
546
+ // dumpSerial(array, point);
547
+ // dumpSerial();
468
548
469
549
writePos (0 , charmap[array[0 ]], point == 0 );
470
550
writePos (1 , charmap[array[1 ]], point == 1 );
@@ -491,22 +571,23 @@ void HT16K33::displayExtraLeds(uint8_t value)
491
571
492
572
void HT16K33::dumpSerial (uint8_t *array, uint8_t point)
493
573
{
494
- // to debug without display
574
+ // to debug without display
495
575
for (int i = 0 ; i < 4 ; i++)
496
576
{
497
- if (array[i] == HT16K33_SPACE) Serial.print (" " );
577
+ if (array[i] == HT16K33_SPACE) Serial.print (" _ " );
498
578
else if (array[i] == HT16K33_MINUS) Serial.print (" -" );
499
579
else Serial.print (array[i]);
500
580
if (i == point) Serial.print (" ." );
501
581
}
502
- Serial.print (" " );
503
- Serial.println (point);
582
+ Serial.print (" (" );
583
+ Serial.print (point);
584
+ Serial.println (" )" );
504
585
}
505
586
506
587
507
588
void HT16K33::dumpSerial ()
508
589
{
509
- // to debug without display
590
+ // to debug without display
510
591
for (int i = 0 ; i < 4 ; i++)
511
592
{
512
593
if (_displayCache[i] < 0x10 ) Serial.print (" 0" );
@@ -554,7 +635,7 @@ void HT16K33::writePos(uint8_t pos, uint8_t mask)
554
635
void HT16K33::writePos (uint8_t pos, uint8_t mask, bool point)
555
636
{
556
637
if (point) mask |= 0x80 ;
557
- // if (_overflow) mask |= 0x80;
638
+ // if (_overflow) mask |= 0x80;
558
639
else mask &= 0x7F ;
559
640
writePos (pos, mask);
560
641
}
0 commit comments