Skip to content

Commit 5a52867

Browse files
committed
add shiftIn and shiftOut
1 parent 2dc9168 commit 5a52867

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

core-extend/Common.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ void analogWriteDAC(pin_size_t pinNumber, int val);
4444
void indexAnalogWrite(pin_size_t index, int val);
4545
void analogWrite(PinName pinName, int val);
4646

47+
void indexShiftOut(pin_size_t data_index, pin_size_t clock_index, BitOrder bitOrder, uint8_t val);
48+
void shiftOut(PinName dataPinName, PinName clockPinName, BitOrder bitOrder, uint8_t val);
49+
50+
pin_size_t indexShiftIn(pin_size_t data_index, pin_size_t clock_index, BitOrder bitOrder);
51+
pin_size_t shiftIn(PinName dataPinName, PinName clockPinName, BitOrder bitOrder);
52+
4753
#ifdef __cplusplus
4854

4955
void indexTone(pin_size_t index, unsigned int frequency, unsigned long duration = 0);

core-implement/CommonDigital.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,61 @@ PinStatus digitalRead(PinName pinName){
109109
if( index == variantPinCount ){ return LOW; }
110110
return indexDigitalRead(index);
111111
}
112+
113+
void indexShiftOut(pin_size_t data_index, pin_size_t clock_index, BitOrder bitOrder, uint8_t val){
114+
for (uint8_t idx = 0; idx < 8; idx++) {
115+
if (bitOrder == LSBFIRST) {
116+
indexDigitalWrite(data_index, !!(val & (1 << idx)) ? HIGH : LOW);
117+
}else{
118+
indexDigitalWrite(data_index, !!(val & (1 << (7 - idx))) ? HIGH : LOW);
119+
}
120+
indexDigitalWrite(clock_index, HIGH);
121+
indexDigitalWrite(clock_index, LOW);
122+
}
123+
}
124+
125+
void shiftOut(pin_size_t dataPinNumber, pin_size_t clockPinNumber, BitOrder bitOrder, uint8_t val){
126+
pin_size_t data_index = pinIndexByNumber(dataPinNumber);
127+
pin_size_t clock_index = pinIndexByNumber(dataPinNumber);
128+
if( data_index == variantPinCount ){ return; }
129+
if( clock_index == variantPinCount ){ return; }
130+
indexShiftOut(data_index, clock_index, bitOrder, val);
131+
}
132+
133+
void shiftOut(PinName dataPinName, PinName clockPinName, BitOrder bitOrder, uint8_t val){
134+
pin_size_t data_index = pinIndexByName(dataPinName);
135+
pin_size_t clock_index = pinIndexByName(clockPinName);
136+
if( data_index == variantPinCount ){ return; }
137+
if( clock_index == variantPinCount ){ return; }
138+
indexShiftOut(data_index, clock_index, bitOrder, val);
139+
}
140+
141+
pin_size_t indexShiftIn(pin_size_t data_index, pin_size_t clock_index, BitOrder bitOrder){
142+
uint8_t value = 0;
143+
for (uint8_t idx = 0; idx < 8; ++idx) {
144+
indexDigitalWrite(clock_index, HIGH);
145+
if (bitOrder == LSBFIRST){
146+
value |= indexDigitalRead(data_index) << idx;
147+
}else{
148+
value |= indexDigitalRead(data_index) << (7 - idx);
149+
}
150+
indexDigitalWrite(clock_index, LOW);
151+
}
152+
return value;
153+
}
154+
155+
pin_size_t shiftIn(pin_size_t dataPinNumber, pin_size_t clockPinNumber, BitOrder bitOrder){
156+
pin_size_t data_index = pinIndexByNumber(dataPinNumber);
157+
pin_size_t clock_index = pinIndexByNumber(clockPinNumber);
158+
if( data_index == variantPinCount ){ return 0x00; }
159+
if( clock_index == variantPinCount ){ return 0x00; }
160+
return indexShiftIn(data_index, clock_index, bitOrder);
161+
}
162+
163+
pin_size_t shiftIn(PinName dataPinName, PinName clockPinName, BitOrder bitOrder){
164+
pin_size_t data_index = pinIndexByName(dataPinName);
165+
pin_size_t clock_index = pinIndexByName(clockPinName);
166+
if( data_index == variantPinCount ){ return 0x00; }
167+
if( clock_index == variantPinCount ){ return 0x00; }
168+
return indexShiftIn(data_index, clock_index, bitOrder);
169+
}

0 commit comments

Comments
 (0)