Tu problemas es la cantidad de veces que lees el teclado :/
Lo lees luego de mostrar en el LCD, luego en el programa para actuar sobre el teclado, etc....
Por ejemplo aca lo lees 2 veces:
tecla= teclado ();
switch(teclado()){
Ademas la funcion teclado es redundante...
// Wait for key to be pressed and released
do {
kp = Keypad_Key_Click(); // Store key code in kp variable
}while (!kp);
Me explico con la explicacion de esa funcion:
Call to Keypad_Key_Click
is a blocking call: the function waits until some key is pressed and released.
Es decir posee un while dentro de esa funcion...
Por otro lado podrias hacer algo mucho mas sencillo con esto:
switch (kp) {
case 1: kp = '1'; break; // 1 // Uncomment this block for keypad4x4
case 2: kp = '2'; break; // 2
case 3: kp = '3'; break; // 3
case 4: kp = 'A'; break; // A
case 5: kp = '4'; break; // 4
case 6: kp = '5'; break; // 5
case 7: kp = '6'; break; // 6
case 8: kp = 'B'; break; // B
case 9: kp = '7'; break; // 7
case 10: kp = '8'; break; // 8
case 11: kp = '9'; break; // 9
case 12: kp = 'C'; break; // C
case 13: kp = '*'; break; // *
case 14: kp = '0'; break; // 0
case 15: kp = 35; break; // #
case 16: kp = 68; break; // D
}
Reemplazarlo por algo asi:
//Definido arriba
const char teclas[] ={'1','2','3','A','5','6','B','7','8','9','C','*','0',35,38};
//Y usarlo asi:
return teclas[--kp];
Si... super inteligentes los de MikroC por usar una salida que va desde 1 al 16, cuando C tiene indices de array que inician en 0.... Por eso hace falta el -1 antes de acceder al array.