-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMax6954.h
166 lines (140 loc) · 5.66 KB
/
Max6954.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
/***************
* NTP Clock
*
* Brad Hines
* Feb 2020
*/
#ifndef MAX6954_H
#define MAX6954_H
// D1 == GPIO5 is our CS
#define MAX_CS_GPIO (5)
// D5 == GPIO14 is our SCLK
#define MAX_SCLK_GPIO (14)
// D6 == GPIO12 is our MISO
#define MAX_SDIN_GPIO (12)
// D7 == GPIO13 is our MOSI
#define MAX_SDOUT_GPIO (13)
#include <Arduino.h>
#include "MaximBitBangSpi.h"
/***********************************
* MAX6954 register definitions
*/
#define MAX6954_REG_NoOp (0x00)
#define MAX6954_REG_DecodeMode (0x01)
#define MAX6954_REG_GlobalIntensity (0x02)
#define MAX6954_REG_ScanLimit (0x03)
#define MAX6954_REG_Configuration (0x04)
#define MAX6954_REG_GPIOData (0x05)
#define MAX6954_REG_PortConfiguration (0x06)
#define MAX6954_REG_DisplayTest (0x07)
#define MAX6954_REG_KEY_A_MSK_Deb (0x08)
#define MAX6954_REG_KEY_B_MSK_Deb (0x09)
#define MAX6954_REG_KEY_C_MSK_Deb (0x0A)
#define MAX6954_REG_KEY_D_MSK_Deb (0x0B)
#define MAX6954_REG_DigitType (0x0C)
#define MAX6954_REG_KEY_A_Pressed (0x0C)
#define MAX6954_REG_KEY_B_Pressed (0x0D)
#define MAX6954_REG_KEY_C_Pressed (0x0E)
#define MAX6954_REG_KEY_D_Pressed (0x0F)
#define MAX6954_REG_Intensity10 (0x10)
#define MAX6954_REG_Intensity32 (0x11)
#define MAX6954_REG_Intensity54 (0x12)
#define MAX6954_REG_Intensity76 (0x13)
#define MAX6954_REG_Intensity10a (0x14)
#define MAX6954_REG_Intensity32a (0x15)
#define MAX6954_REG_Intensity54a (0x16)
#define MAX6954_REG_Intensity76a (0x17)
#define MAX6954_REG_Digit0_PlaneP0 (0x20)
#define MAX6954_REG_Digit1_PlaneP0 (0x21)
#define MAX6954_REG_Digit2_PlaneP0 (0x22)
#define MAX6954_REG_Digit3_PlaneP0 (0x23)
#define MAX6954_REG_Digit4_PlaneP0 (0x24)
#define MAX6954_REG_Digit5_PlaneP0 (0x25)
#define MAX6954_REG_Digit6_PlaneP0 (0x26)
#define MAX6954_REG_Digit7_PlaneP0 (0x27)
#define MAX6954_REG_Digit0a_PlaneP0 (0x28)
#define MAX6954_REG_Digit1a_PlaneP0 (0x29)
#define MAX6954_REG_Digit2a_PlaneP0 (0x2A)
#define MAX6954_REG_Digit3a_PlaneP0 (0x2B)
#define MAX6954_REG_Digit4a_PlaneP0 (0x2C)
#define MAX6954_REG_Digit5a_PlaneP0 (0x2D)
#define MAX6954_REG_Digit6a_PlaneP0 (0x2E)
#define MAX6954_REG_Digit7a_PlaneP0 (0x2F)
#define MAX6954_REG_Digit0_PlaneP1 (0x40)
#define MAX6954_REG_Digit1_PlaneP1 (0x41)
#define MAX6954_REG_Digit2_PlaneP1 (0x42)
#define MAX6954_REG_Digit3_PlaneP1 (0x43)
#define MAX6954_REG_Digit4_PlaneP1 (0x44)
#define MAX6954_REG_Digit5_PlaneP1 (0x45)
#define MAX6954_REG_Digit6_PlaneP1 (0x46)
#define MAX6954_REG_Digit7_PlaneP1 (0x47)
#define MAX6954_REG_Digit0a_PlaneP1 (0x48)
#define MAX6954_REG_Digit1a_PlaneP1 (0x49)
#define MAX6954_REG_Digit2a_PlaneP1 (0x4A)
#define MAX6954_REG_Digit3a_PlaneP1 (0x4B)
#define MAX6954_REG_Digit4a_PlaneP1 (0x4C)
#define MAX6954_REG_Digit5a_PlaneP1 (0x4D)
#define MAX6954_REG_Digit6a_PlaneP1 (0x4E)
#define MAX6954_REG_Digit7a_PlaneP1 (0x4F)
#define MAX6954_REG_Digit0_PlanesP0P1 (0x60)
#define MAX6954_REG_Digit1_PlanesP0P1 (0x61)
#define MAX6954_REG_Digit2_PlanesP0P1 (0x62)
#define MAX6954_REG_Digit3_PlanesP0P1 (0x63)
#define MAX6954_REG_Digit4_PlanesP0P1 (0x64)
#define MAX6954_REG_Digit5_PlanesP0P1 (0x65)
#define MAX6954_REG_Digit6_PlanesP0P1 (0x66)
#define MAX6954_REG_Digit7_PlanesP0P1 (0x67)
#define MAX6954_REG_Digit0a_PlanesP0P1 (0x68)
#define MAX6954_REG_Digit1a_PlanesP0P1 (0x69)
#define MAX6954_REG_Digit2a_PlanesP0P1 (0x6A)
#define MAX6954_REG_Digit3a_PlanesP0P1 (0x6B)
#define MAX6954_REG_Digit4a_PlanesP0P1 (0x6C)
#define MAX6954_REG_Digit5a_PlanesP0P1 (0x6D)
#define MAX6954_REG_Digit6a_PlanesP0P1 (0x6E)
#define MAX6954_REG_Digit7a_PlanesP0P1 (0x6F)
/*********************************************
* Bitmasks for computing digit register numbers
*/
#define MAX6954_REG_PLANE0 (0x20)
#define MAX6954_REG_PLANE1 (0x40)
/*********************************************
* Register bit definitions
*/
#define MAX6954_CFG_SHUTDOWN_MODE (0x01) // Note that the device is shut down if this bit is zero. Must set to 1 to operate
//#define MAX6954_CFG_X (0x02) // Not used
#define MAX6954_CFG_BLINKRATE_FAST (0x04)
#define MAX6954_CFG_GLOBALBLINK_ENABLE (0x08)
#define MAX6954_CFG_GLOBALBLINK_TIMING_RESET (0x10)
#define MAX6954_CFG_GLOBAL_CLEAR_DIGIT_DATA (0x20)
#define MAX6954_CFG_USE_INDIVIDUAL_INTENSITIES (0x40)
#define MAX6954_CFG_BLNK_PHASE_READBACK (0x80)
// Digit types for Digit Type register. These are two-bit codes
// Reading between the lines, what you see is that a 0 means "interpret
// this as a 16-segment digit or device" while 1 means "interpret this
// digit as a 14-segment digit."
#define MAX6954_DIGIT_TYPE_16_AND_16 (0x00)
#define MAX6954_DIGIT_TYPE_14_AND_16 (0x01)
#define MAX6954_DIGIT_TYPE_16_AND_14 (0x10)
#define MAX6954_DIGIT_TYPE_14_AND_14 (0x11)
// Define a bitfield structure to hold the segment patterns for each digit
class tMax6954 {
public:
tMax6954();
void _SetupSPI();
void Init(uint8_t NumDigits);
void WriteCmd(uint8_t Register, uint8_t Data);
uint8_t ReadRegister(uint8_t Register);
void DisplayTest(bool bEnable);
void SetScanLimit(uint8_t NumDigits);
void WriteConfig(uint8_t u8Flags);
void NoOp();
void SetBrightness(uint8_t uiBrightness);
void SetDecodeMode(uint8_t uiDecodeFlags);
void SetDigitTypes(uint8_t DigitTypes76, uint8_t DigitTypes54,
uint8_t DigitTypes32, uint8_t DigitTypes10);
void WriteDigit(uint8_t u8Digit, uint8_t u8Planes, uint8_t u8Value);
protected:
uint8_t _u8ConfigRegisterValue;
tMaximBitBangSpi MySpi;
};
#endif /* MAX6954_H */