ارجو شرح هذا الكود لو سمحتو
هذا الكود كود استقبال الاشعة ما تحت الحمراء
وانا عاوز شرحة لو سمحتو
كود:
sbit ir_in at RA0_bit; // Infrared receiver input
sbit ir_in_direction at TRISA0_bit; // Infrared receiver input
unsigned int retint; // general purpose integer
unsigned char ir_byte,COUNT,bouton;
unsigned char ir_result[3];
void interrupt()
{
count++;
intcon=0b00100000;
TMR0=0;
}
unsigned int get_mark(){
TMR0= 0; count=0;
for(;!ir_in;){}
retint=2*(TMR0+(count*256));
return retint;
}
unsigned int get_space(){
TMR0= 0; count=0;
for(;ir_in;){}
retint=2*(TMR0+(count*256));
return retint;
}
unsigned char get_sony_byte(char nbits){
char n;
unsigned char ir_byte;
unsigned int temp_ir;
ir_byte = 0; // initialise
for(n=0 ; n<nbits ; n++){
temp_ir = get_space(); // expect ~510uS
temp_ir = get_mark();
ir_byte >>= 1; // 650uS = 0, 1.2uS = 1
if ((temp_ir > 1000)&&(temp_ir < 1300)) {
ir_byte += 0x80;
}
}
ir_byte >>= 8-nbits;
return ir_byte;
}
void sony_read(){
unsigned int temp_ir;
ir_result[0] = 0; // return 0, 0 if glitch
ir_result[1] = 0; // return 0, 0 if glitch
while(ir_in); // wait for IR to go low
temp_ir = get_mark();
if((temp_ir>2000)&&(temp_ir<3000)) { // expect 2.4mS mark
ir_result[0] = get_sony_byte(7); // 7 bit command
ir_result[1] = get_sony_byte(5); // 5 bit address
Delay_ms(10); // wait for repeat messages to clear
}
}
void main() {
TRISA=0x0F;
TRISB=0;
PORTB=0;
PORTA=0;
cmcon=7;
option_reg=0b10000000;
intcon=0b10100000;
TMR0 = 0;
while(1){
sony_read();
if(ir_result[1]==1){ // Sony address 01 is TV
bouton = ir_result[0];
switch (bouton){
case 0: Portb.F0 = ~Portb.F0;Delay_ms(150);break; // button TV '0'
case 1: Portb.F1 = ~Portb.F1;Delay_ms(150);break; // button TV '1'
case 2: Portb.F2 = ~Portb.F2;Delay_ms(150);break; // button TV '2'
case 3: Portb.F3 = ~Portb.F3;Delay_ms(150);break; // button TV '3'
default:break;
}
}
}
while(1); // loop forever