タクトスイッチライブラリ Version 1.00

icon 項目のみ表示/展開表示の切り替え

概要

タクトスイッチが押されているか離されているか、変化を検出するライブラリである。
1つの入力ポートに対応し最大8個のスイッチをサポートします。
使用する入力ポートはsw.hのマクロで変更できます。
SW_ADSは使用するポート、SW_MASKはスイッチとして使用するビットを1に設定する。
チャタリングの検出はソフトウェアディレイで対応しているためクロック周波数が変更された場合はディレイの調整が必要
使用する場合はsw.hをインクルードしsw.cをプロジェクトに追加してください。
ライブラリの関数をコールする前に使用するポートをデジタル入力に設定してください。

プログラムの説明

ソースファイル

以下のファイルで構成されている
sw.c   ・・・ タクトスイッチライブラリ Version 1.00
sw.h   ・・・ タクトスイッチライブラリ Version 1.00

サブルーチン

以下のサブルーチンをサポート

sw_in

スイッチの状態を取得(チャタリング除去) 0:押 1:離

sw_trg_in

スイッチの状態と変化を取得(チャタリング除去) 0:押 1:離 0:変化なし 1:変化あり

ソースコード

sw.h

/*
 * タクトスイッチライブラリ Version 1.00
 * File:        sw.c
 * Target:      PIC18F14K50 48Mhz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/09/29 15:00
*/

#ifndef SW_H
#define SW_H

#define SW_MASK     0b00000011
#define SW_SET      (~(SW_MASK))
#define SW_ADS      PORTA
#define SW0_MASK    0b00000001
#define SW1_MASK    0b00000010
#define SW0_SET     (~(SW0_MASK))
#define SW1_SET     (~(SW1_MASK))

#define SW0         PORTAbits.RA0
#define SW1         PORTAbits.RA1

//  スイッチの状態を取得(チャタリング除去) 0:押 1:離
unsigned char sw_in(void);

//  スイッチの状態と変化を取得(チャタリング除去)  0:押 1:離 0:変化なし 1:変化あり
void sw_trg_in(unsigned char* sw,unsigned char* trg);

#endif  /* SW_H */

sw.c

/*
 * タクトスイッチライブラリ Version 1.00
 * File:        sw.c
 * Target:      PIC18F14K50 48Mhz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2013/09/29 15:00
*/

#include <p18f14k50.h>
#include <plib\delays.h>
#include "sw.h" //  スイッチのアドレス・ビット定義

static unsigned char sw_2before=SW_MASK,sw_before,sw_last,sw_trg;

//  スイッチの状態を取得(チャタリング除去) 0:押 1:離

unsigned char sw_in(void){
    for(;;){
        sw_before=SW_ADS & SW_MASK;
        Delay1KTCYx( 120);  //  10ms*(48MHz/4)= 120,000
        sw_last=SW_ADS & SW_MASK;
        if((sw_before ^ sw_last)==0) // 前回と変化がない場合チャタリングはない
            break;
        sw_before=sw_last;
        Delay1KTCYx( 120);  //  10ms*(48MHz/4)= 120,000
    }
    return sw_last;
}

//  スイッチの状態と変化を取得(チャタリング除去)  0:押 1:離 0:変化なし 1:変化あり

void sw_trg_in(unsigned char* sw,unsigned char* trg){
    unsigned char sw2;
    sw_in();
    sw_trg=sw_last ^ sw_2before;
    sw2=sw_2before;
    sw_2before=sw_last;
    *sw=sw_last;
    *trg=sw_trg;
}

//  使用例

/*
void sw_info(char* buf,unsigned char sw,unsigned char trg,unsigned char mask){
    if((sw & mask)==0){
        if(trg & mask)
            strcpy(buf,"Off->On");
        else
            strcpy(buf,"On     ");
    }else{
        if(trg & mask)
            strcpy(buf,"On->Off");
        else
            strcpy(buf,"Off    ");
    }
}

*/