#include // CONFIG #pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Selection bits (BOR disabled) #pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled) #define _XTAL_FREQ 4000000 #define RED RC2 #define GRN RC1 #define BLE RC0 #define RED2 RA4 #define GRN2 RC5 #define BLE2 RC4 #define RED3 RC3 #define GRN3 RC6 #define BLE3 RC7 #define SUS RA2 //suspend button port #define MODE1 RB4 #define MODE2 RB5 #define MODE3 RB6 #define MODE4 RB7 #define bri_a_num 15 unsigned char bri_a[bri_a_num] = {0,2,4,8,16,29,44,62,44,29,16,8,4,2,0}; unsigned char cnt; bit pwm_on; bit pwm_w,pwm_n, pwm_wn, pwm_nn; bit a, b, a2, a3, b_2, b_3, c_1, c_2, c_3, s_w, s_n, s_wn, s_nn; unsigned char bri; unsigned char bri2; unsigned char cnt; unsigned char cnt2; unsigned char pwm_c; unsigned char ptn; unsigned char spd; unsigned char r_offs; unsigned char bri2_max; unsigned char bri_min; unsigned char bri_step; unsigned char bri_tmp; unsigned char sus_cnt; unsigned char tmp1; unsigned char unit_st; unsigned char unit_end; unsigned char ptn_bgn; unsigned char ptn_end; bit mode; bit mode2; bit chbri; bit briup; bit ch; bit incr; bit sus; bit trg; bit blk; bit alt; bit md1, md2, md3, md4; bit reset; unsigned int adconv() { unsigned int temp; __delay_us(10); ADCON0bits.GO = 1; while(ADCON0bits.GO_DONE) {}; temp = ADRESH << 8 | ADRESL; return temp ; } /* void port_reset() { RED2 = 0; PORTB = 0x00; PORTC = 0x00; } */ void cl_sp_change() { cnt2++; //When color changes if(cnt2 == bri_a_num)//if(cnt2 == spd * 4) { if(!blk) { ptn++; if(ptn == ptn_end + 1) ptn = ptn_bgn; } cnt2 = 0; spd = adconv()/60+1; } bri2 = bri_a[cnt2]; chbri = 0; } /* void cl_sp_change(unsigned char last) { cnt2++; if (cnt2 < spd*1) bri2 += bri_step; else if(cnt2 < spd*2) bri2 += bri_step*2; else if(cnt2 < spd*3) bri2 -= bri_step*2; else if(cnt2 < spd*4-1) bri2 -= bri_step; //When color changes if(cnt2 == spd * 4) { if(!blk) { ptn++; if(ptn == last + 1) ptn = 1; } cnt2 = 0; spd = adconv()/60+1; bri_step = 21/spd; bri2 = 4; } chbri = 0; } */ void op_sus() { if(!trg) { if(!sus && !blk) sus = 1, bri2 = 62; else if(sus) blk = 1, sus = 0; else if(blk) blk = 0; sus_cnt = 50; trg = 1; } } void op_sus2() { if(!trg) { if(!sus) sus = 1, bri2 = 62; else if(sus) sus = 0; sus_cnt = 50; trg = 1; } } void op_sus3() { if(!trg) { if(!sus && !alt) sus = 1, bri2 = 62; else if(sus) alt = 1, sus = 0; else if(alt) alt = 0; sus_cnt = 50; trg = 1; } } int main(void) { PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; TRISA = 0b00000110; TRISB = 0b11110000; TRISC = 0b00000000; OSCCON = 0b01100000; ANSEL = 0b00000010; ANSELH= 0b00000000; ADCON0 = 0b10000101; //ADCON1 = 0x00; OPTION_REG = 0b00000100; WPUA = 0b00000100; WPUB = 0b11110000; //RB4-RB7 is pull up IOCB = 0xFF; //Interrupt on change of RB is enabled INTCONbits.RABIF = 0; //Clear interrupt flag INTCONbits.RABIE = 1; //Interrupt on change is enabled TMR0 = 0; INTCONbits.T0IE =1; INTCONbits.GIE = 1; start_flush: PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; pwm_c = 250; //PWM one cycle is 1us * 16 * 250 = 4 ms ( = 250 Hz ) bri2_max = pwm_c/2 - 1; bri_min = 6; //6 is best INTCONbits.T0IE = 1; INTCONbits.GIE = 1; cnt = 0; pwm_on = 1; pwm_w = 0, pwm_n = 0, pwm_wn = 0, pwm_nn = 0; ch = 1; bri = 0; TMR0 = -bri2; chbri = 1; ptn = 1; cnt2 = 0; bri2 = 4; //spd = 3; spd = adconv()/60+1; //2; //adc_read(1)/25 + 1; r_offs = 0; sus = 0; trg = 0; blk = 0; reset = 0; __delay_ms(10); //md1 = MODE1; md2 = MODE2; md3 = MODE3; md4 = MODE4; if(!MODE1 && MODE2 && MODE3 && MODE4) //honoka { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = pwm_w; GRN = pwm_nn; BLE = 0; RED2 = pwm_w; GRN2 = pwm_nn; BLE2 = 0; RED3 = pwm_w; GRN3 = pwm_nn; BLE3 = 0; if(chbri && !sus) cl_sp_change(); }while(1); } else if(MODE1 && !MODE2 && MODE3 && MODE4) //kotori { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = pwm_n; GRN = pwm_n; BLE = pwm_n; RED2 = pwm_n; GRN2 = pwm_n; BLE2 = pwm_n; RED3 = pwm_n; GRN3 = pwm_n; BLE3 = pwm_n; if(chbri && !sus) cl_sp_change(); }while(1); } else if(!MODE1 && !MODE2 && MODE3 && MODE4) //umi { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = 0; GRN = 0; BLE = pwm_w; RED2 = 0; GRN2 = 0; BLE2 = pwm_w; RED3 = 0; GRN3 = 0; BLE3 = pwm_w; if(chbri && !sus) cl_sp_change(); }while(1); } else if(MODE1 && MODE2 && !MODE3 && MODE4) //hanayo { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = 0; GRN = pwm_w; BLE = 0; RED2 = 0; GRN2 = pwm_w; BLE2 = 0; RED3 = 0; GRN3 = pwm_w; BLE3 = 0; if(chbri && !sus) cl_sp_change(); }while(1); } else if(!MODE1 && MODE2 && !MODE3 && MODE4) //rin { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = pwm_n; GRN = pwm_n; BLE = 0; RED2 = pwm_n; GRN2 = pwm_n; BLE2 = 0; RED3 = pwm_n; GRN3 = pwm_n; BLE3 = 0; if(chbri && !sus) cl_sp_change(); }while(1); } else if(MODE1 && !MODE2 && !MODE3 && MODE4) //maki { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = pwm_w; GRN = 0; BLE = 0; RED2 = pwm_w; GRN2 = 0; BLE2 = 0; RED3 = pwm_w; GRN3 = 0; BLE3 = 0; if(chbri && !sus) cl_sp_change(); }while(1); } else if(!MODE1 && !MODE2 && !MODE3 && MODE4) //nico { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = pwm_w; GRN = 0; BLE = pwm_nn; RED2 = pwm_w; GRN2 = 0; BLE2 = pwm_nn; RED3 = pwm_w; GRN3 = 0; BLE3 = pwm_nn; if(chbri && !sus) cl_sp_change(); }while(1); } else if(MODE1 && MODE2 && MODE3 && !MODE4) //eli { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = 0; GRN = pwm_n; BLE = pwm_n; RED2 = 0; GRN2 = pwm_n; BLE2 = pwm_n; RED3 = 0; GRN3 = pwm_n; BLE3 = pwm_n; if(chbri && !sus) cl_sp_change(); }while(1); } else if(!MODE1 && MODE2 && MODE3 && !MODE4) //nozomi { ptn_bgn = 1; ptn_end = 1; op_sus2(); do { if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus2(); #endif RED = pwm_n; GRN = 0; BLE = pwm_n; RED2 = pwm_n; GRN2 = 0; BLE2 = pwm_n; RED3 = pwm_n; GRN3 = 0; BLE3 = pwm_n; if(chbri && !sus) cl_sp_change(); }while(1); } else if(!MODE1 && !MODE2 && MODE3 && !MODE4) //grade { ptn_bgn = 1; ptn_end = 9; do { if(reset) goto start_flush; #ifdef SUS if(!SUS) { op_sus3(); if(alt && !sus) { if(ptn <= 3) ptn_bgn = 1, ptn_end = 3; else if(ptn <= 6) ptn_bgn = 4, ptn_end = 6; else ptn_bgn = 7, ptn_end = 9; } else if(!alt && !sus) { ptn_bgn = 1, ptn_end = 9; } } #endif if(ch) { ch = 0; switch(ptn) { case 1: //2nd RED = pwm_w, RED2 = pwm_n, RED3 = 0; GRN = pwm_nn, GRN2 = pwm_n, GRN3 = 0; BLE = 0, BLE2 = pwm_n, BLE3 = pwm_w; break; case 2: //2ndi RED3 = pwm_w, RED = pwm_n, RED2 = 0; GRN3 = pwm_nn, GRN = pwm_n, GRN2 = 0; BLE3 = 0, BLE = pwm_n, BLE2 = pwm_w; break; case 3: //2nd RED2 = pwm_w, RED3 = pwm_n, RED = 0; GRN2 = pwm_nn, GRN3 = pwm_n, GRN = 0; BLE2 = 0, BLE3 = pwm_n, BLE = pwm_w; break; case 4: //1st RED = 0, RED2 = pwm_n, RED3 = pwm_w; GRN = pwm_w, GRN2 = pwm_n, GRN3 = 0; BLE = 0, BLE2 = 0, BLE3 = 0; break; case 5: //1st RED3 = 0, RED = pwm_n, RED2 = pwm_w; GRN3 = pwm_w, GRN = pwm_n, GRN2 = 0; BLE3 = 0, BLE = 0, BLE2 = 0; break; case 6: //1st RED2 = 0, RED3 = pwm_n, RED = pwm_w; GRN2 = pwm_w, GRN3 = pwm_n, GRN = 0; BLE2 = 0, BLE3 = 0, BLE = 0; break; case 7: //3rd RED = pwm_w, RED2 = 0, RED3 = pwm_n; GRN = 0, GRN2 = pwm_n, GRN3 = 0; BLE = pwm_nn, BLE2 = pwm_n, BLE3 = pwm_n; break; case 8: //3rd RED3 = pwm_w, RED = 0, RED2 = pwm_n; GRN3 = 0, GRN = pwm_n, GRN2 = 0; BLE3 = pwm_nn, BLE = pwm_n, BLE2 = pwm_n; break; case 9: //3rd RED2 = pwm_w, RED3 = 0, RED = pwm_n; GRN2 = 0, GRN3 = pwm_n, GRN = 0; BLE2 = pwm_nn, BLE3 = pwm_n, BLE = pwm_n; break; } } if(chbri && !sus) cl_sp_change(); } while(1); } else if(MODE1 && MODE2 && !MODE3 && !MODE4) //unit { ptn_bgn = 1; ptn_end = 9; do { if(reset) goto start_flush; #ifdef SUS if(!SUS) { op_sus3(); if(alt && !sus) { if(ptn <= 3) ptn_bgn = 1 , ptn_end = 3; else if(ptn <= 6) ptn_bgn = 4, ptn_end = 6; else ptn_bgn = 7, ptn_end = 9; } else if(!alt && !sus) { ptn_bgn = 1, ptn_end = 9; } } #endif if(ch) { ch = 0; switch(ptn) { case 1: //prin RED = 0, RED2 = pwm_n, RED3 = pwm_w; GRN = pwm_w, GRN2 = pwm_n, GRN3 = pwm_nn; BLE = 0, BLE2 = pwm_n, BLE3 = 0; break; case 2: //prin RED3 = 0, RED = pwm_n, RED2 = pwm_w; GRN3 = pwm_w, GRN = pwm_n, GRN2 = pwm_nn; BLE3 = 0, BLE = pwm_n, BLE2 = 0; break; case 3: //prin RED2 = 0, RED3 = pwm_n, RED = pwm_w; GRN2 = pwm_w, GRN3 = pwm_n, GRN = pwm_nn; BLE2 = 0, BLE3 = pwm_n, BLE = 0; break; case 4: //bibi RED = pwm_w, RED2 = 0, RED3 = pwm_w; GRN = 0, GRN2 = pwm_n, GRN3 = 0; BLE = pwm_nn, BLE2 = pwm_n, BLE3 = 0; break; case 5: //bibi RED3 = pwm_w, RED = 0, RED2 = pwm_w; GRN3 = 0, GRN = pwm_n, GRN2 = 0; BLE3 = pwm_nn, BLE = pwm_n, BLE2 = 0; break; case 6: //bibi RED2 = pwm_w, RED3 = 0, RED = pwm_w; GRN2 = 0, GRN3 = pwm_n, GRN = 0; BLE2 = pwm_nn, BLE3 = pwm_n, BLE = 0; break; case 7: //lily RED = pwm_n, RED2 = pwm_n, RED3 = 0; GRN = 0, GRN2 = pwm_n, GRN3 = 0; BLE = pwm_n, BLE2 = 0, BLE3 = pwm_w; break; case 8: //lily RED3 = pwm_n, RED = pwm_n, RED2 = 0; GRN3 = 0, GRN = pwm_n, GRN2 = 0; BLE3 = pwm_n, BLE = 0, BLE2 = pwm_w; break; case 9: //lily RED2 = pwm_n, RED3 = pwm_n, RED = 0; GRN2 = 0, GRN3 = pwm_n, GRN = 0; BLE2 = pwm_n, BLE3 = 0, BLE = pwm_w; break; } } if(chbri && !sus) cl_sp_change(); } while(1); } else if(!MODE1 && MODE2 && !MODE3 && !MODE4) //all { ptn_bgn = 1; ptn_end = 9; do{ if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus(); #endif if(ch) { ch = 0; switch(ptn) { case 1: //Honoka RED = pwm_w; RED2 = pwm_w; RED3 = pwm_w; GRN = pwm_nn;GRN2 = pwm_nn;GRN3 = pwm_nn; BLE = 0; BLE2 = 0; BLE3 = 0; break; case 3: //Kotori RED = pwm_n; RED2 = pwm_n; RED3 = pwm_n; GRN = pwm_n; GRN2 = pwm_n; GRN3 = pwm_n; BLE = pwm_n; BLE2 = pwm_n; BLE3 = pwm_n; break; case 4: //Umi RED = 0; RED2 = 0; RED3 = 0; GRN = 0; GRN2 = 0; GRN3 = 0; BLE = pwm_w; BLE2 = pwm_w; BLE3 = pwm_w; break; case 8: //Hanayo RED = 0; RED2 = 0; RED3 = 0; GRN = pwm_w; GRN2 = pwm_w; GRN3 = pwm_w; BLE = 0; BLE2 = 0; BLE3 = 0; break; case 5: //Rin RED = pwm_n, RED2 = pwm_n; RED3 = pwm_n; GRN = pwm_n, GRN2 = pwm_n; GRN3 = pwm_n; BLE = 0, BLE2 = 0; BLE3 = 0; break; case 6: //Maki RED = pwm_w, RED2 = pwm_w, RED3 = pwm_w; GRN = 0, GRN2 = 0, GRN3 = 0; BLE = 0, BLE2 = 0, BLE3 = 0; break; case 9: //Nico RED = pwm_w, RED2 = pwm_w, RED3 = pwm_w; GRN = 0, GRN2 = 0, GRN3 = 0; BLE = pwm_nn, BLE2 = pwm_nn, BLE3 = pwm_nn; break; case 2: //Eli RED = 0, RED2 = 0, RED3 = 0; GRN = pwm_n, GRN2 = pwm_n, GRN3 = pwm_n; BLE = pwm_n, BLE2 = pwm_n, BLE3 = pwm_n; break; case 7: //Nozomi RED = pwm_n, RED2 = pwm_n, RED3 = pwm_n; GRN = 0, GRN2 = 0, GRN3 = 0; BLE = pwm_n, BLE2 = pwm_n, BLE3 = pwm_n; break; } } if(chbri && !sus) cl_sp_change(); } while(1); } else if(MODE1 && !MODE2 && !MODE3 && !MODE4) //all start flush { ptn_bgn = 1; ptn_end = 27; do{ if(reset) goto start_flush; #ifdef SUS if(!SUS) op_sus(); #endif if(ch) { ch = 0; switch(ptn) { case 3: //Honoka RED3 = pwm_w; GRN3 = pwm_nn; BLE3 = 0; case 2: RED2 = pwm_w; GRN2 = pwm_nn; BLE2 = 0; case 1: RED = pwm_w; GRN = pwm_nn; BLE = 0; break; case 6: //Kotori RED3 = pwm_n; GRN3 = pwm_n; BLE3 = pwm_n; case 5: RED2 = pwm_n; GRN2 = pwm_n; BLE2 = pwm_n; case 4: RED = pwm_n; GRN = pwm_n; BLE = pwm_n; break; case 9: //Umi RED3 = 0; GRN3 = 0; BLE3 = pwm_w; case 8: RED2 = 0; GRN2 = 0; BLE2 = pwm_w; case 7: RED = 0; GRN = 0; BLE = pwm_w; break; case 12: //Hanayo RED3 = 0; GRN3 = pwm_w; BLE3 = 0; case 11: RED2 = 0; GRN2 = pwm_w; BLE2 = 0; case 10: RED = 0; GRN = pwm_w; BLE = 0; break; case 15: //Rin RED3 = pwm_n; GRN3 = pwm_n; BLE3 = 0; case 14: RED2 = pwm_n; GRN2 = pwm_n; BLE2 = 0; case 13: RED = pwm_n; GRN = pwm_n; BLE = 0; break; case 18: //Maki RED3 = pwm_w; GRN3 = 0; BLE3 = 0; case 17: RED2 = pwm_w; GRN2 = 0; BLE2 = 0; case 16: RED = pwm_w; GRN = 0; BLE = 0; break; case 21: //Nico RED3 = pwm_w; GRN3 = 0; BLE3 = pwm_nn; case 20: RED2 = pwm_w; GRN2 = 0; BLE2 = pwm_nn; case 19: RED = pwm_w; GRN = 0; BLE = pwm_nn; break; case 24: //Eli RED3 = 0; GRN3 = pwm_n; BLE3 = pwm_n; case 23: RED2 = 0; GRN2 = pwm_n; BLE2 = pwm_n; case 22: RED = 0; GRN = pwm_n; BLE = pwm_n; break; case 27: //Nozomi RED3 = pwm_n; GRN3 = 0; BLE3 = pwm_w; case 26: RED2 = pwm_n; GRN2 = 0; BLE2 = pwm_w; case 25: RED = pwm_n; GRN = 0; BLE = pwm_w; break; } } if(chbri && !sus) cl_sp_change(); } while(1); } else do { if(reset) goto start_flush; } while(1); } static void interrupt isr(void) { if(INTCONbits.T0IF == 1) { INTCONbits.T0IF = 0; ch = 1; if(bri2 == 0) { pwm_nn=0, pwm_n=0, pwm_wn=0, pwm_w=0; TMR0 = -pwm_c; cnt++; if(cnt == spd) cnt = 0, chbri = 1; } else { if(pwm_w && pwm_n && pwm_wn && pwm_nn) { pwm_nn = 0; TMR0 = -bri2; } else if(pwm_w && pwm_wn && pwm_n && !pwm_nn) { pwm_n = 0; TMR0 = -bri2; } else if(pwm_w && pwm_wn && !pwm_n && !pwm_nn) { pwm_wn = 0; TMR0 = -bri2; } else if(pwm_w && !pwm_wn && !pwm_n && !pwm_nn) { pwm_w = 0; TMR0 = -(pwm_c - bri2 * 4); } else if(!pwm_w && !pwm_wn && !pwm_n && !pwm_nn) { pwm_w = 1, pwm_wn = 1, pwm_n = 1, pwm_nn = 1; TMR0 = - bri2; cnt++; if(cnt == spd) cnt = 0, chbri = 1; if(trg) { sus_cnt--; if(sus_cnt < 1) { trg = 0; sus_cnt = 5; } } } } } //Interruption for PWM END //Interruption when reset SW in pushed if(INTCONbits.RABIF) { tmp1 = PORTB; INTCONbits.RABIF = 0; reset = 1; } }