#include "shift_register_internal.h" #include #include const SipoShiftRegister avr_sipo_shift_register_create( const DataPosition clockEnable, const DataPosition clockPulse, const DataPosition input, const DataPosition outputEnable, const DataPosition pushOutput, int waitTime ) { const ShiftRegister shiftRegister = avr_shift_register_create(SR_SIPO, clockEnable, clockPulse, waitTime); SipoShiftRegister sipoShiftRegister = { shiftRegister, input, outputEnable, pushOutput }; return sipoShiftRegister; } void avr_sipo_shift_register_init(const SipoShiftRegister shiftRegister) { data_position_set_ddr(shiftRegister.input); data_position_set_ddr(shiftRegister.outputEnable); data_position_set_ddr(shiftRegister.pushOutput); data_position_set_ddr(shiftRegister.shiftRegister.clockPulse); data_position_set_ddr(shiftRegister.shiftRegister.clockEnable); avr_sipo_shift_register_disable_output(shiftRegister); avr_shift_register_enable_clock(shiftRegister.shiftRegister); } void avr_sipo_shift_register_shift(const SipoShiftRegister shiftRegister) { avr_shift_register_clock_pulse(shiftRegister.shiftRegister); } void avr_sipo_shift_register_write_bit(const SipoShiftRegister shiftRegister, byte data, int position) { data &= (1 << position); if (data > 0) { data_position_set_port(shiftRegister.input); } else { data_position_reset_port(shiftRegister.input); } avr_sipo_shift_register_shift(shiftRegister); } void avr_sipo_shift_register_write_byte(const SipoShiftRegister shiftRegister, byte data) { for (int i = 0; i < 8; i++) { avr_sipo_shift_register_write_bit(shiftRegister, data, i); } } void avr_sipo_shift_register_enable_output(const SipoShiftRegister shiftRegister) { data_position_reset_port(shiftRegister.outputEnable); } void avr_sipo_shift_register_disable_output(const SipoShiftRegister shiftRegister) { data_position_set_port(shiftRegister.outputEnable); } void avr_sipo_shift_register_push_data_to_output(const SipoShiftRegister shiftRegister) { data_position_set_port(shiftRegister.pushOutput); } void avr_sipo_shift_register_reset(const SipoShiftRegister shiftRegister) { avr_shift_register_disable_clock(shiftRegister.shiftRegister); sleep(shiftRegister.shiftRegister.waitTime); avr_shift_register_enable_clock(shiftRegister.shiftRegister); sleep(shiftRegister.shiftRegister.waitTime); }