//FullColor LED :最長端子:
//GND red,gnd,blue,green
//配列と乱数による発光
//GP2,4,5>LED R,G,B 接続
//cdsのアナログ電圧>GP0
//色合い設定用の可変抵抗>GP1;
//GP3:リセットスイッチ
#include <12F675.h>
#device ADC = 8 //AD変換8bit
//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++){
//h,v,s=1カラーモデルからr,g,bを計算
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; }
//PWM点灯
for(j = 0;j < rv;j++){
output_high(PIN_A2);
output_high(PIN_A4);
output_high(PIN_A5);
for(k = 0;k < 255;k++){
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
}