Guest User

11.05.2014 Shift Register on ATmega328 plain C - lightshow

a guest
May 11th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.30 KB | None | 0 0
  1. /*
  2.  * Shift Register 74HC595 Test
  3.  * main.c
  4.  *
  5.  *  Created on: 11.05.2014
  6.  *      Author: koepi
  7.  *
  8.  * A0: DS (serial data input)
  9.  * A1: ST_CP (storage register clock pin, latch)
  10.  * A2: SH_CP (shift register clock pin)
  11.  *
  12.  * A0-A2 are PORTC bits 0 - 2, bitmask 0b00000111 -> 0x07
  13.  */
  14.  
  15. #include "main.h"
  16. #include <avr/io.h>
  17.  
  18. void setup (void) {
  19.     DDRC |= 0x07;  // data direction register - OUTPUT
  20.     PORTC &= ~(0x07);  // data register - all pins LOW
  21. }
  22.  
  23. int main (void) {
  24.     setup();
  25.     // writing to 74HC595 should work like this:
  26.     // set bit on DS (A0), then toggle SH_CP.
  27.     // after 8 bits, toggle latch to view result.
  28.  
  29.     while (1) {  // endless loop
  30.         char i=0;
  31.         int dyn = 15;
  32.         for (int j=0; j<8; j++) {
  33.             i = (1 << j);
  34.             write_reg(i);
  35.             dyn+=5;
  36.             delay(dyn);
  37.         }
  38.         for (int j=7; j>=0; j--) {
  39.             i = (1 << j);
  40.             write_reg(i);
  41.             dyn-=5;
  42.             delay(dyn);
  43.         }
  44.         i=0;
  45.         for (int j=0; j<8; j++) {
  46.             i |= (1 << j);
  47.             write_reg(i);
  48.             dyn+=5;
  49.             delay(dyn);
  50.         }
  51.         for (int j=7; j>=0; j--) {
  52.             i &= ~(1 << j);
  53.             write_reg(i);
  54.             dyn-=5;
  55.             delay(dyn);
  56.         }
  57.         for (int j=0; j<8; j++) {
  58.             i = (1 << j);
  59.             write_reg(i);
  60.             delay(10);
  61.             write_reg(!(i));
  62.             delay(10);
  63.             dyn+=5;
  64.             delay(dyn);
  65.         }
  66.         for (int j=7; j>=0; j--) {
  67.             i = (1 << j);
  68.             write_reg(i);
  69.             delay(10);
  70.             write_reg(!(i));
  71.             delay(10);
  72.             dyn-=5;
  73.             delay(dyn);
  74.         }
  75.         i=0;
  76.         for (int j=0; j<8; j++) {
  77.             i |= (1 << j);
  78.             write_reg(i);
  79.             dyn+=5;
  80.             delay(dyn);
  81.         }
  82.         for (int j=7; j>=0; j--) {
  83.             i &= ~(1 << j);
  84.             write_reg(i);
  85.             dyn-=5;
  86.             delay(dyn);
  87.         }
  88.         int del=1;
  89.         int inc=1;
  90.         for (int j=0; j<400; j++) {
  91.             del+=inc;
  92.             if (del<=0 || del> 7) inc=-inc;
  93.             i=0xff;
  94.             write_reg(i);
  95.             delay(del);
  96.             i=0x00;
  97.             write_reg(i);
  98.             delay(del);
  99.         }
  100.     }
  101.  
  102. }
  103.  
  104. void write_reg(char reg) {
  105.     PORTC &=~(0b00000010);  // switching off latch
  106.     for (int i=7; i>=0; i--) {
  107.         if (reg & (1 <<i)) {
  108.             PORTC |= 0b00000001;  // setting DS
  109.         } else {
  110.             PORTC &=~(0b00000001);  // resetting DS
  111.         }
  112.         PORTC |= 0b00000100;  // SH_CP HIGH
  113.         PORTC &= ~(0b00000100);  // SH_CP low
  114.     }
  115.     PORTC |= 0b00000010;  // switching on latch
  116. }
  117.  
  118. void delay (int ms) {
  119.     for (int i=0; i<ms; i++) {
  120.         for (int j=0; j<1600; j++) {
  121.             asm volatile ("nop");
  122.         }  // 16000 nops at 16 MHz = 1kHz
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment