Andrew Bell
/
counter_assesment_creg
7 seg counter with 3 modes controlled by push button
Diff: main.cpp
- Revision:
- 0:7d75e4df9577
diff -r 000000000000 -r 7d75e4df9577 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Mar 03 16:24:55 2021 +0000 @@ -0,0 +1,403 @@ +#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; + } +}