Pages: [1]   Go Down
Author Topic: Keypad to LED display  (Read 2517 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 2
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a project where some numbers and dashes get entered into a key pad and then get displayed on a 5 digit 7" tall LED display.  The displays use a shift register on each digit.  I only need to send clock and data, no latch needed.  I ended up using a pair of max485 on each end to get the signals to the display with out errors.  Power comes from the sign end.  Because I am using RS485 chips I can run as many displays as needed (up to around 30 tho I only need 2.)

I used the danger shield shift register and keypad library as a starting point.  The finished project has:
10 memory locations stored in eeprom
back space and clear (back space works on the recalled numbers!)
programmable display auto clear
programmable flash count

Here is the code .  Comments welcome.   Ultimately around 12 systems will be build!  I will post pics and other info as requested and as I have time.
Main Loop
Code:
/* v8
Created by
Tom Bourke
CWALV LLC.
License granted to base other projects on this code.
Share and share alike.
*/
#include <Keypad.h>
#include <EEPROM.h>
#include "_init.h"
#include "_data.h"

  int disp[] = {20, 20, 20, 20, 20};       // display string stored as int
  int dispd = 0;                            // digit we are working on
  long interval = 250;                 // interval at which to blink (milliseconds)
  int flashcount = 10;                   //** how many times to flash
  int flashes = 0;                        // how many times it has left to flash
  int flash = 0;                        // just flashed?
  int ledPin =  13;                      // LED connected to digital pin 13
  long previousMillis = 0;              // will store last time LED was updated
  long disp_time = 10000;                //** time to dispalay info, 1000 = 1 second
  long last_key_press = 0;              // will store last time key was pressed
                  // **  now set in eeprom
  
  int flashcountlocation = 100;          // memory location of flashcount setting
  int timeoutlocation = 110;             // memory location of timeout setting


void setup()
{
      ds_init();
      keypad.addEventListener(keypadEvent);   // add an event listener for this keypad
      pinMode(ledPin, OUTPUT);                // keypress LED
}

void loop()
{
  recalflashcount();                            // update flashcount
  recaltimeout();                                // update timeout
  if (millis() - last_key_press > disp_time)      // clear display after time out
      {
      cleardisplay();
      printdisplay();
      }

  char key = keypad.getKey();
  if (key != NO_KEY)            // begin keypress loop
      {
      last_key_press = millis();      // reset keypress counter
      digitalWrite(ledPin, HIGH);         // turn the keypress LED on
       if (dispd < 5)                 // test if display is full
        {
        switch (key)
          {
          case '1':    
            disp[dispd] = 1;
            dispd++;
            break;

          case '2':    
            disp[dispd] = 2;
            dispd++;
            break;

          case '3':    
            disp[dispd] = 3;
            dispd++;
            break;

          case '4':    
            disp[dispd] = 4;
            dispd++;
            break;

          case '5':    
            disp[dispd] = 5;
            dispd++;
            break;

          case '6':    
            disp[dispd] = 6;
            dispd++;
            break;

          case '7':    
            disp[dispd] = 7;
            dispd++;
            break;

          case '8':    
            disp[dispd] = 8;
            dispd++;
            break;

          case '9':    
            disp[dispd] = 9;
            dispd++;
            break;

          case '0':    
            disp[dispd] = 0;
            dispd++;
            break;

          case 'a':  //read mem location
            readmem();
            break;  
                  
          case 'b':  //write mem location
            recordmem();                
            break;

          case 'c':   // delete last digit entered
            if (dispd > 0)
                  {
                  dispd = dispd -1;
                        if (disp[dispd] > 9)
                      {
                      disp[dispd] = disp[dispd] -10;
                          dispd++;
                            }
                      else
                      {
                            disp[dispd] = 20;
                      }
                  }
            break;
      
          case 'd': // add dash to previous digit
            dash();
            break;
 
          case '#':    // clear display
            cleardisplay();
            break;
      
          case '*':    
            flashes = flashcount;
            if (dispd == 0)
                     {
                 disp[0] = 18;
                 disp[1] = 18;
                 disp[2] = 18;
                 disp[3] = 18;
                 disp[4] = 8;
                  dispd = 5;  
                 }
             break;

          }
        }

       else               // if display is full we can still do this stuff
        {
        switch (key)
          {
          case 'a':  //read mem location
          readmem();
             break;  

          case 'b':  //write mem location
             recordmem();                  
             break;  

          case 'c':   // delete last digit entered
            if (dispd > 0)
            {            
            dispd = dispd -1;
                   if (disp[dispd] > 9)
                     {
                        disp[dispd] = disp[dispd] -10;
                        dispd++;
                     }
                   else
                     {
                     disp[dispd] = 20;
                    }
            }
            break;
 
          case '#':    // clear display
            cleardisplay();
                  break;
      
          case '*':    // flash
            flashes = flashcount;
            break;

          }
        }  
      
  printdisplay();
      }  // end of keypress loop

  if (flashes > 0)            // flash LED display if needed
      {
      flash = 1;
      if (millis() - previousMillis > interval)
            {
            previousMillis = millis();    // save the last time you blinked the LED
            flashes = flashes -1;  
            blankdisplay();
              delay (100);
            }
      else
            {
            printdisplay();
            }
      }
  else
      {
      if (flash != 0)
            {
                  flash = 0;
            printdisplay();
            }
      }
  
  delay (20);
  digitalWrite(ledPin, LOW);    // turn the keypress LED off

 // debug info
/*    Serial.print("dispd");
        Serial.print(" ");
    Serial.print(dispd);
        Serial.print(" ");
    Serial.print("disp");
    Serial.print("  ");    
    Serial.print(disp[0]);
    Serial.print("  ");    
    Serial.print(disp[1]);
    Serial.print("  ");    
    Serial.print(disp[2]);
    Serial.print("  ");    
    Serial.print(disp[3]);
    Serial.print("  ");    
    Serial.print(disp[4]);
    Serial.print("  ");
    Serial.print(flashes);
    Serial.println("  ");    
 */  

}                          // end of main loop

Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

subroutines:

Code:

void printdisplay()                 // send display array to LED display
{
             digitalWrite(LATCH_PIN, LOW);
   byte k = chardata[disp[4]];  
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
         k = chardata[disp[3]];  
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
         k = chardata[disp[2]];  
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
         k = chardata[disp[1]];  
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
         k = chardata[disp[0]];  
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
    digitalWrite(LATCH_PIN, HIGH);
}
  
void blankdisplay()                     //turn display off
{
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0);
  digitalWrite(LATCH_PIN, HIGH);
}

void cleardisplay()                  // clear display
{
     disp[0] = 20;
     disp[1] = 20;
     disp[2] = 20;
     disp[3] = 20;
     disp[4] = 20;
     dispd = 0;
     flashes = 0;
}

void readmem()                        // read memory location
{
int e = 0;
while ( e == 0)
      {
      char mkey = keypad.getKey();
      if (mkey != NO_KEY)
            {
            int digit = keynum(mkey);
            if (digit < 10)
                  {
                  for (int location = 0; location < 5; location++)
                        {  // fill disp array
                        disp[location] = EEPROM.read(digit*6+location);
                        }
                  dispd = EEPROM.read(digit*6+5);          //what digit we were editing
                  }
            e = 1;
            printdisplay();
            delay (300);      // give us time to get our finger off the button
            }
      }
}

void recordmem()                  // save memory location
{
int e = 0;
while ( e == 0)
      {
      char mkey = keypad.getKey();
      if (mkey != NO_KEY)
            {
            int digit = keynum(mkey);
            if (digit < 10)
                  {
                  for (int location = 0; location < 5; location++)
                        {
                        if (EEPROM.read((digit*6+location) != disp[location]))
                              {
                              EEPROM.write((digit*6+location),disp[location]);
                              }  
                        }
                  if (EEPROM.read((digit*6+5) != dispd))
                        {
                        EEPROM.write((digit*6+5),dispd);
                        }
                  }
            e = 1;
            printdisplay();
            delay (300);
            }
      }
}
      
void dash()            //add dash to digit
{
if (dispd >  0)
      {
      if (disp[(dispd-1)] < 10 )
            {  // only do it if no dash is present
            disp[(dispd -1)] = disp[(dispd-1)] +10;
            }
      }
}

int keynum (char key)             // convert keypad char to int varable
{
  int number = 10;
  switch (key)
    {
    case '0':
    number = 0;
    break;
        case '1':
    number = 1;
    break;
        case '2':
    number = 2;
    break;
        case '3':
    number = 3;
    break;
        case '4':
    number = 4;
    break;
        case '5':
    number = 5;
    break;
        case '6':
    number = 6;
    break;
        case '7':
    number = 7;
    break;
        case '8':
    number = 8;
    break;
        case '9':
    number = 9;
    break;
   }
return number;
}
« Last Edit: December 28, 2010, 10:00:54 pm by tjbaudio » Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

user setup

Code:

void keypadEvent(KeypadEvent key)  //handle key hold
{
if (keypad.getState() == HOLD)
  {
      switch (key)
      {
              case '#':           // clear memory
                clearmem();
                break;
      
              case '*':           // set flash count
                setflashcount();
                break;
      
              case 'a':           // set time out
                settimeout();
                break;      
      }
   }
}


void recalflashcount()                                                  // convert flashcount memlocation to int number
{
   int fla1 = EEPROM.read(flashcountlocation);                           // get current flast count
   int fla2 = EEPROM.read(flashcountlocation + 1);
   flashcount = (fla1*10+fla2);
}


void setflashcount()
{
    dispflashcount();
    digitalWrite(ledPin, HIGH);         // turn the keypress LED on
    delay (600);      // give us time to get our finger off the button
    int e = 0;
    while ( e == 0)
                    {
                    char mkey = keypad.getKey();                                  // first digit
                    if (mkey != NO_KEY)
         {
         int digit = keynum(mkey);
                if (digit < 10)
                      {
                     if (EEPROM.read((flashcountlocation) != digit))
                                  {
                                  EEPROM.write((flashcountlocation),digit);
                                  }
          e = 1;
            }
    
         }
                    }
    
      dispflashcount();          
      digitalWrite(ledPin, LOW);    // turn the keypress LED off      
      delay (600);      // give us time to get our finger off the button
      digitalWrite(ledPin, HIGH);         // turn the keypress LED on      
      e = 0;
      while ( e == 0)
                      {
                      char mkey = keypad.getKey();                                  // second digit
                      if (mkey != NO_KEY)
          {
           int digit = keynum(mkey);
                if (digit < 10)
                      {
                       if (EEPROM.read((flashcountlocation + 1) != digit))
                                  {
                                  EEPROM.write((flashcountlocation + 1),digit);
                                  }
          e = 1;
            }
    
                        }
        }
      dispflashcount();
      digitalWrite(ledPin, LOW);    // turn the keypress LED off
      delay (3000);
      cleardisplay();
      printdisplay();
}
      

void settimeout()
{
    disptimeout();
    digitalWrite(ledPin, HIGH);         // turn the keypress LED on
    delay (600);      // give us time to get our finger off the button
    int e = 0;
    while ( e == 0)
                    {
                    char mkey = keypad.getKey();                                  // first digit
                    if (mkey != NO_KEY)
                             {
                             int digit = keynum(mkey);
                                    if (digit < 10)
                                        {
                                         if (EEPROM.read((timeoutlocation) != digit))
                                                      {
                                                      EEPROM.write((timeoutlocation),digit);
                                                      }
                                          e = 1;
                                         }
                        
                             }
                   }
    
      disptimeout();
      digitalWrite(ledPin, LOW);    // turn the keypress LED off      
      delay (600);      // give us time to get our finger off the button
      digitalWrite(ledPin, HIGH);         // turn the keypress LED on      
      e = 0;
      while ( e == 0)
                      {
                      char mkey = keypad.getKey();                                  // second digit
                      if (mkey != NO_KEY)
                        {
                         int digit = keynum(mkey);
                              if (digit < 10)
                                    {
                                     if (EEPROM.read((timeoutlocation + 1) != digit))
                                                {
                                                EEPROM.write((timeoutlocation + 1),digit);
                                                }
                                       e = 1;
                                      }
                  
                           }
                      }
      disptimeout();
      digitalWrite(ledPin, LOW);    // turn the keypress LED off
      delay (3000);
      cleardisplay();
      printdisplay();
}
      

void dispflashcount()
{
            int fla1 = EEPROM.read(flashcountlocation);                           // get current flast count and display it
            int fla2 = EEPROM.read(flashcountlocation + 1);
            byte k = chardata[fla2];
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
            k = chardata[fla1];
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);            
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B11110111);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00111000);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01110001);            
}  


void recaltimeout()                                                  // convert time out memlocation to int number
{
   long time1 = EEPROM.read(timeoutlocation);                           // get time out count
   long time2 = EEPROM.read(timeoutlocation + 1);
   disp_time = ((time1*10+time2) * 1000);

}

void clearmem()
{
 int e =0;
 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00111001);     // are you sure?
 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000000);            
 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B11010000);
 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00111000);
 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00111001);            
 delay (600);      // give us time to get our finger off the button
 while ( e == 0)
    {
    char mkey = keypad.getKey();
    if (mkey != NO_KEY)
      {
      switch (mkey)
        {
        case 'c':
          for (int loc = 0; loc < 10; loc++)
            {
            for (int location = 0; location < 5; location++)
               {
                if (EEPROM.read((loc*6+location) != 20))
                  {
                  EEPROM.write((loc*6+location),20);
                  }  
                }
                if (EEPROM.read((loc*6+5) != 0))
              {
              EEPROM.write((loc*6+5),0);
              }
              }
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01011110);        // display mem clear
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01111001);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01010000);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00111000);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00111001);
            delay (3000);
                                       e = 1;
                    break;
                  
                      default:
                        e = 1;
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000000);        // display mem not clear
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01111001);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01110001);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01110111);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01101101);
            delay (3000);
                        break;
        }
       }
    }
}


void disptimeout()
{
            int time1 = EEPROM.read(timeoutlocation);                           // get current display time out and display it
            int time2 = EEPROM.read(timeoutlocation + 1);
            byte k = chardata[time2];
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);
            k = chardata[time1];
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, k);            
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B11101101);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00010000);
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B01011110);            
}


Logged

Pages: [1]   Go Up
Jump to: