このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/640
#  [1]C言語 
#  [2]本文 
#  以下のLED 7セグメント(4桁)を制御するプログラムを作成してください 
#  (1) 入力に+ キー1つをもち、1桁だけのカウンタを作成する。  
#   
#  (2) スイッチのチャタリング防止のために、20msec程度の間に1msec 
#      間隔で連続5回程度ON状態を検出したらONにする関数を追加する。 
#    
#  (3) スイッチのチャタリング防止の機能を拡張すると、長押しの動作の 
#       判定が可能になる。長押し(1秒以上)でカウンタが「ゼロ」になるように拡張する。 
#    
#  (4) 500msecの間に2回ONを検知したらダブルクリックである機能を追加 
#      する。ダブルクリックでは、自動的にカウントアップする動作を行うこと。 
#      もう一度ダブルクリックで停止、ダブルクリックで再開、長押しでリセットする。 
#    
#  (5) 実験1〜4で実現した機能をさらに活用して、4桁のカウンタを作る。 
#     このとき長押し、ダブルクリックの機能も残す。 
#    4桁の7セグを直接制御するため、  ダイナミック点灯の考え方を使って4桁表示を行う。 
#    7セグを制御する7ポート(例:RBO〜6)と表示する桁を制御する4ポート 
#   (例:RAO〜3)を利用する。 
#    表示桁の切り替えを5msecで行い、そのタイミングでその桁に表示する数値を切り 
#   替える。 
#    
#  

チャタリング回路付きスイッチ(_状態) :-
        'スイッチのチャタリング防止のために、20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする'(_状態).

'スイッチのチャタリング防止のために、20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする' :-
        'スイッチのチャタリング防止のために、',
        '20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする'(_状態).

'スイッチのチャタリング防止のために、'.

'20msec程度の間に1msec 間隔で連続5回程度ON状態を検出したらONにする'(_状態) :-
        '20msec程度の間に'(_終了時刻),
        '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[],_状態),!.

'20msec程度の間に'(_終了時刻) :-
        現在の時刻を得る(_起動時刻),
        _終了時刻 is _起動時刻 + 20.

'1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,_,off) :-
        現在の時刻を得る(_現在の時刻),
        _現在の時刻 @>= _終了時刻,!.
'1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on,on,on,on,on],on) :-
        終了時刻が来るまで待つ(_終了時刻),!.
'1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on|L1],_状態) :-
        '1msec 間隔で',
        'ON状態を検出',
        '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on,on|L1],_状態),!.
'1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,_,_状態) :-
        '1msec 間隔で',
        'ON状態を検出',
        '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[on],_状態),!.
'1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,_,_状態) :-
        '1msec 間隔で連続5回程度ON状態を検出したらONにする'(_終了時刻,[off],_状態),!.

'1msec 間隔で' :-
        sleep(1).

終了時刻が来るまで待つ(_終了時刻) :-
        現在の時刻 @>= _終了時刻,!.
終了時刻が来るまで待つ(_終了時刻) :-
        '1msec 間隔で',
        終了時刻が来るまで待つ(_終了時刻).