//************************************ //16F88 HI-TECH C v.9.83 //近接センサー−−−入力RB0 //スタート・ストップ−−−入力RB1 //リセット−−−−−−−入力RA1 //制御プログラム //************************************ #define _LEGACY_HEADERS #include "pic.h" #include "stdlib.h" #include "lcd.h" #define _XTAL_FREQ 8000000 static void interrupt isr(void); unsigned int sensor_On_Off; unsigned int start_stop; unsigned int ccw_on; unsigned int KeyOn; unsigned int KeyOn1; unsigned int swCount; unsigned int swCount1; __CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO); void main(){ OSCCON = 0x70;// 内蔵OSC 8MHz CMCON=0x7; ANSEL = 0b00000000;// 全部デジタル TRISA = 0b00000010;// RA1キー入力 TRISB = 0b00000011;// RB0センサー入力RB1スタートストップ入力 PORTA = 0b11111111;// すべてHIGHT PORTB = 0b11111111;// すべてHIGHT //lcd_init();//SD1602の初期化 OPTION = 0b000000000;//プリスケラ-を2 KeyOn=0; start_stop=0; swCount=0; TMR0=157; TMR0IF = 0;//タイマー0割り込みフラグクリア TMR0IE = 1;//タイマー0割り込み発生許可 INTEDG = 1;// 立ち上がりで割り込み INT0IF = 0;// 外部割込みフラグをクリア INT0IE = 1;// 外部割込みの許可 GIE= 1;//割り込み全体の許可 while (1){ //if(RA0==1){RB6=0;} //if(RA0==0){RB6=1;} //tmp = adconv();//AD変換の結果をtmpに代入 //itoa(str,tmp,10);//tmpをキャラクターに変換 //lcd_clear();//LCD表示クリア //lcd_goto(0);//カーソルを0行目の先頭に移動する //lcd_puts(str);//変換結果をLCDに表示 //lcd_puts("mv"); } } static void interrupt isr(void){ // 外部割り込み近接センサーチェック if(INT0IF==1){ //if(RB0==1){sensor_On_Off++;} //else{sensor_On_Off=0;} sensor_On_Off=1; switch(sensor_On_Off){ case 0: break; case 1: ccw_on=1; RB6=1;//モーター逆転信号on RB4=0;//逆転LED_ON break; } INT0IF=0;//外部割り込みフラグクリアー } //タイマー0割り込み処理(キー入力チェック) if(TMR0IF==1){ TMR0=157; //スタートストップキーチェック if(RB1==1){swCount++;}//10msec毎にRB1ポートがチェックされ”1”なら加算されてる else{ swCount = 0;}//RB1が”1”でないならswCountはリセットされる if(swCount == 8){ KeyOn==1;//8回連続でRB3が”0”の場合 switch(start_stop){ case 0: RB7=1;//モータ_ON RB5=0;//正転LED_ON KeyOn=0; start_stop=1; break; case 1: RB7=0;//モータ_OFF RB5=1;//正転LED_OFF KeyOn=0; start_stop=0; break; } } if(swCount >= 10){swCount = 9;} //リセットスイッチチェック if(RA1==1){swCount1++;}//10msec毎にRB1ポートがチェックされ”1”なら加算されてる else{ swCount1 = 0;}//RB1が”1”でないならswCountはリセットされる if(swCount1 == 8){ KeyOn1==1;//8回連続でRB3が”0”の場合 ccw_on=0; KeyOn1=0; RB6=0;//モーター逆転信号OFF RB4=1;//逆転LED_OFF RB3=0; } if(swCount1 >= 10){swCount1 = 9;} TMR0IF=0; } }