閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);) 【目次】(項目をクリックすると、そこに飛べます) #contents ~ *トグルスイッチ [#w5775228] トグルスイッチ(toggle switch)とは、スイッチを押すたびにオン(ON)、オフ(OFF)の 状態が入れ替わる動作をするスイッチの事です。 トグルスイッチ機能を実現する為の定石プログラム記法がありますので紹介します。 07/02/11 HC8のプログラムを追加しました。 2013/10/06 |&attachref(P1010293.JPG,zoom,150x150,button){新しい写真添付};|&attachref(16F628Aピンデザイン画像.jpg,zoom,150x150,button){新しい写真添付};| **MikroCのプログラム [#a1a518ca] /** * トグル スイッチ * (スイッチを押すたびにON、OFFを切り替え) * * PIC16F628A 内蔵4MHz * LED: RB3 スイッチ: RB4 * 電源:乾電池3本(4.5V) * * Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON _WDT_OFF * _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT * MikroC 2.1 */ void main() { //使用変数の定義 unsigned short int oldstate; PORTB = 0b00000000; //PORTBの中身をきれいにする TRISB = 0b00010000; //RB4を1:入力、他は0:出力に設定 OPTION_REG.NOT_RBPU = 0; //PORTBを内部プルアップ //LED初期点灯状態の設定 PORTB.F3 = 1; //RB3 ON oldstate = 0; do { if(Button(&PORTB, 4, 1, 1)) oldstate = 1; if(oldstate && Button(&PORTB, 4, 1, 0)) { //RB4スイッチ状態の判別 PORTB.F3 = ~PORTB.F3; //RB3状態の反転 oldstate = 0; } }while(1); } Button関数 |構文|unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);| |戻り値|0〜255の整数を返します。| |説明|・この関数はボタンのチャタリング現象の影響を除去します。 ・*port:ボタンが設置したポート情報、pin:ボタンを設置したピン番号(0..7)、time:チャタリング除去時間(ミリ秒)、active_state:0か1を設定する。ボタンがアクティブか?どうか?の判別設定?parameter active_state can be either 0 or 1, and it determines if the button is active upon logical zero or logical one.| |要求事項|ボタンピンは「入力」に設定されていなければならない。| ★この情報は役に立ちましたか? #vote(はい[9],普通[4],いいえ[5]) #comment_nospam ~ **XC8のプログラム [#s1833dee] |&attachref(TS3V0004.JPG,zoom,200x200,button){新しい写真添付};|&attachref(16F628Aピンデザイン画像.jpg,zoom,200x200,button){新しい写真添付};| 2013/10/06追加(スイッチのチャタリング防止ロジック入り) /* * File: toggle_main.c * Author: 管理人 * * Created on 2013/10/05, 6:04 */ #include <stdio.h> #include <stdlib.h> #include <xc.h> #pragma config BOREN = OFF, CPD = OFF, FOSC = INTOSCIO, MCLRE = OFF, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = ON #define _XTAL_FREQ 4000000 /*トグルスイッチ(スイッチのチャタリング防止手法の確認) * PIC16F628A XC8 v1.20 * LED:RA1,RA2に接続 * Switch:RB4に接続 */ int main(int argc, char** argv) { //利用変数の定義 char swMode; //スイッチが押された判断フラグ 1:押された 0:押されていない char detect; //スイッチPORTの状態発見フラグ 1:押されたかも? 0:押されていない PORTA = 0b00000000; //PORTAの中身をきれいにする PORTB = 0b00000000; //PORTBの中身をきれいにする TRISA = 0b00110000; //PORTAのRA5,RA4は1:入力に、他は0:出力に設定 TRISB = 0b00011000; //PORTBのRB4,RB3は1:入力に、他は0:出力に設定 CMCON = 0b00000111; //PORTAのコンパレータ機能は使用しない OPTION_REGbits.nRBPU = 0; //0:PORTBの内部ウィークプルアップを使用 PORTAbits.RA2 = 1; //パワーオンを示すLED点灯 //変数の初期化 swMode = 0; detect = 0; while(1){ //2013/10/05 20:00正常稼働確認。 if(swMode == 0) { //スイッチが押されていない状態なら if(PORTBbits.RB4 == 0) { //RB4スイッチdownなら detect = 1; //スイッチが押されたかも?フラグを1に } __delay_ms(10); //10ミリ秒待つ if((PORTBbits.RB4 == 0) && (detect == 1)) { //スイッチ状態がdownなら swMode = 1; //スイッチが押された判断フラグを1に if(PORTAbits.RA1 == 1) { //RA1LEDが点灯状態なら PORTAbits.RA1 = 0; //RA1LEDを消灯 } else { //RA1LEDが消灯状態なら PORTAbits.RA1 = 1; //RA1LEDを点灯 } } } if(PORTBbits.RB4 == 1) { //RB4スイッチがup状態なら swMode = 0; //スイッチが押された判断フラグをクリアー detect = 0; //スイッチが押されたかも?フラグをクリアー } } return (EXIT_SUCCESS); } 【参考】スイッチのチャタリング現象で動作が不安定なトグルスイッチのプログラム #include <stdio.h> #include <stdlib.h> #include <xc.h> #pragma config BOREN = OFF, CPD = OFF, FOSC = INTOSCIO, MCLRE = OFF, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = ON /*トグルスイッチ(スイッチのチャタリング現象でスイッチ動作不安定のプログラム) * PIC16F628A XC8 v1.20 * LED:RA1,RA2に接続 * Switch:RB4に接続 */ int main(int argc, char** argv) { PORTA = 0b00000000; //PORTAの中身をきれいにする PORTB = 0b00000000; //PORTBの中身をきれいにする TRISA = 0b00110000; //PORTAのRA5,RA4は1:入力に、他は0:出力に設定 TRISB = 0b00011000; //PORTBのRB4,RB3は1:入力に、他は0:出力に設定 CMCON = 0b00000111; //PORTAのコンパレータ機能は使用しない OPTION_REGbits.nRBPU = 0; //0:PORTBの内部ウィークプルアップを使用 PORTAbits.RA2 = 1; //パワーオンを示すLED点灯 while(1){ if(PORTBbits.RB4 == 0) { if(PORTAbits.RA1 == 1) { PORTAbits.RA1 = 0; } else { PORTAbits.RA1 = 1; } } } return (EXIT_SUCCESS); } ~ 【参考としたページ】 モメンタリースイッチによるLED ON/OFF http://www.ys-labo.com/pic/pic%20chips/pic%20chips%20contets/060406a%20Led%20MomSw%20OnOff.html ~ ★この情報は役に立ちましたか? #vote(はい[0],普通[0],いいえ[0]) #comment_nospam