; ================================================================= ;      LED電子サイコロ  PIC16F84A エレキジャックNo.5  LIST P=PIC16F84A ; PICを指定 INCLUDE "P16F84A.INC" ; 設定ファイルの読み込み __config _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;================================================================== ; ::::::::::::::::::初期値定義(カウンタ,設定変数,サイコロの目データ):::::: PORTB_D EQU 01H ; ポートB入出力設定データ SAI1 EQU 10H ; サイコロ目データ −1− SAI2 EQU 22H ; サイコロ目データ −2− SAI3 EQU 32H ; サイコロ目データ −3− SAI4 EQU 0AAH ; サイコロ目データ −4− SAI5 EQU 0BAH ; サイコロ目データ −5− SAI6 EQU 0EEH ; サイコロ目データ −6− LED1 EQU 32H ; オープニング点滅データ LED2 EQU 54H ; オープニング点滅データ LED3 EQU 98H ; オープニング点滅データ LED4 EQU 54H ; オープニング点滅データ LED5 EQU 32H ; オープニング点滅データ LED6 EQU 10H ; オープニング点滅データ LED7 EQU 0FEH ; オープニング点滅データ INT_ON EQU 90H ; INT(RB0)割込み許可設定データ INT_OFF EQU 10H ; 割込み禁止設定データ CNT1 EQU 0DH ; WAIT用カウント変数 CNT2 EQU 0EH ; WAIT用カウント変数 CNT3 EQU 0FH ; WAIT用カウント変数 CNT4 EQU 10H ; WAIT用カウント変数 CNT5 EQU 11H ; WAIT用カウント変数 SLPCNT EQU 12H ; スリープまでの点滅回数 (オープニングの繰り返し回数) RESULT EQU 13H ; サイコロの出目の保持変数 ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ORG 0 ; プログラムを格納する先頭アドレス  GOTO MAIN ORG 4 ; 割込時の処理開始アドレス (スリープ後,押しボタンによる復帰) MOVLW INT_OFF ; INT(RB0)の割込禁止 MOVWF INTCON ; NOP MOVLW INT_ON ; INT(RB0)の割込開始 MOVWF INTCON ; RETFIE ; 割込からの復帰 ;::::::::::::::::::::::::: 初期設定 :::::::::::::::::::::::::::::::::::::::::: MAIN BSF STATUS,RP0 ; バンク1を選択 MOVLW PORTB_D ; ポートB設定データ MOVWF TRISB ; RB0を押しボタン入力,RB1〜7をLED出力モードに設定 BCF STATUS,RP0 ; バンク0を選択 CLRF PORTB ; PORTBのクリア(LED消灯) MOVLW INT_ON ; INT(RB0)の割込許可 MOVWF INTCON MOVLW 0AH MOVWF SLPCNT ; スリープまでの点灯ループ回数設定 10巡目でスリープ ;::::::::::::::::::: サイコロの目 オープニングデモ ::::::::::::::::::::::::: INTRO MOVLW LED1 ; サイコロ目データの格納 MOVWF PORTB ; ポートBへ出力 CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 ; 押しボタンが押されたら,STARTへ(サイコロ転がし) GOTO START MOVLW LED2 MOVWF PORTB ; ポートBへ出力 CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 ; 押しボタンが押されたら,STARTへ(サイコロ転がし) GOTO START MOVLW LED3 MOVWF PORTB ; ポートBへ出力 CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 GOTO START ; 押しボタンが押されたら,STARTへ(サイコロ転がし) MOVLW LED4 MOVWF PORTB ; ポートBへ出力 CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 GOTO START ; 押しボタンが押されたら,STARTへ(サイコロ転がし) MOVLW LED5 MOVWF PORTB ; ポートBへ出力 CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 GOTO START ; 押しボタンが押されたら,STARTへ(サイコロ転がし) MOVLW LED6 MOVWF PORTB CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 GOTO START ; 押しボタンが押されたら,STARTへ(サイコロ転がし) MOVLW LED7 MOVWF PORTB CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 GOTO START ; 押しボタンが押されたら,STARTへ(サイコロ転がし) CLRF PORTB CALL WAIT4 ; 表示WAIT BTFSC PORTB,0 GOTO START ; 押しボタンが押されたら,STARTへ(サイコロ転がし) DECFSZ SLPCNT,1 ; スリープカウンタを1減算して, GOTO INTRO ; ゼロになればスリープモードへ,ゼロでなければ,INTROへ ; :::::::::::::::::::::: スリープ モード 移行 ::::::::::::::::::::::::::::: CALL WAIT5 MOVLW LED7 ; LED全点灯 MOVWF PORTB ; 表示WAIT CALL WAIT5 CLRF PORTB ; LED全消灯 CALL WAIT5 ; 表示WAIT MOVLW LED7 ; LED全点灯 MOVWF PORTB CALL WAIT5 ; 表示WAIT CLRF PORTB ; LED全消灯 CALL WAIT5 ; 1秒タイマ呼び出し BCF INTCON,02H ; 割込フラッグのリセット SLEEP ; スリープへ NOP GOTO MAIN ; WAIK UPの開始はMAINから ; :::::::::::::::::::::: サイコロの振り出し :::::::::::::::::::::::::::::::::: START CLRF PORTB ; ポートBクリア BTFSC PORTB,0 ; 押しボタンが放されるのを待つ GOTO START CALL RULET ; サイコロの目のシャッフル開始 MOVWF RESULT ; サイコロの出目出力 MOVWF PORTB ; ポートBへサイコロの出目出力 CALL WAIT5 ; 表示WAIT CLRF PORTB ; LED全消灯 CALL WAIT5 ; 表示WAIT MOVFW RESULT ; サイコロの出目出力 MOVWF PORTB ; ポートBへ出力 CALL WAIT5 ; 表示WAIT CLRF PORTB ; LED全消灯 CALL WAIT5 ; 表示WAIT MOVFW RESULT ; サイコロの出目出力 MOVWF PORTB ; ポートBへ出力 CALL WAIT5 ; 表示WAIT CALL WAIT5 ; 表示WAIT CLRF PORTB ; LED全消灯 CALL WAIT5 ; 表示WAIT CALL WAIT5 ; 表示WAIT GOTO INTRO ; オープニングモードへ戻る ; :::::::::::::::::::::: サイコロの目シャッフルルーチン :::::::::::::::::::::::: RULET MOVLW SAI5 ; MOVWF PORTB ; ポートBへ出力 CALL WAIT3 ; 表示WAIT BTFSC PORTB,0 RETLW SAI5 ; サイコロの目データの格納 −5− NOP NOP MOVLW SAI1 MOVWF PORTB ; ポートBへ出力 CALL WAIT3 ; 表示WAIT BTFSC PORTB,0 RETLW SAI1 ; サイコロの目データの格納 −1− NOP NOP MOVLW SAI4 MOVWF PORTB ; ポートBへ出力 CALL WAIT3 ; 表示WAIT BTFSC PORTB,0 RETLW SAI4 ; サイコロの目データの格納 −4− NOP NOP MOVLW SAI2 MOVWF PORTB ; ポートBへ出力 CALL WAIT3 ; 表示WAIT BTFSC PORTB,0 RETLW SAI2 ; サイコロの目データの格納 −2− NOP NOP MOVLW SAI3 MOVWF PORTB ; ポートBへ出力 CALL WAIT3 ; 表示WAIT BTFSC PORTB,0 RETLW SAI3 ; サイコロの目データの格納 −3− NOP NOP MOVLW SAI6 MOVWF PORTB ; ポートBへ出力 CALL WAIT3 ; 表示WAIT BTFSC PORTB,0 RETLW SAI6 ; サイコロの目データの格納 −6− GOTO RULET ; :::::::::::::::::::::: 表示WAIT ルーチン :::::::::::::::::::::::: WAIT1 MOVLW 3EH ; WAIT1タイマーサブルーチン 約0.1ms MOVWF CNT1 LOOP1 NOP DECFSZ CNT1,1 GOTO LOOP1 RETURN WAIT2 MOVLW 64H ; WAIT2タイマーサブルーチン 約10ms MOVWF CNT2 LOOP2 NOP CALL WAIT1 DECFSZ CNT2,1 GOTO LOOP2 RETURN WAIT3 MOVLW 05H ; WAIT3タイマーサブルーチン 約50ms MOVWF CNT3 LOOP3 NOP CALL WAIT2 DECFSZ CNT3,1 GOTO LOOP3 RETURN WAIT4 MOVLW 32H ; WAIT4タイマーサブルーチン 約0.5s MOVWF CNT4 LOOP4 NOP CALL WAIT2 DECFSZ CNT4,1 GOTO LOOP4 RETURN WAIT5 MOVLW 64H ; WAIT5タイマーサブルーチン 約1s MOVWF CNT5 LOOP5 NOP CALL WAIT2 DECFSZ CNT5,1 GOTO LOOP5 RETURN END ; プログラムの終わり