プログラム
//FullColor LED :最長端子: //GND red,gnd,blue,green //配列と乱数による発光 //GP2,4,5>LED R,G,B 接続 //cdsのアナログ電圧>GP0 //色合い設定用の可変抵抗>GP1; //GP3:リセットスイッチ #include <12F675.h> #device ADC = 8 //INTRC_IO:内部クロック、GP4,5はポート利用 //NOWDT:WDTを使用しない //MCLR:GP3をリセット利用 //NOBROWNOUT:電源低下を検出しない #fuses INTRC_IO,NOWDT,MCLR,NOBROWNOUT #use delay(clock = 4000000) #include <math.h> #include <stdlib.h> #define nump 180 //red、greenの発光規則 int const Glow[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 }; int i,j,k; int max ; int maxby10 ; int vol; int clr; int p1,p2,p3,vi; int r,g,b,f; int rv,chng; signed long sclr,psclr,count; unsigned long v=0; unsigned long h=0; //0-360 unsigned long m;
void main(){ setup_adc_ports(sAN0|sAN1); setup_adc(ADC_clock_div_32); count=0; max=170; maxby10=17; while(1){ set_adc_channel(1); delay_us(10); //可変抵抗で色を設定 clr = (int)read_adc(); if(clr>max) clr=max; //hの最大値を360にする h = (long)(clr)*35/maxby10+ rand()%10; sclr=clr; //許容変換誤差以上 if(abs(sclr-psclr)>5){ chng=1; } else chng=0; psclr = sclr; //光センサーで点灯時間を設定 set_adc_channel(0); delay_us(10); vol = (int)read_adc() ; if(vol>100) vol=100; vol=vol/20; for(m = 0;m<nump;m++){ v = Glow[m]; i = h/60; f = (long)(h % 60) * 100 / 60; p1=0; p2=(int)((long)v * (100-f)/100); p3=(int)((long)v * f/100); vi=(int)(v); if(i==0) {r = vi ;g = p3 ;b = p1;} if(i==1) {r = p2 ;g = vi ;b = p1;} if(i==2) {r = p1 ;g = vi;b = p3;} if(i==3) {r = p1 ;g = p2 ;b = vi;} if(i==4) {r = p3 ;g = p1 ;b = vi;} if(i==5) {r = vi ;g = p1 ;b = p2;} if(chng==1){ rv=1; } else { rv = vol+1; } for(j = 0;j < rv;j++){ //pwm start output_high(PIN_A2); output_high(PIN_A4); output_high(PIN_A5); for(k = 0;k < 255;k++){ //pwm stop if(k == r) output_low(PIN_A2); if(k == b) output_low(PIN_A4); if(k == g) output_low(PIN_A5); } //k }//j }//m count++; if(count>1000) sleep();//お休み }//while }