Telescope Control Library
Diff: SerialDigitalInput.h
- Revision:
- 0:6cb2eaf8b133
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SerialDigitalInput.h Sun Aug 19 05:21:20 2018 +0000 @@ -0,0 +1,84 @@ +/* + * SerialDigitalInput.h + * + * Created on: 2018Äê2ÔÂ10ÈÕ + * Author: caoyuan9642 + */ + +#ifndef TELESCOPE_SERIALDIGITALINPUT_H_ +#define TELESCOPE_SERIALDIGITALINPUT_H_ + +#include "mbed.h" + +/** + * A serial interfaced digital input + * Example application is to read a parallel input (8~32 bits) using cascaded 74xx165. + */ +template<uint8_t N> +class SerialDigitalInput +{ +public: + SerialDigitalInput(PinName c, PinName l, PinName d) : + clk(DigitalOut(c)), load(DigitalOut(l)), data(DigitalIn(d)) + { + if (clk == NC || load == NC || data == NC) + { + fprintf(stderr, "ERROR in SerialDigitalInput: PIN(s) undefined"); + return; + } + + /*Prepare for next reading*/ + clk = 0; + load = 1; + } + virtual ~SerialDigitalInput() + { + } + + uint8_t getBits() const + { + return N; + } + + uint32_t read() + { + uint32_t value = 0; + /*Load the shift register*/ + clk = 0; + load = 0; + + delay(); + + /*Lock the shift register*/ + load = 1; + for (int i = 0; i < N; i++) + { + /*Read value*/ + value = (value << 1) + (data != 0); + /*Clock. Now the next bit will be loaded*/ + clk = 1; + /*Delay*/ + delay(); + /*Reset clock*/ + clk = 0; + /*Delay*/ + delay(); + } + return value; + } + + +private: + DigitalOut clk; + DigitalOut load; + DigitalIn data; + + void delay(){ + uint16_t i=100; + while(i--); + } +}; + +#endif /* TELESCOPE_SERIALDIGITALINPUT_H_ */ + +