bool CardDetected = 0; // Last Card Detect Event
Boolean variables should be assigned values of true or false. The comment doesn't tell us anything useful. Events occur at points in time. That is not what you are storing in this variable.
Fix the comment, the name, or the type.
CaRdreadEr();
yOu ReALly shOUld Get your shIFt KeY fixed. The random capitalization in function names contributes NOTHING useful.
btn_push = ReadKeypad();
You know far more than that a button was pushed. The name of the variable that holds that information should reflect the information that it folds.
MainMenuBtn();
Menus don't have buttons. This function name is useless. There is NO clue what it actually does.
void Relay_on(){digitalWrite(relay_pin,LOW);
digitalWrite(ledG_pin,HIGH);
}
Stupid code layout. Get real.
while(ReadKeypad()!= 'L')
{
Relay_off();
}
Once the relay is off, is there any point in turning it off, off, off, off, off, off, off, off, off, off, off, off, off, ... ?
problem is in CaRdetected function
No, it isn't. The problem is that you never call this stupidly named function.