//********************************************************************** /*   <送受リモコンモジュール(赤外線データ通信)> */ //********************************************************************** //■マクロ定義 #define BYTE unsigned short #define WORD unsigned int #define DWORD unsigned long // sbit CH1 at RA1_bit; sbit CH2 at RA0_bit; sbit CH3 at RA7_bit; sbit CH4 at RA6_bit; sbit CH5 at RB7_bit; sbit CH6 at RB6_bit; sbit CH7 at RB4_bit; sbit CH8 at RB3_bit; // sbit SW1 at RA1_bit; sbit SW2 at RA0_bit; sbit SW3 at RA7_bit; sbit SW4 at RA6_bit; sbit SW5 at RB7_bit; sbit SW6 at RB6_bit; sbit SW7 at RB4_bit; sbit SW8 at RB3_bit; // sbit SW at RA5_bit; // sbit LED at RB1_bit; #define ON 1 #define OFF 0 //********************************************************************** //■関数宣言 extern void main(); extern void Remocon_Server(); extern void Remocon_Client(); extern void Remocon_Send_Chr(unsigned short dt); extern void interrupt(); extern void timer_start(); extern void led_on_off(); //********************************************************************** //■メイン関数 void main() { OSCCON = 0b01110000; ANSEL = 0b00000000; // if (SW == 1) { Remocon_Client(); } else { Remocon_Server(); } } //********************************************************************** //■リモコンモジュールサーバ関数(受信用) void Remocon_Server() { short cnt; // TRISA = 0b00111100; TRISB = 0b00000101; // CH1 = OFF; CH2 = OFF; CH3 = OFF; CH4 = OFF; CH5 = OFF; CH6 = OFF; CH7 = OFF; CH8 = OFF; // Uart1_Init(1200); // for (cnt = 0; cnt < 10; cnt++) { LED = ON; Delay_ms(50); LED = OFF; Delay_ms(50); } // while(1) { if (Uart1_Data_Ready() != 1) { continue; } // switch (Uart1_Read()) { case '1': CH1 = ~CH1; break; case '2': CH2 = ~CH2; break; case '3': CH3 = ~CH3; break; case '4': CH4 = ~CH4; break; case '5': timer_start(); CH5 = ON; break; case '6': timer_start(); CH6 = ON; break; case '7': timer_start(); CH7 = ON; break; case '8': timer_start(); CH8 = ON; break; } // LED = ON; Delay_ms(10); LED = OFF; } } //********************************************************************** //■リモコンモジュールクライアント関数(送信用) void Remocon_Client() { short cnt; // TRISA = 0b11111111; TRISB = 0b11111100; // Pwm1_Init(38000); // 38kHz duty=50% Pwm1_Set_Duty(PR2 / 2); Pwm1_Stop(); // for (cnt = 0; cnt < 10; cnt++) { LED = ON; Delay_ms(50); LED = OFF; Delay_ms(50); } // while (1) { if (SW1 == 0) { while (SW1 == 0) { Delay_ms(100); } Remocon_Send_Chr('1'); led_on_off(); } if (SW2 == 0) { while (SW2 == 0) { Delay_ms(100); } Remocon_Send_Chr('2'); led_on_off(); } if (SW3 == 0) { while (SW3 == 0) { Delay_ms(100); } Remocon_Send_Chr('3'); led_on_off(); } if (SW4 == 0) { while (SW4 == 0) { Delay_ms(100); } Remocon_Send_Chr('4'); led_on_off(); } if (SW5 == 0) { Remocon_Send_Chr('5'); led_on_off(); } if (SW6 == 0) { Remocon_Send_Chr('6'); led_on_off(); } if (SW7 == 0) { Remocon_Send_Chr('7'); led_on_off(); } if (SW8 == 0) { Remocon_Send_Chr('8'); led_on_off(); } } } //********************************************************************** //■リモコンモジュールデータ送信関数 (クライアント側送信用) void Remocon_Send_Chr(unsigned short dt) { short cnt; //start-bit Pwm1_Start(); Delay_us(833); Pwm1_Stop(); //data-bit(LSB.....MSB) for (cnt = 0; cnt < 8; cnt++) { if ((dt & 0b00000001) != 0) { Delay_us(833); } else { Pwm1_Start(); Delay_us(833); Pwm1_Stop(); } // dt >>= 1; } //stop-bit Delay_us(833); // Delay_ms(10); } //********************************************************************** //■割り込み関数 void interrupt() { if (PIR1.TMR1IF == 1) { PIR1.TMR1IF = 0; T1CON.TMR1ON = 0; // CH5 = OFF; CH6 = OFF; CH7 = OFF; CH8 = OFF; } } //********************************************************************** //■タイマー開始関数(100msec) void timer_start() { PIE1.TMR1IE = 1; PIR1.TMR1IF = 0; T1CON.T1CKPS0 = 1; T1CON.T1CKPS1 = 1; TMR1L = 0x58; TMR1H = 0x9E; INTCON.PEIE = 1; INTCON.GIE = 1; T1CON.TMR1ON = 1; } //********************************************************************** //■LED点滅関数 void led_on_off() { LED = ON; Delay_ms(10); LED = OFF; } //**********************************************************************