mirror of
1
0
Fork 0
avr_demo/74hc165_shiftin/shift/shift.c

74 lines
1.7 KiB
C

/*
* shift.c
*
* This file is part of Triple-A library:
* https://github.com/tuupola/triple-a
*
* Copyright 2011-2012 Mika Tuupola
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/mit-license.php
*
*/
#include "pins/digital.h"
#include "shift/shift.h"
/* Assumes MSB first. */
uint8_t shift_in(void) {
uint8_t byte = 0;
uint8_t pin_value;
for(int i=0; i<8; i++) {
pin_value = digital_read(SHIFT_IN_DATA);
byte |= (pin_value << ((8 - 1) - i));
#ifdef DEBUG
printf("%d = %d \n", ((8 - 1) - i), pin_value);
#endif
/* Pulse clock to write next bit. */
digital_write(SHIFT_IN_CLOCK, LOW);
digital_write(SHIFT_IN_CLOCK, HIGH);
}
return byte;
}
void shift_in_latch(void) {
digital_write(SHIFT_IN_LATCH, LOW);
digital_write(SHIFT_IN_LATCH, HIGH);
}
void shift_in_init(void) {
pin_mode(SHIFT_OUT_LATCH, OUTPUT);
pin_mode(SHIFT_OUT_CLOCK, OUTPUT);
pin_mode(SHIFT_OUT_DATA, INPUT);
}
/* Assumes MSB first. */
void shift_out(uint8_t data) {
for(uint8_t i = 0; i < 8; i++) {
/* Write bit to data port. */
if (0 == (data & _BV(7 - i))) {
digital_write(SHIFT_OUT_DATA, LOW);
} else {
digital_write(SHIFT_OUT_DATA, HIGH);
}
/* Pulse clock to write next bit. */
digital_write(SHIFT_OUT_CLOCK, LOW);
digital_write(SHIFT_OUT_CLOCK, HIGH);
}
}
void shift_out_latch(void) {
digital_write(SHIFT_OUT_LATCH, LOW);
digital_write(SHIFT_OUT_LATCH, HIGH);
}
void shift_out_init(void) {
pin_mode(SHIFT_OUT_LATCH, OUTPUT);
pin_mode(SHIFT_OUT_CLOCK, OUTPUT);
pin_mode(SHIFT_OUT_DATA, OUTPUT);
}