/* Pins: ###### PB1 SCK Programmer PB2 MOSI Programmer PB3 MISO Programmer PC0 LCD D0 PC1 LCD D1 PC2 LCD D2 PC3 LCD D3 PC4 LCD D4 PC5 LCD D5 PC6 LCD D6 PC7 LCD D7 PF0 NumpadLeftCol PF1 NumpadMiddleCol PF2 NumpadRightCol PF3 NumpadTopRow PF4 NumpadUpperMiddleRow PF5 NumpadLowerMiddleRow PF6 NumpadBottomRow PF7 PG0 LCD E2 PG1 LCD E1 PG2 LCD RS */ //Ignoring all the #includes, they are not relevant for this #define DEBOUNCETIME 10 // Global variables for button debouncing bool Numpad0Old = false; bool Numpad1Old = false; bool Numpad2Old = false; bool Numpad3Old = false; bool Numpad4Old = false; bool Numpad5Old = false; bool Numpad6Old = false; bool Numpad7Old = false; bool Numpad8Old = false; bool Numpad9Old = false; bool NumpadMinusOld = false; bool NumpadPointOld = false; bool Numpad0New = false; bool Numpad1New = false; bool Numpad2New = false; bool Numpad3New = false; bool Numpad4New = false; bool Numpad5New = false; bool Numpad6New = false; bool Numpad7New = false; bool Numpad8New = false; bool Numpad9New = false; bool NumpadMinusNew = false; bool NumpadPointNew = false; //Ignoring all the LCD functions, they are not relevant for this, but they would be here void Init() { //set up the outputs for the LCD DDRC = 0xFF; //PORT C is all outputs for the LCD DDRG = DDRG | 0b00000111; //PORT G pins 0, 1 and 2 are used as outputs for the LCD //PF6,PF5,PF4,PF3 are always inputs with pull-up DDRF = DDRF & 0b10000111; //PF6,PF5,PF4,PF3 are inputs PORTF = PORTF | 0b01111000; //PF6,PF5,PF4,PF3 have pullups //init the LCD LCD_init(); } int main(void) { Init(); while (true) { //Store the previous button states Numpad0Old = Numpad0New; Numpad1Old = Numpad1New; Numpad2Old = Numpad2New; Numpad3Old = Numpad3New; Numpad4Old = Numpad4New; Numpad5Old = Numpad5New; Numpad6Old = Numpad6New; Numpad7Old = Numpad7New; Numpad8Old = Numpad8New; Numpad9Old = Numpad9New; NumpadMinusOld = NumpadMinusNew; NumpadPointOld = NumpadPointNew; //Set all the "NumpadxNew" variables to false, if a button is pushed it will get overwritten to true //This is done to avoid writing lots of "if else"s Numpad0New = false; Numpad1New = false; Numpad2New = false; Numpad3New = false; Numpad4New = false; Numpad5New = false; Numpad6New = false; Numpad7New = false; Numpad8New = false; Numpad9New = false; NumpadMinusNew = false; NumpadPointNew = false; //set PF0 low to check the left col, PF1 and PF2 are high impedance DDRF = DDRF | 0b00000001; DDRF = DDRF & 0b11111001; PORTF = PORTF & 0b11111110; PORTF = PORTF | 0b00000110; if((PINF & 0b01000000) == false) { //Button 7 was pushed Numpad7New = true; } if((PINF & 0b00100000) == false) { //Button 4 was pushed Numpad4New = true; } if((PINF & 0b00010000) == false) { //Button 1 was pushed Numpad1New = true; } if((PINF & 0b00001000) == false) { //Button - was pushed NumpadMinusNew = true; } //set PF1 low to check the middle col, PF0 and PF2 are high impedance DDRF = DDRF & 0b11111010; DDRF = DDRF | 0b00000010; PORTF = PORTF & 0b11111101; if((PINF & 0b01000000) == false) { //Button 8 was pushed Numpad8New = true; } if((PINF & 0b00100000) == false) { //Button 5 was pushed Numpad5New = true; } if((PINF & 0b00010000) == false) { //Button 2 was pushed Numpad2New = true;; } if((PINF & 0b00001000) == false) { //Button 0 was pushed Numpad0New = true; } //set PF2 low to check the right col, PF0 and PF1 are high impedance DDRF = DDRF & 0b11111100; DDRF = DDRF | 0b00000100; PORTF = PORTF & 0b11111011; PORTF = PORTF | 0b00000011; if((PINF & 0b01000000) == false) { //Button 9 was pushed Numpad9New = true; } if((PINF & 0b00100000) == false) { //Button 6 was pushed Numpad6New = true; } if((PINF & 0b00010000) == false) { //Button 3 was pushed Numpad3New = true; } if((PINF & 0b00001000) == false) { //Button . was pushed NumpadPointNew = true; } //Detect rising edges if(Numpad0Old < Numpad0New) { //´Rising edge at button Numpad 0 LCD_WriteString(0,0,"Button 0 was pushed"); } if(Numpad1Old < Numpad1New) { //´Rising edge at button Numpad 1 LCD_WriteString(0,0,"Button 1 was pushed"); } if(Numpad2Old < Numpad2New) { //´Rising edge at button Numpad 2 LCD_WriteString(0,0,"Button 2 was pushed"); } if(Numpad3Old < Numpad3New) { //´Rising edge at button Numpad 3 LCD_WriteString(0,0,"Button 3 was pushed"); } if(Numpad4Old < Numpad4New) { //´Rising edge at button Numpad 4 LCD_WriteString(0,0,"Button 4 was pushed"); } if(Numpad5Old < Numpad5New) { //´Rising edge at button Numpad 5 LCD_WriteString(0,0,"Button 5 was pushed"); } if(Numpad6Old < Numpad6New) { //´Rising edge at button Numpad 6 LCD_WriteString(0,0,"Button 6 was pushed"); } if(Numpad7Old < Numpad7New) { //´Rising edge at button Numpad 7 LCD_WriteString(0,0,"Button 7 was pushed"); } if(Numpad8Old < Numpad8New) { //´Rising edge at button Numpad 8 LCD_WriteString(0,0,"Button 8 was pushed"); } if(Numpad9Old < Numpad9New) { //´Rising edge at button Numpad 9 LCD_WriteString(0,0,"Button 9 was pushed"); } if(NumpadMinusOld < NumpadMinusNew) { //´Rising edge at button Numpad - LCD_WriteString(0,0,"Button - was pushed"); } if(NumpadPointOld < NumpadPointNew) { //´Rising edge at button Numpad . LCD_WriteString(0,0,"Button . was pushed"); } //wait some time for the button to stop oscillating _delay_ms(DEBOUNCETIME); } }