//************************************ //16F88 HI-TECH C v.9.83 // //MPG入力ー−−−入力RB0(外部割り込み) // //Q入力------------------RA3 //Qインバート入力--------RA2 // //LED制御−−−−RA0 RA1 RA6 RA7 // RB4〜RB7 // //ルーレットMPGテスター //************************************ #define _LEGACY_HEADERS #include "pic.h" #include "stdlib.h" //#include "lcd.h" #define _XTAL_FREQ 8000000 #define Led_On 0 #define Led_Off 1 #define cw_On 1 #define ccw_On 1 #define LED1 RA1 #define LED2 RA0 #define LED3 RA7 #define LED4 RA6 #define LED5 RB7 #define LED6 RB6 #define LED7 RB5 #define LED8 RB4 static void interrupt isr(void); //unsigned int sensor_On_Off; //unsigned int start_stop; //unsigned int ccw_on; //unsigned int swCount; unsigned int tCount; unsigned int mpgCount; unsigned int cw; unsigned int ccw; __CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO); void main(){ OSCCON = 0x70;// 内蔵OSC 8MHz CMCON=0x7; //コンパレーターは使わない ANSEL = 0b00000000;// 全部デジタル TRISA = 0b00100000;// RA5は入力(以外出力) TRISB = 0b00001101;// RB0−MPG入力 RB3-Q RB2-Qインバート PORTA = 0b11111111;// すべてHIGHT PORTB = 0b11111111;// すべてHIGHT //lcd_init();//SD1602の初期化 OPTION = 0b000000010;//プリスケラ-を8 //初期値設定 //start_stop=0; //swCount=0; //ccw_on=0; //cw=0; mpgCount=1; tCount=0;//時間計測用変数 LED1=Led_On; __delay_ms(1500); LED1=Led_Off; TMR0=0;//約1024μsecごとに割込 TMR0IF = 0;//タイマー0割り込みフラグクリア TMR0IE = 1;//タイマー0割り込み発生許可 INTEDG = 0;// 立上がりで割り込み INT0IF = 0;// 外部割込みフラグをクリア INT0IE = 1;// 外部割込みの許可 GIE= 1;//割り込み全体の許可 while (1){ } } static void interrupt isr(void){ // 外部割り込みMPG回転のチェック if(INT0IF==1){ tCount=0;//カウント開始 TMR0IE = 0;//タイマー0割り込み発生禁止 if(RB3==cw_On){ mpgCount++; if(mpgCount==9){ mpgCount=1; } } if(RB2==ccw_On){ mpgCount--; if(mpgCount==0){ mpgCount=8; } } switch(mpgCount){ case 1: LED8=Led_Off; LED1=Led_On; LED2=Led_Off; break; case 2: LED1=Led_Off; LED2=Led_On; LED3=Led_Off; break; case 3: LED2=Led_Off; LED3=Led_On; LED4=Led_Off; break; case 4: LED3=Led_Off; LED4=Led_On; LED5=Led_Off; break; case 5: LED4=Led_Off; LED5=Led_On; LED6=Led_Off; break; case 6: LED5=Led_Off; LED6=Led_On; LED7=Led_Off; break; case 7: LED6=Led_Off; LED7=Led_On; LED8=Led_Off; break; case 8: LED7=Led_Off; LED8=Led_On; LED1=Led_Off; break; } INT0IF=0;//外部割り込みフラグクリアー TMR0IE=1;//TIMER0割込許可 } //パルスが約1.5秒ないときは、LEDを消す if(TMR0IF==1){ tCount++; if( tCount>1500){ LED1=Led_Off;//念のためLEDを全部消灯 LED2=Led_Off; LED3=Led_Off; LED4=Led_Off; LED5=Led_Off; LED6=Led_Off; LED7=Led_Off; LED8=Led_Off; tCount=0; } TMR0IF = 0;//タイマー0割り込みフラグクリア } }