-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHC4053.h
145 lines (114 loc) · 2.23 KB
/
HC4053.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
#pragma once
//
// FILE: HC4053.h
// AUTHOR: Rob Tillaart
// DATE: 2023-01-25
// VERSION: 0.2.1
// PURPOSE: Arduino library for CD74HC4053 8 channel multiplexer and compatibles.
// URL: https://github.com/RobTillaart/HC4053
#include "Arduino.h"
#define HC4053_LIB_VERSION (F("0.2.1"))
class HC4053
{
public:
explicit HC4053(uint8_t A, uint8_t B, uint8_t C, uint8_t enablePin = 255)
{
_pins[0] = A;
_pins[1] = B;
_pins[2] = C;
uint8_t i = 3;
while (i--)
{
pinMode(_pins[i], OUTPUT);
digitalWrite(_pins[i], LOW);
}
// two states only (could be one byte)
_channelA = 0;
_channelB = 0;
_channelC = 0;
if (enablePin != 255)
{
_enablePin = enablePin;
pinMode(_enablePin, OUTPUT);
digitalWrite(_enablePin, HIGH);
}
}
bool setChannel(uint8_t channel, bool disable = true)
{
if (channel > 1) return false;
if (disable)
{
this->disable();
}
setChannelA(channel);
setChannelB(channel);
setChannelC(channel);
enable();
return true;
}
void setChannelA(uint8_t channel)
{
if (_channelA != (channel & 0x01))
{
_channelA = channel & 0x01;
digitalWrite(_pins[0], _channelA);
}
}
void setChannelB(uint8_t channel)
{
if (_channelB != (channel & 0x01))
{
_channelB = channel & 0x01;
digitalWrite(_pins[1], _channelB);
}
}
void setChannelC(uint8_t channel)
{
if (_channelC != (channel & 0x01))
{
_channelC = channel & 0x01;
digitalWrite(_pins[2], _channelC);
}
}
uint8_t getChannelA()
{
return _channelA;
}
uint8_t getChannelB()
{
return _channelB;
}
uint8_t getChannelC()
{
return _channelC;
}
void enable()
{
if (_enablePin != 255)
{
digitalWrite(_enablePin, LOW);
}
}
void disable()
{
if (_enablePin != 255)
{
digitalWrite(_enablePin, HIGH);
}
}
bool isEnabled()
{
if (_enablePin != 255)
{
return (digitalRead(_enablePin) == LOW);
}
return true;
}
private:
uint8_t _pins[3];
uint8_t _enablePin = 255;
uint8_t _channelA = 0;
uint8_t _channelB = 0;
uint8_t _channelC = 0;
};
// -- END OF FILE --