プログラム

//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
}