#include "mcc_generated_files/mcc.h" char IR_ON[1] = {0x87}; char IR_OFF[1] = {0x4B}; unsigned int arnum; //IR信号送信処理 void SendIR (char *s, int snum) { //一時処理のデータ箱 int i,j; char w; //動作確認用LED RA2 = 1; TMR2 = 0; //リーダーコードを送信する TMR2ON = 1; __delay_us(2560); TMR2ON = 0; __delay_us(2640); //カスタマーコードとデータ送信 for (i=0;i<1;i++) { w = s[i]; //1バイトずつ取り出す //取り出したデータを1ビットずつ処理する for (j=0;j<8;j++) { TMR2ON = 1; __delay_us(840); TMR2ON = 0; //データ0と1とはOFF時間の長さが異なるので分ける if (w & (0b00000001 << j)) { __delay_us(840); //ビット1のとき } else { __delay_us(1840); //ビット0のとき } } } //ストップビットの送信 TMR2ON = 1; __delay_us(840); TMR2ON = 0; __delay_ms(36); //タイムアウト //動作確認用LED RA2 = 0; } void main(void) { unsigned short mode = 1; //スイッチが押されたら送信するコードを選択 // initialize the device SYSTEM_Initialize(); OSCCON = 0b01101010; //内部オシレーター 4MHz APFCON = 0b00000001; //CCP1=RA5 TRISA = 0b00001000; //RA3のみ入力 ANSELA = 0; //アナログを使用しない WPUA = 0b00001000; //RA3のみプルアップ //割り込み設定 INTCON = 0; //割り込み無効 IOCAN = 0b00001000; //RA3の立下り検出 //PWMキャリアの設定 PR2 = 0b00011001; //38khz T2CON = 0b00001000; //ポストスケーラー1:2 Timer2 = OFF プリスケーラー1 CCP1CON = 0b00111100; //デューティサイクル0b11、PWM CCPR1L = 0x08; //デューティーサイクル35% while (1) { //ボタンが押下されたら実行 if (RA3 == 0) { //配列をポインタに置き換えると、正しい要素数が計算できなくなる。 //https://www.sejuku.net/blog/24793 //「関数に配列を渡すときの注意点」を参照。 //対策として、arnumで計算した値を一緒に渡す。 if (mode == 0) { arnum = sizeof(IR_OFF); SendIR(&IR_OFF,arnum); __delay_ms(60); SendIR(&IR_OFF,arnum); mode = 1; } else { arnum = sizeof(IR_ON); SendIR(&IR_ON,arnum); __delay_ms(60); SendIR(&IR_ON,arnum); mode = 0; } //チャタリング対策 __delay_ms(100); //ちょっと待つ while (RA3 == 0) { __delay_ms(100); //押下されなくなるまで待つ } } //ボタン押下されるまで停止 IOCAF = 0; //各ピンの状態変化割り込みクリア IOCIE = 1; //状態変化割り込みを有効 SLEEP(); NOP(); IOCIE = 0; IOCAF = 0; } }