Hola Thulsa Doom, revisando tu programa veo que le falta una instrucción importante: if(k != 0). Cuando no se presiona ninguna tecla, kbd_getc(); devuelve siempre un 0, que es mandado a imprimir como char por printf, lo que muestra un caracter extraño o nada en el caso del proteus; intenta con las correcciones que te incluyo en el siguiente código:
void main()
{
char a, k, kant = '0'; //INICIALIZA A CERO UN PAR DE VARIABLES
char ULTIMO_TECLADO, NUEVO_TECLADO = '0';
char PWMH=0,PWML=0; //INICIALIZA DOS VARIABLES QUE VA A UTILIZAR COMO CONTADORES
//PARA EL NIVEL ALTO Y BAJO DE LA PWM
kbd_init(); //LLAMA A UNA FUNCIÓN QUE SERÍA PARA INICIALIZAR EL TECLADO
lcd_init(); //IDEM PARA EL LECTOR
port_b_pullups(TRUE); //LLAMA A UNA FUNCIÓN QUE PREPARA UN PUERTO PARA TRABAJAR EN MODO PULL UP
lcd_putc('\f');
lcd_gotoxy(1,1); //Posicionamos lo que vamos a imprimir en la posición linea 1, fila 1
printf(lcd_putc,"Pulse una tecla\n para comenzar"); //Imprimimos en el LCD al comienzo del programa
while (TRUE)
{ //BUCLE INFINITO
k = kbd_getc(); //RECOGE DATO DEL TECLADO
if(k != 0) // Ojo con esto! Si no se presiona ninguna tecla, k = 0
{
a = k;
NUEVO_TECLADO = a;
//***AQUÍ VA MI RUTINA******************************************************
IF (NUEVO_TECLADO != ULTIMO_TECLADO) //SÍ NUEVO_TECLADO NO ES IGUAL QUE ULTIMO_TECLADO
{
lcd_putc('\f');
printf(lcd_putc,"Nivel %c", a); //Escribimos en el LCD la variable a, pero en el lcd solo aparece NIVEL
}
/*si pongo esto:
lcd_putc(a);
si imprime el número que piso en el teclado pero un valos se suma al siguiente
por ejemplo si pulso 1 2 3 4 , aparece de esta manera en el lcd, si pulso más pues se añaden a lo que hay, no
entiendo que pasa, en teoría el %c",a devería de funcionar, lo he probado con d, con u, pero nada, es como si no
identificara la variable*/
ULTIMO_TECLADO=NUEVO_TECLADO;
}
/************************************************FIN DE RUTINA*****************************************************************/
if(k =='\0')
k = kant;
if((k=='*')||(k=='#'))
k = '0';
kant=k; //PREPARA LAS VARIABLES DE LOS NIVELES DE LA PWM SEGÚN CÓDIGO ASKI
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
for(PWMH; PWMH>0; PWMH--)
{ //CREA EL NIVEL ALTO DE LA PWM
output_high(PIN_A0);
}
for(PWML; PWML>0; PWML--)
{ //CREA EL NIVEL BAJO DE LA PWM
output_low(PIN_A0);
}
}
}
Sin embargo, no me queda claro como quieres hacer funcionar el PWM. Por ejemplo las dos últimas instrucciones for no tienen ningún efecto en el programa. En los ejemplos del CCS hay uno que se llama EX_PWM.C. Te recomiendo que lo estudies detenidamente, asi como el uso de la instrucción for.
Saludos!
Editado. Causa: corrección en código y explicación...