Go Down

Topic: Change LED display with push button (Read 1 time) previous topic - next topic

JimiH

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.
Code: [Select]
[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

CrossRoads

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.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

JimiH

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  :smiley-red:, I'll clean it up. Basically when I press a switch I want the LED pattern to change from one to the other. ie

Code: [Select]
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

Grumpy_Mike

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.

JimiH

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.
Code: [Select]


//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

CrossRoads

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.

Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy