diff --git a/address_cycling/main.cpp b/address_cycling/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7609dc30b6bb13a53de354e488eea97b14b53437
--- /dev/null
+++ b/address_cycling/main.cpp
@@ -0,0 +1,258 @@
+#include <Arduino.h>
+#include <h/prototypes.h>
+#include <h/address_cycling.h>
+#include <driver/gpio.h>
+
+#define interval 10 // (microseconds)
+#define dataSize 10
+#define MAXADDR 1
+
+#define write_pin 9
+#define open_pin 10 
+#define mosipin 14
+#define misopin 13
+#define clkpin 12
+
+#define offset1 3
+#define offset2 23
+#define offset3 (offset2 + 18 + 20)
+#define offset4 (offset3 + 20)
+#define offset5 (offset4 + 16 + 2)
+#define offset6 (offset5 + 10)
+#define offset7 (offset6 + 20)
+
+
+int cycle;
+int clk;
+int din;
+
+int channel1[dataSize];
+int channel2[dataSize];
+int channel1_pins[] = {19,20,21,47,48,45,35,36,37,38};
+int channel2_pins[] = {39,40,41,42,2,1,7,6,5,4};
+
+int writesig;
+int opensig;
+
+unsigned long previousMicros = 0;  // will store last time LED was updated
+
+// the setup function runs once when you press reset or power the board
+void setup() {
+  Serial.begin(115200); 
+  while(!Serial);  
+  setPins();      
+  for(int i = 0 ; i < dataSize ; i++){ // initialize channel data
+    channel1[i] = 0;
+    channel2[i] = 0;
+  }
+  plants = 15;
+  address = 0;
+  cycle = 0;
+  clk = 0;
+  din = 0;
+  writesig = 0;
+  opensig = 0;
+}
+
+// the loop function runs over and over again forever
+void loop() {
+  unsigned long currentMicros = micros();
+  if (currentMicros - previousMicros >= interval) {
+    previousMicros = currentMicros;
+    clk = ~clk;
+    digitalWrite(clkpin, clk);
+
+    for(int t = 0 ; t < 10 ; t++){
+      digitalWrite(channel1_pins[t],channel1[t]);
+      digitalWrite(channel2_pins[t],channel2[t]);
+    }
+
+
+    if(clk == 0){
+      cycle++;
+    }
+    //clk and cycle are the new values we just started at this halfperiod
+    //do stuff
+    if(clk==0 && cycle==0){
+      //keep track of address but only selectively set the bits
+      //assume address is correct, will not change until end of total operation
+      //assume write was just set to 0
+      din = 0;
+      digitalWrite(mosipin, din);
+
+    }
+
+    if(clk==0 && cycle==offset1){
+      setAddrPins(address);//address is sent to slaves
+    }
+
+    if(clk==0 && cycle==(offset2)){
+      din = 1;
+      digitalWrite(mosipin, din);//start bit
+    }
+    if(clk==0 && cycle==(offset2 + 1)){
+      din = 1;
+      digitalWrite(mosipin, din);//single ended
+    }
+    if(clk==0 && cycle==(offset2 + 2)){
+      din = 0;
+      digitalWrite(mosipin, din);//d2 (don't care)
+    }
+    if(clk==0 && cycle==(offset2 + 3)){
+      din = 0;
+      digitalWrite(mosipin, din);//d1
+    }
+    if(clk==0 && cycle==(offset2 + 4)){
+      din = 0;
+      digitalWrite(mosipin, din);//d0
+    }
+    if(clk!=0 && cycle==(offset2 + 7)){
+      channel1[9] = digitalRead(misopin);//most sig bit of ouptut
+    }
+    if(clk!=0 && cycle==(offset2 + 8)){
+      channel1[8] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 9)){
+      channel1[7] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 10)){
+      channel1[6] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 11)){
+      channel1[5] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 12)){
+      channel1[4] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 13)){
+      channel1[3] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 14)){
+      channel1[2] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 15)){
+      channel1[1] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset2 + 16)){
+      channel1[0] = digitalRead(misopin);//lsb of adc
+    }
+    if(clk==0 && cycle==(offset2 + 18)){
+      setAddrPins(15);//flick address off ie pull chip select high
+    }
+    if(clk==0 && cycle==(offset3)){
+      setAddrPins(address);//pull chip select back down
+    }
+    if(clk==0 && cycle==(offset4)){
+      din = 1;
+      digitalWrite(mosipin, din);//start bit
+    }
+    if(clk==0 && cycle==(offset4 + 1)){
+      din = 1;
+      digitalWrite(mosipin, din);//single ended
+    }
+    if(clk==0 && cycle==(offset4 + 2)){
+      din = 0;
+      digitalWrite(mosipin, din);//d2 (don't care)
+    }
+    if(clk==0 && cycle==(offset4 + 3)){
+      din = 0;
+      digitalWrite(mosipin, din);//d1
+    }
+    if(clk==0 && cycle==(offset4 + 4)){
+      din = 1;
+      digitalWrite(mosipin, din);//d0 select second channel
+    }
+    if(clk!=0 && cycle==(offset4 + 7)){
+      channel2[9] = digitalRead(misopin);//most sig bit of ouptut
+    }
+    if(clk!=0 && cycle==(offset4 + 8)){
+      channel2[8] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 9)){
+      channel2[7] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 10)){
+      channel2[6] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 11)){
+      channel2[5] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 12)){
+      channel2[4] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 13)){
+      channel2[3] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 14)){
+      channel2[2] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 15)){
+      channel2[1] = digitalRead(misopin);
+    }
+    if(clk!=0 && cycle==(offset4 + 16)){
+      channel2[0] = digitalRead(misopin);//lsb of adc second channel
+    }
+    if(clk==0 && cycle==(offset5)){
+      opensig = makeDecision();//MAKE DECISION AND OUTPUT IT BEFORE RAISING WRITE SIGNAL
+      digitalWrite(open_pin, opensig);//output the decision
+    }
+    if(clk==0 && cycle==(offset6)){
+      writesig = 1;//change to write operation
+      din = 0;
+      digitalWrite(mosipin, din);
+      digitalWrite(write_pin, writesig);
+    }
+    if(clk!=0 && cycle==(offset7)){//1
+      writesig = 0;
+      digitalWrite(write_pin, writesig);
+      cycle = -1;
+      if (address == MAXADDR){
+        address = 0;
+      }
+      else{
+        address++;
+      }
+      setAddrPins(15);//flick address off
+    }
+
+
+    
+  
+
+
+  }  
+}
+int makeDecision(){//change this later
+  return 1;
+}
+
+void setPins(){
+  pinMode(write_pin,OUTPUT);
+  pinMode(open_pin,OUTPUT);
+  pinMode(clkpin,OUTPUT);
+  pinMode(misopin,INPUT);
+  pinMode(mosipin,OUTPUT);
+  digitalWrite(write_pin, LOW);
+  digitalWrite(open_pin, LOW);
+  digitalWrite(clkpin, LOW);
+  digitalWrite(mosipin, LOW);
+
+  for(int i = 0 ; i < 10 ; i ++){
+    if(i < pinMax){
+      pinMode(addrPins[i], OUTPUT);
+      digitalWrite(addrPins[i], LOW);
+    }
+      pinMode(channel1_pins[i], OUTPUT);
+      pinMode(channel2_pins[i], OUTPUT);
+      digitalWrite(channel1_pins[i], LOW);
+      digitalWrite(channel2_pins[i], LOW);
+    // pinMode(segmentPins[i],OUTPUT);
+  }
+}
+
+
+
+
+
+
+