-
Notifications
You must be signed in to change notification settings - Fork 0
/
FourBySeven.cpp
144 lines (128 loc) · 4 KB
/
FourBySeven.cpp
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
/*
* FourBySeven.cpp - Drives a 4x7-segment display using 2 8-bit shift registers
* Author - Will Taylor
* 2011.01.01
*/
#include "WProgram.h"
#include "FourBySeven.h"
// bit masks for mapping 4x7 display input to shift register output
#define D1_BIT 0b1000000000000000 // 1
#define D2_BIT 0b0100000000000000 // 2
#define L1_L2_BIT 0b0010000000000000 // 3
#define D3_BIT 0b0001000000000000 // 4
#define D4_BIT 0b0000100000000000 // 5
#define G_BIT 0b0000010000000000 // 6
#define DP_BIT 0b0000001000000000 // 7
#define E_BIT 0b0000000100000000 // 8
#define B_BIT 0b0000000010000000 // 9
#define A_BIT 0b0000000001000000 // 10
#define C_BIT 0b0000000000100000 // 11
#define L1_L2_BIT2 0b0000000000010000 // 12
#define F_BIT 0b0000000000001000 // 13
#define L3_BIT 0b0000000000000100 // 14
#define D_BIT 0b0000000000000001 // 15
#define L3_BIT2 0b0000000000000010 // 16
#define SEGMENTS A_BIT | B_BIT | C_BIT | D_BIT | E_BIT | F_BIT | G_BIT | DP_BIT
// defined by what segments are turned HIGH (off) for each number
#define N_0 G_BIT | DP_BIT
#define N_1 A_BIT | D_BIT | E_BIT | F_BIT | G_BIT | DP_BIT
#define N_2 C_BIT | F_BIT | DP_BIT
#define N_3 E_BIT | F_BIT | DP_BIT
#define N_4 A_BIT | D_BIT | E_BIT | DP_BIT
#define N_5 B_BIT | E_BIT | DP_BIT
#define N_6 A_BIT | B_BIT | DP_BIT
#define N_7 D_BIT | E_BIT | F_BIT | G_BIT | DP_BIT
#define N_8 DP_BIT
#define N_9 D_BIT | E_BIT | DP_BIT
const unsigned short positions[] = { D1_BIT, D2_BIT, D3_BIT, D4_BIT };
const unsigned short segments[] = { A_BIT, B_BIT, C_BIT, D_BIT, E_BIT, F_BIT, G_BIT };
const unsigned short numbers[] = { N_0, N_1, N_2, N_3, N_4, N_5, N_6, N_7, N_8, N_9 };
const unsigned short segmentMask = SEGMENTS;
int _serPin;
int _srclkPin;
int _rclkPin;
unsigned short markerBits = segmentMask & ~(DP_BIT | L1_L2_BIT2 | L3_BIT);
FourBySeven::FourBySeven(int serPin, int srclkPin, int rclkPin)
{
pinMode(serPin, OUTPUT);
pinMode(srclkPin, OUTPUT);
pinMode(rclkPin, OUTPUT);
_serPin = serPin;
_srclkPin = srclkPin;
_rclkPin = rclkPin;
}
void FourBySeven::display(int value)
{
int digits[4];
int temp = value;
for ( int i = 3; i >= 0 ; --i ) {
digits[i] = temp % 10;
temp = temp / 10;
}
for ( int i = 0; i < 4; ++i ) {
int digit = digits[i];
for ( int j = 0; j < 7; ++j ) {
unsigned short segmentBits = (segmentMask & ~segments[j]) | numbers[digit];
unsigned short outputBits = positions[i] | segmentBits;
writeBits(outputBits);
}
}
writeBits(markerBits);
}
void FourBySeven::enableMarker(Marker marker) {
switch ( marker ) {
case FourBySeven::DP1:
markerBits = markerBits | D1_BIT;
break;
case FourBySeven::DP2:
markerBits = markerBits | D2_BIT;
break;
case FourBySeven::DP3:
markerBits = markerBits | D3_BIT;
break;
case FourBySeven::DP4:
markerBits = markerBits | D4_BIT;
break;
case FourBySeven::L1L2:
markerBits = markerBits | L1_L2_BIT;
break;
case FourBySeven::L3:
markerBits = markerBits | L3_BIT;
break;
}
}
void FourBySeven::disableMarker(Marker marker) {
switch ( marker ) {
case FourBySeven::DP1:
markerBits = markerBits & ~D1_BIT;
break;
case FourBySeven::DP2:
markerBits = markerBits & ~D2_BIT;
break;
case FourBySeven::DP3:
markerBits = markerBits & ~D3_BIT;
break;
case FourBySeven::DP4:
markerBits = markerBits & ~D4_BIT;
break;
case FourBySeven::L1L2:
markerBits = markerBits & ~L1_L2_BIT;
break;
case FourBySeven::L3:
markerBits = markerBits & ~L3_BIT;
break;
}
}
void FourBySeven::clearMarkers() {
markerBits = segmentMask & ~(DP_BIT | L1_L2_BIT2 | L3_BIT);
}
void FourBySeven::writeBits(unsigned short bits) {
digitalWrite(_rclkPin, LOW);
for ( int i = 0; i < 16; ++i ) {
digitalWrite(_srclkPin, LOW);
digitalWrite(_serPin, 1 & bits);
digitalWrite(_srclkPin, HIGH);
bits = bits >> 1;
}
digitalWrite(_rclkPin, HIGH);
}