Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Shift Register 74HC595 Test
- * main.c
- *
- * Created on: 11.05.2014
- * Author: koepi
- *
- * A0: DS (serial data input)
- * A1: ST_CP (storage register clock pin, latch)
- * A2: SH_CP (shift register clock pin)
- *
- * A0-A2 are PORTC bits 0 - 2, bitmask 0b00000111 -> 0x07
- */
- #include "main.h"
- #include <avr/io.h>
- #include <avr/power.h>
- typedef enum { false, true } bool;
- void setup (void) {
- DDRB |= 0x07; // data direction register - OUTPUT
- PORTB &= ~(0x07); // data register - all pins LOW
- clock_prescale_set(clock_div_1);
- }
- int main (void) {
- setup();
- // writing to 74HC595 should work like this:
- // set bit on DS (A0), then toggle SH_CP.
- // after 8 bits, toggle latch to view result.
- while (1) { // endless loop
- char i=0;
- int dyn = 15;
- for (int j=0; j<8; j++) {
- i = (1 << j);
- write_reg(i);
- dyn+=5;
- delay(dyn);
- }
- for (int j=7; j>=0; j--) {
- i = (1 << j);
- write_reg(i);
- dyn-=5;
- delay(dyn);
- }
- i=0;
- for (int j=0; j<8; j++) {
- i |= (1 << j);
- write_reg(i);
- dyn+=5;
- delay(dyn);
- }
- for (int j=7; j>=0; j--) {
- i &= ~(1 << j);
- write_reg(i);
- dyn-=5;
- delay(dyn);
- }
- for (int j=0; j<8; j++) {
- i = (1 << j);
- write_reg(i);
- delay(10);
- write_reg(!(i));
- delay(10);
- dyn+=5;
- delay(dyn);
- }
- for (int j=7; j>=0; j--) {
- i = (1 << j);
- write_reg(i);
- delay(10);
- write_reg(!(i));
- delay(10);
- dyn-=5;
- delay(dyn);
- }
- i=0;
- for (int j=0; j<8; j++) {
- i |= (1 << j);
- write_reg(i);
- dyn+=5;
- delay(dyn);
- }
- int del=1;
- int inc=1;
- for (int j=0; j<80; j++) {
- del+=inc;
- if (del<=0 || del> 7) inc=-inc;
- i=0xff;
- write_reg(i);
- delay(del);
- i=0x00;
- write_reg(i);
- delay(del);
- }
- i=0xff;
- write_reg(i);
- for (int j=7; j>=0; j--) {
- i &= ~(1 << j);
- write_reg(i);
- dyn-=5;
- delay(dyn);
- }
- }
- }
- void write_reg(char reg) {
- // correction for LED0 on position 7
- bool temp = (reg & 0x80);
- reg <<= 1;
- if (temp) reg |= 0x01;
- PORTB &=~(0b00000010); // switching off latch
- for (int i=7; i>=0; i--) {
- if (reg & (1 <<i)) {
- PORTB |= 0b00000001; // setting DS
- } else {
- PORTB &=~(0b00000001); // resetting DS
- }
- PORTB |= 0b00000100; // SH_CP HIGH
- PORTB &= ~(0b00000100); // SH_CP low
- }
- PORTB |= 0b00000010; // switching on latch
- }
- void delay (int ms) {
- for (int i=0; i<ms; i++) {
- for (int j=0; j<1600; j++) {
- asm volatile ("nop");
- } // 16000 nops at 16 MHz = 1kHz
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement