No, por que el delay es solamente hacer que le microcontrolador ejecute muchas veces instrucciones NOP o SALTOS que directamente no hacen nada al programa, no es que genera una ventana que se cumpla por ese tiempo. Si de C traducis a ASM o entendes como funciona C
esto:
if(!input(Pulse_arriba) && delay_ms(2000))
Haria:
Se fija si la primera condicion de cumple, de no cumplirse la segunda no importa y no entra en el if. De cumplirse hace la otra condicion, en este caso ejecutaria el delay haciendo Nada por 2s. y entraria al If o no (no creo que devuelva nada la funcion, lo cual se podria considerar NULL y que no entre al If) pero no funciona como vos pensas.
Formas de hacerlo hay varias la mas facil que se me ocurre es algo asi:
if(!input(Pulse_arriba)){
delay_ms(500 - rapidez);
pulsa++;
lcd_gotoxy(4,2);
printf(lcd_putc,"%d",pulsa);
if (rapidez < 450) { rapidez += 5 ;}
}
if(input(Pulse_arriba) && input(Pulse_abajo)){ rapidez =0; }
Debo sacar el while por que no funcionaria como quiero, basicamente lo que hago es comenzar con un delay de 500ms ( o tal ves mas ), si sigo teniendo presionado rapidez aumenta de 5 en 5 o el valor que yo quiera ( 1, 2 , 3, etc ) disminuyendo mi delay.
Es decir cada ves que entra disminuye el tiempo entre que va aumentando pulsa, cuando soltas ( ambos botones ) se reinicia el valor rapidez.
Luego tenes formas mas complejas hasta de hacer interrupciones con el timer y observar los pines cada 1ms por ejemplo, y fijar que cada xx segundos comienze a ir mas rapido.
Si queres hacer escalones, es decir que si mantenes presionado, por 5 segundos suba a una velocidad, por otros 5 a otra y por ultimo una maxima velocidad, simplemente modificas esto:
if (rapidez < 450) { rapidez += 5 ;}
por algo asi:
if (rapidez < 50) { rapidez += 5 ;}
else if (rapidez < 200) { rapidez += 10 ;}
else if (rapidez < 450) { rapidez += 20 ;} // Esta condicion si o si, ya que es la que impone el limite maximo de reduccion del delay.
O con un switch case.
CREO que deberia andar bien lo que digo
, rapidez es una variable de 16bits en este caso
Por cierto KILLERJC , lo que me comentaste de subir el conteo mediante 4 botones y elegir si quiero subir unidades/centenas/decenas y así ascender más rápido en mi caso no es posible, ya que tengo un menú con distintas opciones, y necesito un botón de ENTER y otro de ESCAPE para ir por el menú. Por tanto solo podría utilizar subir y bajar para variar el password, aún así muchas gracias.
Podrias...
Comenzado con el primer digito, tenes para subir o bajar ( o directamente subir solo ya que son 10 opciones ) y luego un Enter y pasas al segundo digito, asi hasta el 4to donde ese ultimo Enter comprueba el numero ingresado.
O del ultima como dije solo seria necesario subir, por lo tanto tendrias un boton de subir, atras, enter y podes usarlo al otro como para pasar al otro digito ( ejemplo hacia la derecha ). Esto te permitiria mofidicar el valor por si le erraste en algun numero.