Go Down

Topic: Keypad to LED display (Read 2 times) previous topic - next topic

tjbaudio

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

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



tjbaudio

#1
Dec 29, 2010, 04:00 am Last Edit: Dec 29, 2010, 04:00 am by tjbaudio Reason: 1
subroutines:

Code: [Select]


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;
}

tjbaudio

user setup

Code: [Select]


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);            
}



Go Up