7 seg counter with 3 modes controlled by push button

Dependencies:   mbed

main.cpp

Committer:
andrewbw01
Date:
2021-03-03
Revision:
0:7d75e4df9577

File content as of revision 0:7d75e4df9577:

#include "mbed.h"

// Global variables

int mode;  // mode=1 on startup 
           // mode=2 for keypad
           // mode=3 for serial

//Assign 8 pins digital bus object LED_Disp
BusOut LED_Disp(p7,p11,p9,p8,p5,p6,p10,p12); 

// Pin assignment for 4x3 or 12 key Hex keypad
// Looking at keyboard front, the left most pin is pin1 
// keypad pin numbers
//   pin 1 = not connected
//   pin 2 = col 2
//   pin 3 = row 1
//   pin 4 = col 1
//   pin 5 = row 4
//   pin 6 = col 3
//   pin 7 = row 3
//   pin 8 = row 2
//   pin 9 = not connected
//

Serial pc(USBTX, USBRX); // Create serial comms object

// mbed pin assignment for keypad
DigitalIn row1(p27);
DigitalIn row2(p22);
DigitalIn row3(p23);
DigitalIn row4(p25);
DigitalOut col1(p26);
DigitalOut col2(p28);
DigitalOut col3(p24);

DigitalOut debug_led (LED1);  // Debug LED for flashing

Serial s_port(USBTX, USBRX);


// Interrupts
InterruptIn cal_button(p14); // Assign interrupt input object to pin 14

// Prototypes for ISRs
void cal_isr(void);  // Declare ISR for cal button on p14
 
// Function Prototypes
char Keypad(void); // Declare Keypad function will return character pressed
void DisplayChar(char);  // Declare function to display character on 7 segment
void Flash_char(char);  // Declare function to flash character on 7 segment 





// ************ MAIN ************
int main() 
{
    mode=1;  // On startup set mode=1
    
    cal_button.rise(&cal_isr); //Attach address of ISR to interrupt
    
    int counter=0;  // General program or character counter
        
    int kp_char = ' ';   // Character read from keypad (ASCII)
    
    
    while(1) 
    {
        if(mode==1)  // Check if startup mode is set
        {
            if(counter>=5)  
                counter=0;  // Reset counter
            
            if (counter==0) 
                Flash_char('H'); // Flash 'H' 
            else if (counter==1) 
                Flash_char('E'); // Flash 'E'
            else if (counter==2) 
                Flash_char('L'); // Flash 'L'
            else if (counter==3) 
                Flash_char('L'); // Flash 'L' 
            else if (counter==4) 
                Flash_char('0'); // Flash '0'

            
            counter++;  //Increment message counter
        }
        
        
       
        else if(mode==2)  // Check if keypad mode
        {
            
            counter=0;  // reset message counter
            
            kp_char = Keypad(); // Poll keypad and check if key pressed
            
            if(kp_char!=' ')  // If keypad char == ' ' then no key pressed
            {
                
                if(kp_char>='0' && kp_char<='9')
                {
                    DisplayChar(kp_char);  // Display character on 7 segment
                    pc.printf("%c\n\r",kp_char);   // Send character to serial port

                }
            }
         }   
                
                
        else if(mode==3)  // Check if serial mode
        {            
            kp_char = Keypad(); // Poll keypad and check if key pressed
            
            if(s_port.readable())
            {

                kp_char = s_port.getc();  // Display character on 7 segment
                
 
                if(kp_char>='0' && kp_char<='9')
                {
                    DisplayChar(kp_char);  // Display character on 7 segment
                    pc.printf("%c\n\r",kp_char);   // Send character to serial port

                }               
                                               
            }
        }
    }
}


// ISR function called by interrupt on push button
void cal_isr(void)
{
    // Switch modes
    if(mode==1)
    {
        mode=2; // Set mode to keypad mode
        DisplayChar(' ');  // Turn off all segments
        //wait(0.1);  //Debounce timer
    }
    else if(mode==2)
    {
        mode=3;    // Set mode to serial mode
        DisplayChar(' ');  // Turn off all segments
        //wait(0.1);  //Debounce timer
    }
    else if(mode==3)
    {
        mode=1;    // Set mode to startup mode
        DisplayChar(' ');  // Turn off all segments
        //wait(0.1);  //Debounce timer
    }
}


// Function to flash character on 7 segment 
void Flash_char(char new_char)  
{
    DisplayChar(' ');  // Turn off all segments
    wait(0.1);  
    DisplayChar(new_char);  // Display chararacter on 7 segment
    wait(0.6);   
}
    
    
    

char Keypad(void)
{   
    
    // Test for any key pressed on column 1
    // Pull col1 high and keep columns 2 and 3 low
    col1=1;
    col2=0;
    col3=0;

    
    if(row1==1) // While col1 is high, if row 1 is high then '1' is pressed
    {
        while(row1==1){}  // Loop while button is pressed down
        // On releasing the button return the button character and exit function
        
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('1');  // return character 1 and exit function
    }
    else if(row2==1) // While col1 is high, if row 2 is high then '4' is pressed
    {
        while(row2==1){}
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('4');  // Exit function and return
    }
    else if(row3==1) // While col1 is high, if row 3 is high then '7' is pressed
    {
        while(row3==1){}
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('7');
    }
    else if(row4==1) // While col1 is high, if row 4 is high then '*' is pressed
    {
        while(row4==1){}
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('*');
    }
    
    
    
    // Test for any key pressed on column 2
    // Pull col2 high and keep columns 1 and 3 low
    col1=0;
    col2=1;
    col3=0;   
    
    if(row1==1) // While col2 is high, if row 1 is high then '2' is pressed
    {
        while(row1==1){}  // Loop 
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('2');
    }
    else if(row2==1) // While col2 is high, if row 2 is high then '5' is pressed
    {
        while(row2==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('5');
    }
    else if(row3==1) // While col2 is high, if row 3 is high then '8' is pressed
    {
        while(row3==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('8');
    }
    else if(row4==1) // While col2 is high, if row 4 is high then '0' is pressed
    {
        while(row4==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('0');
    }
    
    
    // Test for any key pressed on column 3
    // Pull col3 high and keep columns 1 and 2 low
    col1=0;
    col2=0;
    col3=1;   
    
    if(row1==1) // While col3 is high, if row 1 is high then '3' is pressed
    {
        while(row1==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('3');
    }
    else if(row2==1) // While col3 is high, if row 2 is high then '6' is pressed
    {
        while(row2==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('6');
    }
    else if(row3==1) // While col3 is high, if row 3 is high then '9' is pressed
    {
        while(row3==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('9');
    }
    else if(row4==1) // While col3 is high, if row 4 is high then '#' is pressed
    {
        while(row4==1){}  // Loop
        // Pull all colums low to end
        col1=0;
        col2=0;
        col3=0;   
        return('#');
    }
    
    // Pull all colums low to end
    col1=0;
    col2=0;
    col3=0;   
    
    
    // ***** Return value ******
    return(' ');  // If no key is pressed then return ' ' a space character.

} // Keypad Function End




// Function to display a character on 7 segment LED display
void DisplayChar(char disp_char)
{
    switch(disp_char)
    {
        case '0':
            LED_Disp = ~0x3F; // Bit pattern for '0' = ~0xC0
            break;        
        case '1':
            LED_Disp = ~0x06; // Bit pattern for '1' = ~0xF9
            break;
        case '2':
            LED_Disp = ~0x5B; // Bit pattern for '2' = ~0xA4
            break;
        case '3':
            LED_Disp = ~0x4F; // Bit pattern for '3' = ~0xB0
            break;
        case '4':
            LED_Disp = ~0x66; // Bit pattern for '4' = ~0x99
            break;
        case '5':
            LED_Disp = ~0x6D; // Bit pattern for '5' = ~0x92
            break;
        case '6':
            LED_Disp = ~0x7D; // Bit pattern for '6' = ~0x82
            break;
        case '7':
            LED_Disp = ~0x07; // Bit pattern for '7' = ~0xF8
            break;
        case '8':
            LED_Disp = ~0x7F; // Bit pattern for '8' = ~0x80
            break;
        case '9':
            LED_Disp = ~0x67; // Bit pattern for '9' = ~0x98
            break;
        case 'A':
            LED_Disp = ~0x77; // Bit pattern for 'A' = ~0x77
            break;
        case 'B':
            LED_Disp = ~0x7F; // Bit pattern for 'B' = ~0x7F
            break;
        case 'C':
            LED_Disp = ~0x39; // Bit pattern for 'C' = ~0x39
            break;
        case 'D':
            LED_Disp = ~0x3F; // Bit pattern for 'D' = ~0x3F
            break;
        case 'E':
            LED_Disp = ~0x79; // Bit pattern for 'E' = ~0x79
            break;
        case 'F':
            LED_Disp = ~0x71; // Bit pattern for 'F' = ~0x71
            break;
        case 'G':
            LED_Disp = ~0x7D; // Bit pattern for 'G' = ~0x7D
            break;
        case 'H':    // Display character 'H' = ~0x77
            LED_Disp = ~0x76; 
            break;
        case 'I':    // Display character 'I' = ~0x06
            LED_Disp = ~0x06; 
            break;
        case 'L':    // Display character 'L' = ~0x38
            LED_Disp = ~0x38; 
            break;
        case 'S':
            LED_Disp = ~0x6D; // Bit pattern for 'S' = ~0x92
            break;
        case ' ':    // Display character ' ' = ~0x00
            LED_Disp = ~0x00; 
            break;
        case '*':     // keypad '*' character
            LED_Disp = ~0x63; // Top 4 segments 
            break;
        case '#':    // keypad '#' character
            LED_Disp = ~0x5C; // Bottom 4 segments 
            break;
   }
}