//************************************ //16F88 HI-TECH C v.9.83 //MPG切り替えプログラム //   軸選択入力 RA2 // 出力 RB4(SS-2-2),RB5(SS-2-3),RB6(SS-2-4),RB7(SS-2-5) //   速度入力   RA3 //     出力 RB1(SS-2-6),RB2(SS-2-7),RB3(SS-2-8) // // //************************************ #define _LEGACY_HEADERS #include "pic.h" #include "stdlib.h" #include "lcd.h" #define _XTAL_FREQ 8000000 static void interrupt isr(void); #define swON 1; #define swOFF 0; unsigned int jikuSentaku; unsigned int sokudoSentaku; unsigned int swCount; unsigned int swCount1; unsigned int swCount2; unsigned int swCount3; __CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO); void main(){ OSCCON = 0x70;// 内蔵OSC 8MHz CMCON=0x7;//コンパレーターは使わない ANSEL = 0b00000000;// 全部デジタル PORTA = 0x00; PORTB = 0x00; TRISA = 0b00101111;// RA2-RA3は−−入力 RA5は入力専用 TRISB = 0b00000000;// RBは全部出力 //PORTA = 0b00000000;// すべてLOW //PORTB = 0b00000000;// すべてLOW //PORTB=0x00; //PORTA = 0b00000000;// すべてLOW //PORTB = 0b11111111;// すべてHIGH //lcd_init();//SD1602の初期化 OPTION = 0b000000000;//プリスケラ-を2 //初期値設定 jikuSentaku=1; sokudoSentaku=1; RB4=swON; //RB5=swOFF; //RB6=swOFF; //RB7=swOFF; RB1=swON; //RB2=swOFF; //RB3=swOFF; swCount=0; swCount1=0; swCount2=0; swCount3=0; __delay_ms(1000); TMR0=157; TMR0IF = 0;//タイマー0割り込みフラグクリア TMR0IE = 1;//タイマー0割り込み発生許可 //INTEDG = 0;// 立ち下がりで割り込み //INT0IF = 0;// 外部割込みフラグをクリア //INT0IE = 1;// 外部割込みの許可 GIE= 1;//割り込み全体の許可 while (1){ } } static void interrupt isr(void){ //タイマー0割り込み処理(キー入力チェック) if(TMR0IF==1){ TMR0=157; //軸選択スイッチの判定 //右方向処理 if(RA0==1){swCount++;}//10msec毎にRB2ポートがチェックされ”1”なら加算されてる else{ swCount = 0;}//RA2が”1”でないならswCountはリセットされる if(swCount == 8){ //軸選択のスイッチ入る if(jikuSentaku<6){jikuSentaku++; } switch(jikuSentaku){ case 1: RB4=swON; RB5=swOFF; break; case 2: RB5=swON; RB4=swOFF; RB6=swOFF; break; case 3: RB6=swON; RB5=swOFF; RB7=swOFF; break; case 4: RB7=swON; RB6=swOFF; break; case 5: RB6=swON; RB5=swOFF; RB7=swOFF; break; case 6: RB5=swON; RB6=swOFF; break; } if(jikuSentaku==6){jikuSentaku=0; } } if(swCount >= 10){swCount = 9;} //左方向処理 if(RA1==1){swCount1++;}//10msec毎にRB2ポートがチェックされ”1”なら加算されてる else{ swCount1 = 0;}//RA2が”1”でないならswCountはリセットされる if(swCount1 == 8){ //軸選択のスイッチ入る if(jikuSentaku==0){jikuSentaku=2; } if(jikuSentaku>1){jikuSentaku--; } switch(jikuSentaku){ case 1: RB4=swON; RB5=swOFF; break; case 2: RB5=swON; RB4=swOFF; RB6=swOFF; break; case 3: RB6=swON; RB5=swOFF; RB7=swOFF; break; case 4: RB7=swON; RB6=swOFF; break; case 5: RB6=swON; RB5=swOFF; RB7=swOFF; break; case 6: RB5=swON; RB6=swOFF; break; } //if(jikuSentaku==1){jikuSentaku=6; //} } if(swCount1 >= 10){swCount = 9;} //速度選択スイッチの判定 //右方向処理 if(RA2==1){swCount2++;}//10msec毎にRB1ポートがチェックされ”1”なら加算されてる else{ swCount2 = 1;}//RA3が”1”でないならswCount1はリセットされる if(swCount2 == 8){ if(sokudoSentaku<4){sokudoSentaku++ ; } switch(sokudoSentaku){ case 1: RB1=swON; RB2=swOFF; break; case 2: RB2=swON; RB1=swOFF; RB3=swOFF; break; case 3: RB3=swON; RB2=swOFF; RB1=swOFF; break; case 4: RB2=swON; RB3=swOFF; break; } if(sokudoSentaku==4){sokudoSentaku=0; } } if(swCount2 >= 10){swCount1 = 9; } //左方向処理 if(RA3==1){swCount3++;}//10msec毎にRB1ポートがチェックされ”1”なら加算されてる else{ swCount3 = 1;}//RA3が”1”でないならswCount1はリセットされる if(swCount3 == 8){ if(sokudoSentaku==0){sokudoSentaku=1; } if(sokudoSentaku>1){sokudoSentaku-- ; } switch(sokudoSentaku){ case 1: RB1=swON; RB2=swOFF; break; case 2: RB2=swON; RB1=swOFF; RB3=swOFF; break; case 3: RB3=swON; RB2=swOFF; RB1=swOFF; break; case 4: RB2=swON; RB3=swOFF; break; } //if(sokudoSentaku==4){sokudoSentaku=0; //} } if(swCount3 >= 10){swCount1 = 9; } } TMR0IF=0; }