/*************************************************** * By CCSC compiler * File Name: 20141103_K370_3LED_1823.c * Description: check 1 switch, and turn on 3 RGB LED * RC0 in pot 2 * RC1 in pot 1 * RC2 in switch active L * RC3 out LED RED * RC4 out LED GREEN * RC5 out LED BLUE * RA0 in na * RA1 in na * RA2 in pot 3 * RA3 in na * RA4 in na * RA5 in na * COPYRIGHT 2014 MYCOMKITS.COM, owned by CNET LIMITED ***************************************************/ // #define RAND_MAX 20 // generate random number 0 to 20 #include <16f1823.h> #DEVICE ADC=8 #fuses INTRC_IO, , NOWDT, NOMCLR, NOBROWNOUT, PUT, NOLVP, NOPROTECT, NODEBUG #fuses NOCPD, NOCLKOUT, NOWRT, NOIESO, NOFCMEN, PLL_SW, NOSTVREN #use delay(CLOCK = 4000000) #include #ROM getenv("EEPROM_ADDRESS") = {0, 0, 0, 0, 0, 0, 0, 0}// get 8 bytes // #use fast_io(a) #use fast_io(c) // #define Amode 0xFF //port A all input #define Cmode 0x07 //port C all input, except 3,4,5 #define MODESW PIN_C2 #define RED_LED PIN_C3 #define GREEN_LED PIN_C4 #define BLUE_LED PIN_C5 // #byte OSCCON = 0x099 #byte WPUC = 0x20E #byte OPTION_REG = 0x095 #byte PCON = 0x096 // variables int mode = 0; int last_mode = 0; int red_value = 0; int green_value = 0; int blue_value = 0; int period =30; // 15ms int red_pwm = 0; int green_pwm = 0; int blue_pwm = 0; //int rnd_number = 0; int red_flag = 0; int green_flag = 0; int blue_flag = 0; int i = 0; long j = 0; long count1 = 0; int count2 = 0; int direction = 1; // prototyping #separate void get_pot(); #separate void initializing(); #separate void mode_check(); // main function void main() { initializing(); // main loop while(1) { mode_check(); // switch(mode) { case 0: // turn on with fix value red_flag = 1; green_flag = 1; blue_flag = 1; get_pot(); break; case 1: get_pot(); if(count1 > 0) { if((j & 0x01) == 1) red_flag = 1; else red_flag = 0; if((j & 0x02) == 2) green_flag = 1; else green_flag = 0; if((j & 0x04) == 4) blue_flag = 1; else blue_flag = 0; } else { j = rand(); // 0 to 20 count1 = 20 * (j+2); } break; case 2: get_pot(); if(count1 > 0) { if((j & 0x01) == 1) red_flag = 1; else red_flag = 0; if((j & 0x02) == 2) green_flag = 1; else green_flag = 0; if((j & 0x04) == 4) blue_flag = 1; else blue_flag = 0; } else { j = rand(); // 0 to 20 count1 = 200 * (j+2); } break; case 3: red_flag = 1; green_flag = 1; blue_flag = 1; red_value = i; green_value = i; blue_value = i; break; default: break; } } } // #separate void get_pot() { //disable_interrupts(GLOBAL); set_adc_channel(5); //red, must wait 65u delay_us(100); red_value = read_adc(); //0 to 255 if(red_value < 5) red_value = 0; // 2 to 255 // set_adc_channel(4); //red, must wait 65u delay_us(100); green_value = read_adc(); //0 to 255 if(green_value < 5) green_value = 0; // 2 to 255 // set_adc_channel(2); //red, must wait 65u delay_us(100); blue_value = read_adc(); //0 to 255 if(blue_value < 5) blue_value = 0; // 0 to 255 //enable_interrupts(GLOBAL); } // #int_timer2 void isr2(void) { set_timer2(0x83); // almost 500usec if(period > 1) { period--; // ch1 if(red_pwm > 1) { red_pwm--; if(red_flag == 1) output_high(RED_LED); else output_low(RED_LED); } else output_low(RED_LED); // ch2 if(green_pwm > 1) { green_pwm--; if(green_flag == 1) output_high(GREEN_LED); else output_low(GREEN_LED); } else output_low(GREEN_LED); // ch3 if(blue_pwm > 1) { blue_pwm--; if(blue_flag == 1) output_high(BLUE_LED); else output_low(BLUE_LED); } else output_low(BLUE_LED); } else { // initialize period = 30; // 15ms = 500us X 30 red_pwm = red_value >> 3; // 0 to 32 green_pwm = green_value >> 3; // 0 to 32 blue_pwm = blue_value >> 3; // 0 to 32 } if(count1 > 0) count1 = count1 - 1; // decrement 1 every 500usec else count1 = 0; // if(count2 > 0) { count2--; } else { if(direction == 1) { if(i < 255) i++; else direction = 0; } else { if(i > 0) i--; else direction = 1; } count2 = 8; // 4msec } } // #separate void initializing() { setup_oscillator(OSC_4MHZ | OSC_PLL_OFF); // set_tris_a(Amode); // set_tris_c(Cmode); // // output_low(RED_LED); output_low(GREEN_LED); output_low(BLUE_LED); // setup_comparator(NC_NC_NC_NC); // A/D converter initialize setup_adc_ports(sAN2 | sAN4 | sAN5 | VSS_VDD); // gnd to 5v setup_adc(ADC_CLOCK_DIV_8); // 2usec // setup_timer_2(T2_DIV_BY_4,0xFF,1); // one cycle 4us period set_timer2(0x83); // almost 500usec // srand(5); //seed for random number // last_mode = read_eeprom(0); if(last_mode > 3) last_mode = 0; // mode = 0 to 3 mode = last_mode; // OPTION_REG = OPTION_REG & 0x7F; // set 0 to WPUEN WPUC = 0x04; // pull up RC2 // enable_interrupts(INT_TIMER2); // enable timer 2 enable_interrupts(GLOBAL); } // #separate void mode_check() { if(input(MODESW) == 0) { delay_ms(50); if(input(MODESW) == 0) { mode = mode + 1; if(mode == 4) mode=0; // mode = 0 to 3 write_eeprom(0, mode); } } while(input(MODESW) == 0) {} // wait until released } t_high(GREEN_LED); delay_ms(300); output_high(BLUE_LED); delay_ms(1000); output_low(RED_LED); delay_ms(300); output_low(GREEN_LED); delay_ms(300); output_low(BLUE_LED); delay_ms(1000); } // #separate void test2() { red_flag = 1; green_flag = 1; blue_flag = 1; for(i = 0; i<255; i++) { red_value = i; green_value = i; blue_value = i; delay_ms(4); } for(i = 255; i>0; i--) { red_value = i; green_value = i; blue_value = i; delay_ms(4); } }