//********************************************************************** #define LED_A GPIO.F0 #define LED_B GPIO.F1 #define LED_C GPIO.F4 #define LED_D GPIO.F5 #define SW GPIO.F3 #define ON 0 #define OFF 1 //********************************************************************** static unsigned int seed; void interrupt(){ if (INTCON.T0IF == 1) { INTCON.T0IF = 0; // seed++; } } //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void diceChange() { int tmp; // tmp = rand(); tmp = (((double)tmp) / 32768.0) * 6.0; // switch (tmp + 1) { case 1: LED_A = ON; LED_B = OFF; LED_C = OFF; LED_D = OFF; break; case 2: LED_A = OFF; LED_B = ON; LED_C = OFF; LED_D = OFF; break; case 3: LED_A = ON; LED_B = ON; LED_C = OFF; LED_D = OFF; break; case 4: LED_A = OFF; LED_B = ON; LED_C = ON; LED_D = OFF; break; case 5: LED_A = ON; LED_B = ON; LED_C = ON; LED_D = OFF; break; case 6: LED_A = OFF; LED_B = ON; LED_C = ON; LED_D = ON; break; } } //********************************************************************** void main() { char cnt; // OSCCON = 0b01111000; // クロックは8Mhz CMCON0 = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000000; // A/D変換を使用しない。 TRISIO = 0b00001000; //TIMER0の設定 INTCON.T0IE = 1; INTCON.T0IF = 0; OPTION_REG.T0CS = 0; OPTION_REG.PSA = 0; OPTION_REG.PS0 = 0; OPTION_REG.PS1 = 0; OPTION_REG.PS2 = 0; // Pwm_Init(1200); Pwm_Change_DutyEx((PR2 * 4) / 2); // LED_A = OFF; LED_B = OFF; LED_C = OFF; LED_D = OFF; // INTCON.PEIE = 1; // これ以降の処理で割り込みを許可する。 INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。 //スイッチが押されるまで、LEDの点滅を繰り返す。 while (SW == OFF) { LED_A = ON; LED_B = ON; LED_C = ON; LED_D = ON; Delay_ms(100); LED_A = OFF; LED_B = OFF; LED_C = OFF; LED_D = OFF; Delay_ms(100); } //スイッチが離されるのを待つ。 while (SW == ON) { Delay_ms(100); } //ブザー音を鳴らす。 Pwm_Start(); Delay_ms(200); Pwm_Stop(); //乱数の種をセットする。 srand(seed); // while (1) { //スイッチが押されるまで待つ。 if (SW == OFF) { Delay_ms(10); continue; } //サイコロの目を切り替える。 for (cnt = 0; cnt < 30; cnt++) { diceChange(); //ブザー音を鳴らす。 Pwm_Start(); Delay_ms(100); Pwm_Stop(); //可変型スリープ Vdelay_ms(50 + (cnt * 10)); } } } //**********************************************************************