El LCD se ve parpadeante por que estas actualizando TODO el LCD cada unos milisegundos. Es muy dificil de ver porque el codigo no esta correctamente identado, pero es esta parte:
lcd_gotoxy
(1,1); printf(LCD_PUTC
, " lectura "); lcd_gotoxy
(1,2);printf(lcd_putc
,"Serial=%ld",an
);
Lo que podrias hacer es antes de entrar al while enviar esto:
lcd_gotoxy
(1,1); printf(LCD_PUTC
, " lectura "); lcd_gotoxy
(1,2);printf(lcd_putc
,"Serial=");
Luego si podes usar un lcd_gotoxy(8,2); y un printf de solo an y nada mas , es decir printf(lcd_putc,"%u",an) dentro del while.
Asi solo actualiza el numero, ahora verias el numero de forma parpadeante. Esto se solucionaria si solo lo actualizas en intervalos mas grandes.
¿Como podes hacer para actualizarlo en intervalos mas largos?
Sabes que tenes la entrada y estas viendo los flancos, los cuales son de 20ms, si quisiera que se actualize cada segundo, entonces pongo un contador y cada 50 entradas activo una variable de 1 bit, luego en el programa principal actualizo solo el numero y pongo esa variable a 0. Lo mismo que hiciste con "control" nomas que ahora solo se pone a 1 si es que entra 50 veces a la interrupcion. Y tenes solucionado el problema.