山本ワールド
タクトスイッチライブラリ Version 1.00
概要
タクトスイッチが押されているか離されているか、変化を検出するライブラリである。
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 ");
}
}
*/
Copyright (C) 2012 山本ワールド All Rights Reserved.