//蛍発光 受け取り側 //#include <16F873A.h> #include <16F88.h> //FullColor LED 最長:GND red,gnd,blue,green #fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP #use delay(clock = 4000000) //絶対時間による遅延 #use fast_io(B) // 固定入力モード //書き込み作業時、どれか1つを有効にする //#use I2c(slave,sda=PIN_B1,scl=PIN_B4,address=0x60,force_hw)//中央 //#use I2c(slave,sda=PIN_B1,scl=PIN_B4,address=0x62,force_hw)//左側 #use I2c(slave,sda=PIN_B1,scl=PIN_B4,address=0x64,force_hw)//右側 #include #include #define nump 180 //red、greenの発光規則 int const RG[nump] = { 0, 4, 8, 13, 17, 22, 26, 31, 35, 39, 44, 48, 53, 57, 61, 65, 70, 74, 78, 83, 87, 91, 95, 99, 103, 107, 111, 115, 119, 123, 127, 131, 135, 138, 142, 146, 149, 153, 156, 160, 163, 167, 170, 173, 177, 180, 183, 186, 189, 192, 195, 198, 200, 203, 206, 208, 211, 213, 216, 218, 220, 223, 225, 227, 229, 231, 232, 234, 236, 238, 239, 241, 242, 243, 245, 246, 247, 248, 249, 250, 251, 251, 252, 253, 253, 254, 254, 254, 254, 254, 255, 254, 254, 254, 254, 254, 253, 253, 252, 251, 251, 250, 249, 248, 247, 246, 245, 243, 242, 241, 239, 238, 236, 234, 232, 231, 229, 227, 225, 223, 220, 218, 216, 213, 211, 208, 206, 203, 200, 198, 195, 192, 189, 186, 183, 180, 177, 173, 170, 167, 163, 160, 156, 153, 149, 146, 142, 138, 135, 131, 127, 123, 119, 115, 111, 107, 103, 99, 95, 91, 87, 83, 78, 74, 70,65, 61, 57, 53, 48, 44, 39, 35,31, 26, 22, 17, 13, 8, 4}; // RG[a]=(int)(255 * Math.sin( Math.PI * a/180.0)) // RG.length = 180; //blueの発光規則 int const B[] = { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 252, 249, 246, 243, 240, 237, 234, 231, 228, 225, 222, 219, 216, 213, 210, 207, 204, 201, 198, 195, 192, 189, 186, 183, 180, 177, 174, 171, 168, 165, 162, 159, 156, 153, 150, 147, 144, 141, 138, 135, 132, 129, 126, 123, 120, 117, 114, 111, 108, 105, 102, 99, 96, 93, 90, 87, 84, 81, 78, 75, 72, 69, 66, 63, 60, 57, 54, 51, 48, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3}; //B[a] = 3*a, B.length = 170; int i,j,k; int lmR1,lmG1,lmB1,lmR2,lmG2,lmB2,lmR3,lmG3,lmB3; int Flag,flag1,flag2,flag3; int state; //割り込み作業 #INT_SSP void ssp_interupt (){ state=i2c_isr_state(); if(state >= 0x80){ }//if else if(state > 0){ Flag = i2C_read(); //焦電センサーの処理 if(Flag == 11) flag1 = 1; else if(Flag == 21) flag2 = 1; else if(Flag == 31) flag3 = 1; output_toggle(PIN_B0); }//if }//interupt void main(){ flag1 = flag2 = flag3 = 0; set_tris_b(0xd2);//RB 0,2,3,5 = 1;1,4,6,7 = 0 output_float(PIN_B1); //I2C pin float output_float(PIN_B4); //I2C pin float enable_interrupts(INT_SSP);//SSP割り込みを許可 enable_interrupts(GLOBAL);//全ての割り込みを許可 while(1){ //PWM loop switch(Flag){ case 0: flag1 = flag2 = flag3 = 0; break; case 10: flag1 = 1; flag2 = 0; flag3 = 0; break; case 20: flag1 = 0; flag2 = 1; flag3 = 0; break; case 30: flag1 = 0; flag2 = 0; flag3 = 1; break; case 40: flag1 = 1; flag2 = 1; flag3 = 0; break; case 50: flag1 = 1; flag2 = 0; flag3 = 1; break; case 60: flag1 = 0; flag2 = 1; flag3 = 1; break; default: flag1 = flag1; flag2 = flag2; flag3 = flag3; break; }//switch for(i = 0; i < nump; i++){ //pwm start if(flag1 == 1){ lmR1 = RG[i];//点灯時間の設定 1red lmG1 = RG[i];//同 1green if(i > 4 && i < 175)//青は周期が少しずれている lmB1 = B[i-5];// 1blue else lmB1 = 0;//0 <= i <= 4,175 <= i <= 180 の間は0 } else if(flag1 == 0){ lmR1 = lmG1 = lmB1 = 0; } if(flag2 == 1){ lmR2 = RG[i];//点灯時間の設定 2red lmG2 = RG[i];//同 2green if(i > 4 && i < 175) lmB2 = B[i-5];// 2blue else lmB2 = 0; } else if(flag2 == 0){ lmR2 = lmG2 = lmB2 = 0; } if(flag3 == 1){ lmR3 = RG[i];//点灯時間の設定 3red lmG3 = RG[i];//同 3green if(i > 4 && i < 175) lmB3 = B[i-5];//3blue else lmB3 = 0; } else if(flag3 == 0){ lmR3 = lmG3 = lmB3 = 0; } for(j = 0;j < 2; j++){ output_low(PIN_A3);//点灯命令groupB 端子をONにするメソッド output_low(PIN_A7); output_low(PIN_A6); output_low(PIN_A0);//点灯命令groupA output_low(PIN_A1); output_low(PIN_A2); output_low(PIN_B2);//点灯命令groupC output_low(PIN_B3); output_low(PIN_B5); //pwm stop for(k = 0;k < 255;k++){ //Kがlmと同じ値になったら消灯命令 if(k == lmR1) output_high(PIN_A6);//groupB if(k == lmG1) output_high(PIN_A7); if(k == lmB1) output_high(PIN_A3);//R,GとBは必然的に消灯のタイミングがずれる if(k == lmR2) output_high(PIN_A2);//groupA if(k == lmG2) output_high(PIN_A1); if(k == lmB2) output_high(PIN_A0); if(k == lmR3) output_high(PIN_B2);//groupC if(k == lmG3) output_high(PIN_B3); if(k == lmB3) output_high(PIN_B5); }//for k }//for j }//i //for i内で一通り点灯作業が実行されてから休止する delay_ms(10);//遅延時間 }//while }//main