#include "shift_register_internal.h" #include #include const PisoShiftRegister avr_piso_shift_register_create( const DataPosition clockEnable, const DataPosition clockPulse, const DataPosition output, const DataPosition parallelLoad, int waitTime ) { const ShiftRegister shiftRegister = avr_shift_register_create(SR_PISO, clockEnable, clockPulse, waitTime); PisoShiftRegister pisoShiftRegister = { shiftRegister, output, parallelLoad }; return pisoShiftRegister; } void avr_piso_shift_register_init(const PisoShiftRegister shiftRegister) { data_position_reset_ddr(shiftRegister.output); data_position_set_ddr(shiftRegister.parallelLoad); data_position_set_ddr(shiftRegister.shiftRegister.clockPulse); data_position_set_ddr(shiftRegister.shiftRegister.clockEnable); data_position_set_port(shiftRegister.parallelLoad); avr_shift_register_enable_clock(shiftRegister.shiftRegister); } void avr_piso_shift_register_parallel_load(const PisoShiftRegister shiftRegister) { data_position_reset_port(shiftRegister.parallelLoad); sleep(shiftRegister.shiftRegister.waitTime); data_position_set_port(shiftRegister.parallelLoad); sleep(shiftRegister.shiftRegister.waitTime); } void avr_piso_shift_register_shift(const PisoShiftRegister shiftRegister) { avr_shift_register_clock_pulse(shiftRegister.shiftRegister); } bool avr_piso_shift_register_read_bit(const PisoShiftRegister shiftRegister) { return data_position_get_pin(shiftRegister.output); } byte avr_piso_shift_register_read_byte(const PisoShiftRegister shiftRegister) { byte output = 0; for (int i = 0; i < 8; i++) { output |= avr_piso_shift_register_read_bit(shiftRegister) << i; avr_piso_shift_register_shift(shiftRegister); } return output; }