PIC12f629のGP3を入力に、GP0を出力に設定します
  CNT1  EQU       0x20  ;タイマーカウント1
  CNT2  EQU      0x21  ;タイマーカウント2
  CNT3       EQU    0x22  ;出力カウント
 
start
           clrf       CNT1
           clrf       CNT2
           clrf       CNT3
           bsf       GPIO,0
loop
           btfsc     GPIO,3
           goto      loop
           bcf        GPIO,0
           call        tim_30
           bsf         GPIO,0
           call        tim_30
           bcf        GPIO,0
           call        tim_30
           bsf         GPIO,0
           call        tim_30
           bcf        GPIO,0
           call        tim_30
           bsf         GPIO,0
           goto       start
tim_30
             省略
    END
このプログラムではloop以下の出力記述で同じものを3回繰り返しています。繰り返し記述はせいぜい10回が限度でしょう。50回、100回出力といった場合は記述が大変です。
Wレジスターに出力回数の3を代入して、あらかじめ設定しておいた出力カウンターに移動して値をコピーします。命令 decfszで3が0になるまで繰り返すプログラムは下記の様になります
start
           clrf       CNT1
           clrf       CNT2
           clrf       CNT3
           clrw
           bsf       GPIO,0
   movlw     d'3'
loop
           btfsc     GPIO,3
           goto      loop
           goto     loop2
loop2
           bcf        GPIO,0
           call        tim_30
           bsf         GPIO,0
           call        tim_30
           decfsz  CNT3,f
           goto       start
tim_30
             省略
start の movlw '3'の値を50にすれば50回、100すれば100回出力を繰り返します。ただしwレジスタに代入できる値は272までです。
 
このプログラムは1コイン複数クレジット出力に利用できます
 
loop
           btfsc     GPIO,3  の次に decfsz  CNT3,f を記述し ゼロになったら1パルス出力するというプログラムに書き換えると複数入力⇒1出力になります。
同じ回路で400円1クレジットが実現することになります。
start
           clrf       CNT1
           clrf       CNT2
           clrf       CNT3
           clrw
           bsf       GPIO,0
   movlw     d'4'
loop
           btfsc     GPIO,3
           goto      loop
   decfsz  CNT3,f
           goto     loop
           goto     loop2
loop2
           bcf        GPIO,0
           call        tim_30
           bsf         GPIO,0
           call        tim_30
           goto       start
tim_30
             省略
 
 
PIPICマイコンのプログラムを作成るとき、その記述には決まりがあります。
①書式
②命令
PICマイコンの命令は35個あります。
アミューズ仕様パチスロの制御では下記の命令がよく使われます
BSF    指定したレジスタのBITを1にセット
BCF    指定したレジスタのBITを0にセット
BTFSC    指定したレジスタのBITを調べ0ならば次の命令を実行せず一つ先に飛ぶ
BTFSS    指定したレジスタのBITを調べ1ならば次の命令を実行せず一つ先に飛ぶ 
CALL    指定したサブルーチンを呼び出す。
CLRF      指定したレジスタの内容をゼロクリア
DECFSZ    指定したレジスター1。 その結果が0なら次の命令を実行せず一つ先に飛ぶ
GOTO   指定したアドレスに無条件でジャンプ
MOVLW  Wレジスタに値を入れる 
MOVWF       Wレジスタの値を指定したレジスタにコピー
NOP    何もしない 
命令一覧表
 
 
 
 
③データー保存
メモ帳に記述しMPLABIDEを開いて拡張子.asmで保存します。
 
メモ帳で記述
 
MPLABIDEに拡張子asmで保存する。
 
 
 
 
行番号1~12
 このプログラムの表題と概要を表記しています。 行頭にコロン(;)があります。
 コロン(;)以下はコメント(説明)でプログラムデーターには反映されません。
行番号14・15
 
 PICマイコンのPIC12f629を使うという宣言です。
行番号17 
 コンフィグ設定 各設定を & でつなぎ一行で記述。
 __ config  ダブルアンダーバー(アンダーバーが2つ)コンフィグ
 _CP_ON コードプロテクトをOFF
 _CPD_ON データー部分のプロテクトをON
 _BORDEN_OFF ブロンアウト(電源電圧低下)によるリセット禁止
 _MCLRE_OFF MCLRピンをし遊せずI/Oとして使用
 _WDT_OFF ウォッチドックタイマーを使用しない。
 _PWRTE_OFF パワーアップタイマーを仕様する。
         プログラムの起動は電源投入後安定したのちに開始。
 _INTRC_OSC_NOCLKOUT 
        内臓クッロックを使用し、クロックをピンに出力しない。
        I/Oピンとして使用する。
行番号19~22
 汎用レジスタの
   0X20をCNT1、0X21をcnt2 0X22をCNT3、0X23をCNT4
   と命名し行番号69以下のタイマーサブルーチンの準備をします。
 
行番号24~28
 PIC12f629の初期設定の決まり文句
  
PIC12f629は割り込み機能があります。これは、アドレス0x0004から開始されます(割り込みベクター)。このプログラムでは割り込みを使用しないので、何らかのきっかけで割り込みが発生したときを想定して0x0004番地にRETFIE命令だけを記述します。もし割り込みが発生しても実行せず元の処理に戻る工夫をしています。
ちなみに、割り込みを使用するプログラムではRETFIEの代わりに、Wレジスタや使用しているファイルレジスタの内容を他のファイルレジスタに退避する記述をします。
 
行番号29~40
 内部クロック周波数の補正千設定のためにのために   
①STATUSレジスタのRP0をHにしてBANK1を指定
②化ll命令で較正データーを取得し、MOVWF命令でOSCALLレジスタにそのデーターを書き込む
③書き込み完了後STATUSレジスタのRP0をLにして、BANKを戻します。
行番号41~44
 出力⑦⑥➄の各ピンをHに設定しています。
 回路はトランジスタアレイ62083APで電流を増幅しますが、この時出力が反転するのでマイコンの出力はLです。
行番号45~48 
 CNT1.CNT2,CNT3,CNT4(行番号19~22で指定)の値をゼロクリアーします。
行番号49~51
 ブロッカーの信号を監視して、ブロッカーが閉じたら行番号52に進みます。
行番号52~68
 アミューズ基板からの入力を監視し、入力があれば当該北斗の拳世紀末救世主伝説と同じメダル投入信号を出力します。
行番号62~102
 メダル投入疑似信号を当該拳世紀末救世主伝説と同じパルス幅にするための10ミリ秒と5ミリ秒のタイマーサブルーチンです。
 
出来上がったプロフラムはPICKIT2などでマイコンに書き込み、回路に装着します。
 
 
 
PICマイコン 16F628A を使った 3桁7セグカウントダウン表示プログラム
電源ONで600を表示
RA4③に入力された1PULSごとに599、598、597、と表示がカウントダウンします。
1PULSを1秒にすると600秒(10分)のタイマーとなります。
1秒ごとに1PULS発するマイコンは別途プログラムします。
 
 
 
 
 
start
             bsf        GPIO,2              ; LED消灯
loop 
              btfsc     GPIO,3    ;スイッチON?
              goto      loop
              call        tim_20    ;:20msec待ち
              btfsc     GPIO,3      ;スイッチON?再度確認
              goto       loop
               bcf        GPIO,2   ;LED点灯
               call       tim_20    ;20msec待ち
               goto      start    ;LED消灯
 
チャタリング持続時間
●トグルスイッチ     30~50ミリ秒
●キーボードのスイッチ   5~10ミリ秒
●押しボタンスイッチ   30~30ミリ秒
●大型トグルスイッチ   50~100ミリ秒
●小型リレー接点      3~10ミリ秒
●ロータリースイッチ    3~10ミリ秒
 
 
機械式のスイッチはどのような形状のものでも、ON/OFFの際に私たちの感覚ではわからないバウンドを繰り返しています。接点がつながったり、切れたりして、スイッチONでもOFFの状態になってコンピューターの入力を感知するプログラムが誤動作することがあります。

7セグメントLEDで1回のスイッチ入力で1カウントアップの装置を作って、いざスイッチを押すとでたらめな数値が表示される。これはチャタリングという現象が起こっているのです。
チャタリング防止の回路例です。74HC14を使っています。回路のコンデンサーが電位を蓄えるおかげでスイッチの接点が一瞬離れても、Pの電位は0Vになることはなく、電位を保ち、ロジックHを認識します。74HC14はQの電位をスイッチのチャタリングを問題とせずロジックLに変わります。
チャタリング持続時間
●トグルスイッチ     30~50ミリ秒
●キーボードのスイッチ   5~10ミリ秒
●押しボタンスイッチ   30~30ミリ秒
●大型トグルスイッチ   50~100ミリ秒
●小型リレー接点      3~10ミリ秒
●ロータリースイッチ    3~10ミリ秒