Shift register using ATMEGA328p

I want to learn more about the shiftout function used with Arduinos and used the implementation with my ATMEGA328p.

Here is [the date sheet of atmega328p

The Setup

#define F_CPU 1000000UL

#define BAUD 9600UL

#define LSBFIRST 0

#define MSBFIRST 1

#define HIGH 0x1

#define LOW 0x0

#define INPUT 0x0

#define OUTPUT 0x1

#include <avr/io.h>

#include <util/delay.h>

#include <USART.h>

#include <pinDefines.h>

#define DATA PD7

#define LATCH PB2

#define CLOCK PB0

uint8_t leds = 0;

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)

{

for (uint8_t i = 0; i < 8; ++i) {

if (bitOrder == LSBFIRST) {

PORTD |= (!!(val & (HIGH << i)) << DATA);

} else {

PORTD |= (!!(val & (HIGH << (7 - i))) << DATA);

}

PORTB |= (HIGH << clockPin);

PORTB |= (LOW << clockPin);

}

}

void updateShiftRegister() {

PORTB |= (LOW << LATCH);

shiftOut(DATA, CLOCK, LSBFIRST, leds);

PORTB |= (HIGH << LATCH);

}

void setupRegisters() {

DDRD = 0xff;

DDRB = 0xff;

}

int main(void)

{

setupRegisters();

leds = 1;

updateShiftRegister();

_delay_ms(2000);

leds = 0;

updateShiftRegister();

return (0);

}

I created an example to understand more about the function, but the outcome does not add up to what I expected to see.

Given my example, I would expect LED1 to turn on and turn off after 2sec. It turns on, but it does not turn off afterwards. Did I miss anything? I am searching for 2hrs now for the error in my code.](http://www.componentschip.com/details/Atmel/ATMEGA328P.html)

Please edit your post to add code tags.

This line does not do anything:

PORTB |= (LOW << clockPin);

Instead, use this to set a port pin low:

PORTB &= ~(1 << clockPin);

Similarly for PORTD. OR does not force a bit low.