//********************************************************************** #define LED1 GPIO.F4 #define LED2 GPIO.F5 #define SW GPIO.F3 #define ON 0 #define OFF 1 //********************************************************************** static unsigned char LED_cnt, LED1_cnt, LED2_cnt; void interrupt(){ if (INTCON.T0IF == 1) { INTCON.T0IF = 0; GPIO.F1 = ~GPIO.F1; // if ((LED_cnt <= LED1_cnt) && (LED1_cnt != 0)) LED1 = ON; else LED1 = OFF; // if ((LED_cnt <= LED2_cnt) && (LED2_cnt != 0)) LED2 = ON; else LED2 = OFF; // if (LED_cnt < 9) LED_cnt++; else LED_cnt = 0; } } //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void buzzer() { T2CON.T2CKPS0 = 0; T2CON.T2CKPS1 = 0; Pwm_Init(500); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); Delay_ms(100); Pwm_Stop(); // T2CON.T2CKPS0 = 0; T2CON.T2CKPS1 = 0; Pwm_Init(1000); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); Delay_ms(100); Pwm_Stop(); // T2CON.T2CKPS0 = 0; T2CON.T2CKPS1 = 0; Pwm_Init(2000); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); Delay_ms(100); Pwm_Stop(); // T2CON.T2CKPS0 = 0; T2CON.T2CKPS1 = 0; Pwm_Init(4000); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); Delay_ms(100); Pwm_Stop(); // T2CON.T2CKPS0 = 0; T2CON.T2CKPS1 = 0; Pwm_Init(8000); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Start(); Delay_ms(100); Pwm_Stop(); } //********************************************************************** void main() { unsigned int ad0, ad1, tmp; OSCCON = 0b01111000; // クロックは8Mhz CMCON0 = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000011; // AN1を使用する。 TRISIO = 0b00001011; // INTCON.T0IE = 1; INTCON.T0IF = 0; OPTION_REG.T0CS = 0; OPTION_REG.PSA = 1; OPTION_REG.PS0 = 0; OPTION_REG.PS1 = 0; OPTION_REG.PS2 = 0; // LED_cnt = 0; LED1_cnt = 0; LED2_cnt = 0; LED1 = OFF; LED2 = OFF; // INTCON.PEIE = 1; // これ以降の処理で割り込みを許可する。 INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。 // while (1) { ad0 = Adc_Read(0); // 太陽電池側 ad1 = Adc_Read(1); // ニッカド電池側 if (ad0 > ad1) { LED1_cnt = 0; LED2_cnt = 0; continue; } // tmp = rand(); LED1_cnt = (((double)tmp) / 32768.0) * 10.0; tmp = rand(); LED2_cnt = (((double)tmp) / 32768.0) * 10.0; Delay_ms(1000); LED1_cnt = 0; LED2_cnt = 0; if (SW == 0) buzzer(); Delay_ms(1000); } } //**********************************************************************