Intenta no escribir en mayusculas por favor. Podemos leerlo de la misma forma.
Consejo de mi parte, la simulacion es muy linda, pero olvidate de esto, aprende a programar sin simulacion, sino vas a estar toda tu vida atrapado en el Proteus, y cuando no puedas simular eso vas a morir ahi, es horrible cuando te acostumbras a eso y programas pensando en eso, total si le erras lo ves en el proteus, fin, pero cuando no lo tenes sea por lo que sea ahi tenes que buscarle otras formas. No recuerdo si el Proteus tiene un NRF24L01 como para "simularlo", y es algo que no vas a poder probar exactamente muy facil.
Para mi el SPI es maestro en ambos, nomas que se envia un dato para leer y/o escribir. Asi que queda descartado el conectar ambos PIC juntos. Sin los NRF.
ADEMAS NO ME FUNCIONA LA LA INTERRUPCION RB DEL PIC 16F,
Es mas que obvio que no te va a funcionar..
Jamas pero JAMAS pongas delays, while(), funciones de LCD, dentro de la interrupcion.
Ademas que hace lcd_init() y kbd_init() dentro de la interrupcion? cuando eso deberia estar en la parte de la configuracion antes del while del main. Ademas lo repetis muchisimas veces.. Cuando 1 sola ves donde dije bastaria.
Tu interrupcion es EXTREMADAMENTE larga.
Si.. Nada complejo ni que lleve tiempo en las interrupciones, es actuar rapido y salir. Asi debe ser una interrupcion.
Eso respecto a la interrupcion, Sobre el programa en si, solo con ver el de PIC16F veo DEMASIADOS while, cuando tal ves solo necesitarias creo que 1 solo ( el while(true) );
Y tambien Muchisimos delays por todos lados.
No es por nada pero:
hum=(int)((((float)read_adc())*0.02)+0.01)*20;
es igual a :
hum=(int)((((float)read_adc())*0.4)+0.2);
Y otra mas que encontre:
temp=(int)(((float)read_adc())*2);
Con que necesidad de pasarlo a float ? Era un simple:
temp=read_adc()*2;