Change LED display with push button

Hello

I have 16 LED's and 2 595 shift registers connected I can send a display value to the LED's, 1010101010101010 etc. I have just connected a pushbutton switch which turns on LED 13 if the number of button pushes is dividable by 4. I want to specify two display values which are selectable by the number of button pushes. ie if its dividable by for display 1010101010101010 else display 1111000011110000.

[shadow=red,left]const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Pushbutton int's Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


//LED 595 shift int's

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
  
  //Pushbutton Setup
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
  
  //LED 595 shift setup
  
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  //display(43690);
  display(48982);
  
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter, DEC);
    } 
    else {
      // if the current state is LOW then the button
      // wend from on to off:
      Serial.println("off"); 
    }
  }
  // save the current state as the last state, 
  //for next time through the loop
  lastButtonState = buttonState;

  
  // turns on the LED every four button pushes by 
  // checking the modulo of the button push counter.
  // the modulo function gives you the remainder of 
  // the division of two numbers:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
    
    // Put some code here to display(43690);
    
  } else {
   digitalWrite(ledPin, LOW);
   
   // Put some code here to display(48982);

  }
  
}

void display(unsigned int numberToDisplay){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay % 256);  //lower byte
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay / 256); // higher byte
    digitalWrite(latchPin, HIGH);
}
[/shadow]

Regards

Geoff

What is your question? You seem to have a function to shift out the needed data. Call it with data of 0xAAAA & 0xF0F0.

Altho I would call it like this per the reference page for shiftout()

// shift out highbyte shiftOut(dataPin, clock, MSBFIRST, (data >> 8)); // shift out lowbyte shiftOut(data, clock, MSBFIRST, data);

Not sure wht %256 & /256 is doing for you.

Thanks crossroads, yes your right about the 256, this code came from another sketch I was using and somehow never affected my new sketch. Copy & Paste is too easy :blush:, I'll clean it up. Basically when I press a switch I want the LED pattern to change from one to the other. ie

 if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
    
    // Put some code here to display(43690);
    
  } else {
   digitalWrite(ledPin, LOW);
   
   // Put some code here to display(48982);

  }

Regards Geoff

Still not sure what your question is? Do you want code for // Put some code here to display(43690); in which case it is display(43690);

Given you have a display function in the earlier code.

Thanks Mike, I was 90% there.

Sorted it now and cleaned the code up (thanks crossroads) so here is the code, I have specified three different patterns using 16 Led's. This code cycles through them using a push button.

//Using a pushbutton to cycle through various LED patterns
//16 LED's are used with two shift registers, used Arduino SHIFTOUT as a start


const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Pushbutton int's Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


//LED 595 shift int's

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
  
  //Pushbutton Setup
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
  
  //LED 595 shift setup
  
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  //display(43690);
  display(48982);
  
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter, DEC);
    } 
    else {
      // if the current state is LOW then the button
      // wend from on to off:
      Serial.println("off"); 
    }
  }
  // save the current state as the last state, 
  //for next time through the loop
  lastButtonState = buttonState;

  //Pressing the button once lights pattern 1, twice pattern 2 etc etc
  
switch (buttonPushCounter) {
    case 1:
       display(43690);
      
      break;
      
    case 2:
     
   display(48982);
      
      break;
     case 3:
      
           display(58163);
  
    default: 
   
      
buttonPushCounter = 0;   // Resets counter to 0 so we can cycle through 1, 2, 3 again

      
       digitalWrite(ledPin, LOW);
   display(58163);
      
  }
  
}

void display(unsigned int numberToDisplay){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  //lower byte
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); // higher byte
    digitalWrite(latchPin, HIGH);
}

regards

Geoff

You're missing something here: shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); //lower byte shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); // higher byte

The shifout example shows: // shift out highbyte shiftOut(dataPin, clock, MSBFIRST, (data >> 8 ); the 8 ) got turned into 8) above // shift out lowbyte shiftOut(data, clock, MSBFIRST, data);

You probably don't notice if your two bytes are the same: 0xA0A0 & 0xF0F0

I find using the decimal equivalent not terribly useful.