<プログラム>

 PIC12F675に書き込むプログラムです。

 

1 作動解説

 製作の前に、ブレッドボード上で作動を確認することをお勧めします。

 

(1)スタート作動時の液晶電源と音信号状態

 電池を入れる、または、SLEEP状態でスイッチを押すと作動を開始します。

 SLEEPに入る前の作動とSLEEP状態からスイッチを押した時の作動は以下の通りです。

 ア 設定時間(2分または5分)になるとSLEEP作動に入ります。6回ピッピと音を鳴らし、その後液

   晶の電源を供給を止め、マイコン自身はSLEEP作動に入ります。

 イ スイッチを押すと、マイコンはSLEEPから目覚め、液晶へ電源を供給し、またピッピッピ(またはピッピッ

   ピピ)と音を鳴らします。ON YOUR MARK表示時の音、SET表示時の音、スタート音の順で作動して

   いきます。

 

(2)液晶への信号例

 I2C接続の機器は、データ信号SDAとクロック信号SCLの2本の信号で作動します。下の図は、液晶への最初の信号送信状態を代表で示しています。

 

2 プログラム

 以下プログラムです。

 MPLAB等のPICライタソフトを使用して、PIC12F675に書き込みます。

 

;指ストップウォッチコントロールプログラム I2C液晶表示器用

;最後の変更内容:タイマ割り込み部修正 2018.4.22

;小出 芳夫

;file name:stopwatch_3V_LCD_v180422.asm 

;*****ピン配置*****************************************************************

;                      SDA            SCL          圧電スピーカ電源兼用

;      Vss             GP0            GP1              GP2  

;       8               7              6                5

;

;       1               2              3                4  

;      Vdd             OSC            OSC            GP3(input)

;                     (GP5)          (GP4)         SWITCH(GP3は外部抵抗でプルアップ)  

;*****************************************************************************

 

    LIST    P=12f675

    #INCLUDE    <p12f675.inc>

                                                                ; XT_OSCでは電圧高い時に作動せず

    __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

 

    CBLOCK    020h

    T10ms_count ;10mSループカウンタ

    T1_count    ;汎用タイムループカウンタ

    LP_count1    ;汎用ループカウンタ1

    LP_count2    ;汎用ループカウンタ2

    LP_count3    ;汎用ループカウンタ3

    LP_count4    ;汎用ループカウンタ4    

    TT_count    ;計測終了残りカウンタ

 

    h_count        ;表示用カウント

    R_data        ;ランダム数値データ 

    txdata        ;液晶表示文字データ

    txdatax        ;液晶表示文字データ(連続表示用)

    tx_bit        ;tx_dataのビット位置指定データ

    tx_con        ;液晶コントラストデータ

    C_data        ;コントラスト元データ。0,1ビットのみ使用=M_dataの5,6ビットに保存してSLEEPモードに入る

    MsgNO        ;表示する文字の先頭位置    

 

    ;割り込みで使用

    s_stts        ; statusレジスタの退避

    s_wreg        ; workingレジスタの退避

    t_count        ; temp count

    d001        ;.01秒部分のデータ

    d002        ;.1秒部分のデータ

    d003        ;1秒部分データ

    d004        ;10秒部分データ

    d005        ;分部分のデータ 2画面表示モードで使用、4画面表示モードでは使わない

 

    ;メインと割り込みの間の受け渡し等

    f_int        ;bit0:計時はするが表示しない場合=1(BEEP音時に作動させる)

                ;bit1:1秒ごとに1となる(C_countを減らす信号として用いる)

                ;bit2:ストップ音発直後で待ち未完了0,完了1

 

    M_data        ;SLEEP時の保存データ

                ;bit0 機能設定表示中にボタンが押されたら1、押されなければ0のまま。    

                ;bit1 0:SET-=スタート間隔を固定、1:ランダム

                ;bit2 2画面=0、4画面=1

                ;bit3 オフタイム設定 0:120秒 1:300秒

                ;bit4 スタート時のボタン操作有効の遅延時間 0:なし 1:あり(2秒)

                ;bit5 

                ;bit6 

                ;bit7 ランダムデータ(最上位ビットのみを保存)            

    Lap_count    ;ラップ計測できる残り数

    L_t_count    ;ラップ計測の処理用仮データ

    loc_data    ;時間表示場所を表すデータ

    C_count        ;STOP時直後の誤作動防止防止カウンタ

 

    ENDC

 

    ORG     0

    goto    init

 

; ====================================================

    ORG    4

;    割込み処理(TMR0割り込み)

                        ;4 割り込み分サイクル=2 ,TMR0書き込み後のカウント停止2サイクル

    movwf    s_wreg        ;1 workingレジスタの退避 

    swapf    STATUS,w    ;1

    movwf    s_stts        ;1 statusレジスタの退避

    bcf        INTCON,T0IF    ;1 タイマ割込みフラグクリア 

    nop                    ;1

    nop                    ;1 10STEP

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                    ;1

    movlw    D'100'        ;1

    addwf    TMR0        ;1

                        ;合計16STEP

                        ;  .000001*64*(256-100)=.009984

                        ;  .000001*16=          .000016

 

;待ち時間処理

    btfsc    f_int,2        ;音発生直後の待ち時間未完了状態だったらスキップして待ち時間カウントダウンする

    goto    next3

    decfsz    C_count        ;待ち時間カウントダウンし、0になればスキップして待ち時間完了フラグを立てる

    goto    next3

    bsf        f_int,2        ;待ち時間完了とする

next3

 

;-------タイマのカウント---------

    incf    d001        ;0.01秒のカウント

    movfw    d001

    sublw    D'10'

    BTFSS    STATUS,Z

    goto    ENDCAL

    clrf    d001

 

    incf    d002        ;0.1秒のカウント

    movfw    d002

    sublw    D'10'

    BTFSS    STATUS,Z

    goto    ENDCAL

    clrf    d002

 

    incf    d003        ;1秒のカウント

    movfw    d003

    sublw    D'10'

    BTFSS    STATUS,Z

    goto    ENDCAL

    clrf    d003

 

    bsf        f_int,1        ;10秒のカウントアップが行われたことを記録(TT_countを減らすため)

    btfsc    M_data,2    ;0:4表示、1:2表示、 

    goto    disp2        ;

    incf    d004        ;10秒のカウント

    movfw    d004

    sublw    D'10'

    BTFSS    STATUS,Z

    goto    ENDCAL

    clrf    d004

    goto    ENDCAL        ;

 

disp2                    ;///2画面表示の処理/////////////////////////////////////

    incf    d004        ;10秒のカウント

    movfw    d004

    sublw    D'6'

    BTFSS    STATUS,Z

    goto    ENDCAL

    clrf    d004

 

    incf    d005        ;1分のカウント

    movfw    d005

    sublw    D'24'

    BTFSS    STATUS,Z

    goto    ENDCAL

    clrf    d005

                        ;//////////////////////////////////////////////////////

 

ENDCAL

    btfsc    f_int,0        ;1の場合はjump_00に行く。 表示BEEP音発生時は画面表示させない。

    goto    jump_00

 

;表示アドレスの指定準備(アドレス値を設定)

    movfw    Lap_count

    movwf    L_t_count

 

    decfsz    L_t_count

    goto    R2

    goto    jump_00        ;Lap_countが1の場合の処理:計測終了しているので、表示せずに戻る

R2    decfsz    L_t_count

    goto    R3

    movlw    B'11000100'    ;Lap_countが2の場合の処理:右下に表示

        btfsc    M_data,2            ;///2画面表示の場合/////////////////////

        movlw    B'11000001'            ;///下に表示////////////////////////////

    movwf    loc_data

    goto    DISP

R3    decfsz    L_t_count

    goto    R4

    movlw    B'11000000'        ;Lap_countが3の場合の処理:左下に表示

        btfsc    M_data,2            ;///2画面表示の場合//////////////////////

        movlw    B'10000001'            ;///上に表示////////////////////////////

    movwf    loc_data

    goto    DISP

R4    decfsz    L_t_count

    goto    R5

    movlw    B'10000100'        ;Lap_countが4の場合の処理:右上に表示

    movwf    loc_data

    goto    DISP

R5    movlw    B'10000000'        ;Lap_countが5の場合の処理:左上に表示

    movwf    loc_data

 

DISP

;表示アドレス指定

    movlw    B'10000000'

    movwf    txdata

    call    TX

    movfw    loc_data            ;アドレス指定

    movwf    txdata

    call    TX

    call    TIME10STEP        ;10μs時間待ち

    call    TIME10STEP        ;10μs時間待ち

    call    TIME10STEP        ;10μs時間待ち

 

;計時状態の表示

    btfss    M_data,2    ;0:4画面表示、1:2画面表示////////////////////////////////

    goto    jump5

 

    ;5桁目表示                ;///2画面表示の処理

    movfw    d005            ;5桁目のデータを処理

    addlw    30H        

    movwf    txdatax                    

    call    TXx

    ;":"を表示

    movlw    ":"             ;":"のデータを処理

    movwf    txdatax                    

    call    TXx

    ;////////////////////////////////////////////////////////////////////

jump5

    ;4桁目表示

    movfw    d004            ;4桁目のデータを処理

    addlw    30H        

    movwf    txdatax                    

    call    TXx

 

    ;3桁目表示

    movfw    d003            ;3桁目のデータを処理

    addlw    30H        

    movwf    txdatax                    

    call    TXx

 

    ;"."を表示////////////////////////////////////////////////////////////

    btfss    M_data,2    ;0:4表示、1:2表示/////////////////////////////////

    goto    jump6                ;///2画面表示の処理

    movlw    "."                 ;"."のデータを処理

    movwf    txdatax                    

    call    TXx

    ;///////////////////////////////////////////////////////////////////

jump6

    ;2桁目表示

    movfw    d002            ;2桁目のデータを処理

    addlw    30H        

    movwf    txdatax                    

    call    TXx

    

    ;1桁目表示

    movfw    d001            ;1桁目のデータを処理

    addlw    30H        

    movwf    txdatax                    

    call    TXx

 

jump_00

    swapf    s_stts,W

    movwf    STATUS            ;statusレジスタ復帰

    swapf    s_wreg,F

    swapf    s_wreg,W        ;workingレジスタ復帰

    RETFIE                    ;割込みからのリターン

 

 

;****************************************************************************

;============================================================================

;======PIC初期化(プログラムはここからスタート)==========================================

;****************************************************************************

init

    movlw   B'00000111'  

    movwf   CMCON      ;コンパレータOFF

 

    bsf     STATUS,RP0    ;■バンク1に切替え

    CLRF    ANSEL       ;AN機能使用しない

    movlw   B'00111000'    ;GP3,GP4,GP5を入力、GP0,GP1,GP2,は出力 '--543210'

    movwf    TRISIO

 

    movlw    B'00001000'    ; GP3ピン変化割込有効に

    movwf    IOC

 

    movlw   B'00000001'    ; GP番号(GP0)を指定

    movwf    WPU            ; 指定番号をWPUに記入し

 

    MOVLW    B'10000101'    ;16カウントモード指定011:16 100:32 101:64 110:128 

    MOVWF    OPTION_REG    ;プリセットカウンタへ出力

 

    bcf        STATUS,RP0     ;■バンク0に切替え

 

;EEDATAの読み込み++++++++

    clrf    C_data        ;コントラスト元データクリア

    clrf    R_data        ;ランダムデータをクリア

    movlw    00h            ;アドレス指定

    movwf    EEADR

    bsf        STATUS,RP0     ;Bank 1

    bsf     EECON1,RD     

    movfw    EEDATA        ;注:EEDATAはBANK1(ここではバンクを0に戻さない) 

    movwf    M_data    

    bcf        STATUS,RP0     ;Bank 0

    btfsc    M_data,7    ;ランダムデータの最上位BITを設定する

    bsf        R_data,7

    btfsc    M_data,5    ;コントラストデータの0bitを設定

    bsf        C_data,0

    btfsc    M_data,6    ;コントラストデータの1bitを設定

    bsf        C_data,1    

;+++++++++++++++++++++++

    CLRF    f_int        ;メモリクリア

 

;******** メイン処理*************************************************************

MAIN

;    call    T1sWAIT        ;1s待ち ディスプレイの電源落とし後の時間待ち

    call    T04sWAIT    ;液晶の電源ONの待ち時間。 0.4s待ち

 

;このタイミングでスイッチ押されてたら(長押しだったら)、スキップしてスタートの固定またはランダムモードを反転

    btfsc    GPIO,3        

    goto    next14

    movfw    M_data        ;ワークレジスタにM_dataをセット

    xorlw    B'00000010'    ;SETの待ち時間設定ビット(ビット1(0,1の1))を反転する。

    movwf    M_data        ;rレジスタからM_dataに戻す

next14

 

    call    T40mBEEP

;液晶電源ON

    bsf        GPIO,1        ;clkHigh  CLOCK信号は最初からあげておかないと作動しない

    nop

    bsf        GPIO,0        ;SDAHigh 

    nop

    bsf        GPIO,2        ;電源sound兼用をONにする 

    nop

 

    call    T04sWAIT    ;0.4s待ち

    call    T40mBEEP

    call    T01sWAIT    ;  

    call    T01sWAIT    ;  

    call    LCDstart    ;約0.5秒かかる

 

 

;------------------------------------ スタート準備-----------------------------------

onyour

    call    T40mBEEP

    btfss    M_data,1    ;ランダムモードの場合は、スキップしてピピと鳴らす

    goto    norm

    call    T10mWAIT

    call    T10mWAIT

    call    T10mWAIT

    call    T10mWAIT

    call    T40mBEEP    

norm

    call    T1sWAIT

 

;コントラスト設定(C_dataに応じた設定)

    movlw    B'01111001'    ; 'XXXX1001'は初期(薄め)設定。    

    movwf    tx_con

    btfsc    C_data,0

    bsf        tx_con,1

    btfsc    C_data,1

    bsf        tx_con,2

    call    Cont3210

 

;ON YOUR MARKの表示

    call    gyou_1        ;1行目に"ON YOUR"と表示

    movlw    D'0'

    movwf    MsgNO

    call    MSG01

    call    gyou_2        ;2行目に"MARK"と表示

    movlw    D'8'

    movwf    MsgNO

    call    MSG01

 

;3秒ぴー音

    movlw    D'40'    

    movwf    LP_count1        

bee1

    call    T10mBEEP

    call    T10mWAIT

    call    T10mWAIT

    call    T10mWAIT

    decfsz    LP_count1,f

    goto    bee1

 

    call    clear01        ;画面クリア

 

;2秒待ち

    call    T1sWAIT

    call    T1sWAIT

 

;機能設定を表示

FUNCSET

    call    gyou_1        ;1行目に"ナガオシデ"と表示

    movlw    D'24'

    movwf    MsgNO

    call    MSG01

    call    gyou_2        ;2行目に"キノウセッテイ"と表示

    movlw    D'32'

    movwf    MsgNO

    call    MSG01

 

;5秒まちながらスイッチ押されるかどうかをCK

    movlw    D'50'

    movwf    LP_count3    

loop199

    call    T01sWAIT

    btfss    GPIO,3

    goto    cont001        ;スイッチが押されていたら、CONT001に飛び次の処置を行う

    decfsz    LP_count3

    goto    loop199

    goto    jump199        ;機能設定を飛び越える

cont001

;機能設定かの判定

    call    T1sWAIT

    btfsc    GPIO,3        ;短押の場合(Highに戻った場合)はloop199へ

    goto    loop199        ;長押しの場合は、FUNC001にジャンプして、機能設定する

 

;機能設定(画面モード、オフタイム、遅延モード)--------------------------------------

    call    clear01        ;画面クリア

    call    gyou_1        ;1行目指定

    movlw    D'80'        ;モードサマリと表示

    movwf    MsgNO

    call    MSG01

 

    call    gyou_2        ;2行目指定

    movlw    "2"            ;現在の画面モードを表示(2画面か4画面か)

    btfss    M_data,2

    movlw    "4"

    movwf    txdatax

    call    TXx

    movlw    "2"            ;現在のオフタイム(SLEEPまでの時間)を表示(2分か5分)

    btfss    M_data,3

    movlw    "5"

    movwf    txdatax

    call    TXx

    movlw    "N"            ;現在の遅延モードを表示する(1:遅延なし 0:遅延あり)

    btfss    M_data,4

    movlw    "Y"

    movwf    txdatax

    call    TXx

    movfw    C_data        ;現在のコントラスト値(0~3)を表示する

    addlw    B'00110000'

    movwf    txdatax

    call    TXx

 

    call    T1sWAIT

    call    T1sWAIT

    call    T1sWAIT

 

;1.2画面か4画面かを設定する

    ;内容表示

    call    gyou_1        ;1行目に"ガメンスウ"と表示

    movlw    D'40'

    movwf    MsgNO

    call    MSG01

A11

    call    gyou_2        ;2行目指定

    movlw    D'64'        ;↓=ヘンコウと表示

    movwf    MsgNO

    call    MSG01

    call    gyou_2        ;2行目指定

    movlw    "2"            ;現在の画面モードを表示(2画面か4画面か)

    btfss    M_data,2    ;ビット2が設定データ

    movlw    "4"

    movwf    txdatax

    call    TXx

 

    call    switchCK    ;スイッチ押されたらM_data,0が1になって帰ってくる。 

    movfw    M_data        ;ワークレジスタにM_dataをセット

    btfss    M_data,0    ;M_data,0が1だったらスキップして反転処置をする

    goto    J22

    xorlw    B'00000100'    ;ビット2を反転する。

    movwf    M_data        ;ワークレジスタデータをM_dataに戻す

    goto    A11

J22

;2.SLEEPまでの時間を設定する

    ;内容表示

    call    gyou_1        ;1行目に"オフヘノジカン"と表示

    movlw    D'48'

    movwf    MsgNO

    call    MSG01

A22

    call    gyou_2        ;2行目指定

    movlw    D'64'        ;↓=ヘンコウと表示

    movwf    MsgNO

    call    MSG01

    call    gyou_2        ;2行目指定

    movlw    "2"            ;現在のオフまでの時間゙を表示(1:2分 0:5分)

    btfss    M_data,3    ;ビット3が設定データ

    movlw    "5"

    movwf    txdatax

    call    TXx

 

    call    switchCK    ;スイッチ押されたらM_data,0が1になって帰ってくる。

    movfw    M_data        ;ワークレジスタにM_dataをセット

    btfss    M_data,0    ;M_data,0が1だったらスキップして反転処置をする

    goto    J33

    xorlw    B'00001000'    ;ビット3を反転する。

    movwf    M_data        ;ワークレジスタデータをM_dataに戻す

    goto    A22

 

J33

;3.スタート後の計測遅延ありなしを設定

    ;内容表示

    call    gyou_1        ;1行目に"ケイソクヲチエン"と表示

    movlw    D'56'

    movwf    MsgNO

    call    MSG01

A33

    call    gyou_2        ;2行目指定

    movlw    D'64'        ;↓=ヘンコウと表示

    movwf    MsgNO

    call    MSG01

    call    gyou_2        ;2行目指定

    movlw    "N"            ;現在の計測遅延ありなしを表示

    btfss    M_data,4    ;ビット4が設定データ

    movlw    "Y"

    movwf    txdatax

    call    TXx

 

 

    call    switchCK    ;スイッチ押されたらM_data,0が1になって帰ってくる。

    movfw    M_data        ;ワークレジスタにM_dataをセット

    btfss    M_data,0    ;M_data,0が1だったらスキップして反転処置をする

    goto    J44

    xorlw    B'00010000'    ;ビット4を反転する。

    movwf    M_data        ;ワークレジスタデータをM_dataに戻す

    goto    A33

J44

;コントラスト変更

    ;内容表示

    call    gyou_1        ;1行目に"コントラスト"と表示

    movlw    D'88'

    movwf    MsgNO

    call    MSG01

A44

    call    gyou_2        ;2行目指定

    movlw    D'64'        ;↓=ヘンコウと表示

    movwf    MsgNO

    call    MSG01

    call    gyou_2        ;2行目指定

    movfw    C_data        ;現在のコントラスト値(0~3)を表示する

    addlw    B'00110000'

    movwf    txdatax

    call    TXx

 

    call    switchCK    ;スイッチ押されたらM_data,0が1になって帰ってくる。

    btfss    M_data,0    ;M_data,0が1だったらスキップして反転処置をする

    goto    J55

    incf    C_data,f    ;C_dataをインクリメント

    bcf        C_data,2    ;bit2は0にしておく

 

    ;C_dataに応じたコントラスト設定(0,1ビットのみが設定値)

    movlw    B'01111001'    ; 'XXXX1001'は初期(やや薄め)設定。    

    movwf    tx_con

    btfsc    C_data,0

    bsf        tx_con,1

    btfsc    C_data,1

    bsf        tx_con,2

    call    Cont3210

 

    goto    A44

 

J55

    call    clear01

    call    gyou_1        ;1行目にverを表示

    movlw    D'72'

    movwf    MsgNO

    call    MSG01

    call    T1sWAIT        ;1秒待ち            

    call    T1sWAIT        ;1秒待ち        

;-------------------------------------------------------------------

 

 

jump199

;SETの表示

    call    clear01        ;画面クリア

    call    gyou_1        ;1行目に"SET"と表示

    movlw    D'16'

    movwf    MsgNO

    call    MSG01

 

;1秒ブー音(SET音)

    movlw    D'50'    

    movwf    LP_count1        

bee3

    call    T10mBEEP

    call    T10mWAIT

    decfsz    LP_count1,f

    goto    bee3

 

;1秒待ち

    call    T1sWAIT

 

;追加時間待ち

    movlw    D'125'        ;固定時間をLP_count1にセット

    movwf    LP_count1        

    btfss    M_data,1    ;SETmode 1bit目がランダムモード(1)の場合スキップしてランダム処理する

    goto    wait2

    movfw    R_data        ;ランダムの場合ランダム時間(R_data)をワークレジスタに移す。

    movwf    LP_count1    ;ランダム時間をLP_count1にセット

wait2

    call    T2mWAIT        ;2.5mmsの時間待ち

    decfsz    LP_count1,f

    goto    wait2

 

;ドン処理******************************

    ;画面クリア

    call    clear01

 

    ;変数設定

    bcf        f_int,1        ;1秒経過をクリアする

    bsf        f_int,2        ;BEEP信号後の待ち時間完了とする=1

    movlw    D'3'        ;計測の残り関数(残り回数+1)の初期値3をセット

    btfss    M_data,2    ;4画面モードの場合はD'5'とする/

    movlw    D'5'        ;            

    movwf    Lap_count    

    clrf    d001

    clrf    d002

    clrf    d003

    clrf    d004

    clrf    d005

    movlw    D'12'        ;SLEEPまで120秒に設定    

    btfss    M_data,3    ;モードが1だったら次行はスキップ。 0だったら、次行の300秒に変更

    movlw    D'30'        ;SLEEPまで300秒に変更    

    movwf    TT_count

 

    ;割込開始----ここから計測開始

    MOVLW     D'100'        ;カウント値ロード

    MOVWF    TMR0        ;TMR0へ出力

    movlw    B'10100000'    ;GIE PEIE T0IE INTE GPIE T0IF INTF GPIF

    MOVWF    INTCON    

 

    ;start信号出力---------------------------------

    bsf        f_int,0        ;計時はするが画面表示しないモードにする。1(BEEP音をなるべく邪魔しない)

    call    T40mBEEP    ;40msの間音を出す

    call    T40mBEEP    ;40msの間音を出す

    bcf        f_int,0            

 

    btfsc    M_data,4    ;遅延モードが0の場合、約2秒待つ

    goto    jumpzz

    call    T1sWAIT        ;約2秒遅延(WAIT中の割り込み処理の時間も考慮)

    call    T04sWAIT

jumpzz

 

 

;********************計測中のループ*******************************************

;++++++++++++++++++++2分待つ+++++++++++++++++++++++++++++++++++++++++++++++

wait2min

    movfw    R_data        ;E_dataに値を加算(疑似ランダム値を入力する)

     addlw    D'162'

    movwf    R_data

 

;スイッチが押された場合の処置(音発生と残り計測数のカウントダウン、残り計測数が0であった場合の)

    btfsc    GPIO,3        ;スイッチがおされていること(0であること)(条件1)=0であればスキップ:

    goto    jump1

    btfss    f_int,2        ;待ち時間完了であること(1であること)(条件2)=1であればスキップ

    goto    jump1

 

    ;計測残りに対応して処置

    decfsz    Lap_count    ;decrease後4,3,2,1になったの場合は計時を進行。

                        ;注:1の場合は4つのラップ計測結果を表しながら計時は続ける。

                        ;0になった場合はスキップしてMAINに戻る処置に入る。

    goto    next2

 

    ;MAINに戻る前の処置

    ;割り込み設定をクリアする

     movlw    B'00000000'    ;GIE PEIE T0IE INTE GPIE T0IF INTF GPIF

    movwf    INTCON

    ;LCD終了処置し、電源を切る

    call    LCDend

    ;MAINへジャンプ

    goto    MAIN        ;MAINに行く(次の計測)

 

next2

    ;STOP信号出力

    bsf        f_int,0

    call    T40mBEEP

    bcf        f_int,0

 

    bcf        f_int,2        ;ストップ音発直後の待ち未完了(0)とする

    movlw    D'50'        ;STOP操作直後の誤操作防止カウンタ(割り込みルーチン内でカウントダウン) 

    movwf    C_count        ;0になったらf_int,2=0となる

 

    movlw    D'12'        ;表示時間を120秒延長する

    btfss    M_data,3    ;モードが0だったら、300秒の延長とする

    movlw    D'30'        ;    

    movwf    TT_count

 

;1ループ後の処理

jump1    

    btfss    f_int,1        ;10秒経過したらスキップして10秒カウンタをカウントダウン

    goto    wait2min

    bcf        f_int,1        ;10秒信号をクリア

    decfsz    TT_count,f    ;10秒経過していたらカウント減少、カウント0でスキップしてSLEEP処理

    goto    wait2min

 

;SLEEP処理***************************************************************

    ;割り込み設定をクリアする

     movlw    B'00000000'    ;GIE PEIE T0IE INTE GPIE T0IF INTF GPIF

    MOVWF    INTCON        ;

 

    ;SLEEP前処理に入ったことを知らせるため、1秒ごとに5回音を出す

    movlw    D'05'    

    movwf    LP_count2        

wait5

    call    T10mBEEP

    call    T1sWAIT

    decfsz    LP_count2,f

    goto    wait5

    nop

    nop

 

;M_dataを保存する++++++++++++

    bsf        STATUS,RP0    ;Bank 1

    bcf        M_data,5    ;5,6,7ビットを0にしておく

    bcf        M_data,6

    bcf        M_data,7

 

    btfsc    R_data,7    ;ランダムデータの最上位BITを保存する

    bsf        M_data,7

    btfsc    C_data,0    ;コントラストデータの0bitを設定

    bsf        M_data,5

    btfsc    C_data,1    ;コントラストデータの1bitを設定

    bsf        M_data,6    

 

    movfw    M_data

    movwf    EEDATA        ;EEDATAはバンク1で有効

    movlw    00h            ;アドレス指定

    movwf    EEADR

 

    bsf        EECON1,WREN ;Enable write

    movlw    55h            ;Unlock write

    movwf    EECON2

    movlw    0AAh

    movwf    EECON2

    bsf        EECON1,WR    ;Start the write

wait999

    btfsc    EECON1,WR

    goto    wait999

    bcf        STATUS,RP0    ;Bank 0

 

 

;LCD終了処置し、LCDの電源を切る

    call    LCDend

 

;割り込みGIE設定(GIEを0にして割り込みルーチンに行かないようにしておく)++++++++++++++++

     movlw    B'00001000'    ;GIE PEIE T0IE INTE GPIE T0IF INTF GPIF

    MOVWF    INTCON        ;

 

;SLEEP作動

    sleep

    nop    

 

;SLEEPから復帰

;EEDATAの読み込み++++++++

    clrf    C_data        ;コントラスト元データクリア

    clrf    R_data        ;ランダムデータをクリア

    movlw    00h            ;アドレス指定

    movwf    EEADR

    bsf        STATUS,RP0     ;Bank 1

    bsf     EECON1,RD     

    movfw    EEDATA        ;注:EEDATAはBANK1(ここではバンクを0に戻さない) 

    movwf    M_data    

    bcf        STATUS,RP0     ;Bank 0

    btfsc    M_data,7    ;ランダムデータの最上位BITを設定する

    bsf        R_data,7

    btfsc    M_data,5    ;コントラストデータの0bitを設定

    bsf        C_data,0

    btfsc    M_data,6    ;コントラストデータの1bitを設定

    bsf        C_data,1    

;+++++++++++++++++++++++

    goto    MAIN

;----------------------------メインルーチンの終了---------------------------

 

 

;***************************************以下サブルーチン******************

;*******************************音関連*********************************

;--;4kHzのビープ音を10ms継続--------------------------

; 4kHz=.25ms 4Mhz=.00025ms 1STEP=.00025*4=.001ms 250STEPで.25mSとなる  

T10mBEEP    

    movlw    D'40'         ;1

    movwf    T1_count    ;1

    goto    LOOP71

 

;--;4kHzのビープ音を40ms継続---------------------------

; 4kHz=.25ms 4Mhz=.00025ms 1STEP=.00025*4=.001ms 250STEPで.25mSとなる  

T40mBEEP    

    movlw    D'160'         ;1

    movwf    T1_count    ;1

 

LOOP71

    bsf        GPIO,2        ;1 送信ポートGP2をhighに

    call    TIME100STEP    ;100

    call    TIME10STEP    ;10

    call    TIME10STEP    ;10    

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                    ;1

    bcf        GPIO,2        ; 1 送信ポートGP2をLOWに

    call    TIME100STEP    ; 100

    call    TIME10STEP    ; 10

    call    TIME10STEP    ; 10    

    nop                    ; 1

    decfsz    T1_count,f    ; 1(2)

    goto    LOOP71        ; 2

    bsf        GPIO,2        ;1 送信ポートGP2をhighに 

    nop

    nop

    return                ;2

 

 

;***************************タイマ関連************************************

;---------- 10.000mS待つ    1STEP=.00025*4=.001ms=1μs

T10mWAIT                ;2 (call分)

    movlw    D'97'        ;1

    movwf    T10ms_count    ;1

T10mloop

    call    TIME100STEP    ;100

    decfsz  T10ms_count,F;1(2)

    goto    T10mloop    ;2        4+103*96+108=10000

    nop                    ;   1

    nop                    ;   1

    nop                    ;   1

    nop                    ;   1

    return                 ;   2            

 

;----------- 2.5mS待つ    1STEP=.00025*4=.001ms

T2mWAIT                    ;2 (call分)

    movlw    D'23'        ;1

    movwf    T1_count    ;1

T2mloop

    call    TIME100STEP    ;100

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                    ;1

    decfsz  T1_count,F    ;1(2) 

    goto    T2mloop        ;2            4+107*22*108=2466

    return                ;  2

 

;-----------約0.1s待つ

T01sWAIT                ;2 (call分)

    movlw    D'10'        ;1

    movwf    T1_count    ;1  

T01sloop

    call    T10mWAIT    ;10000

    decfsz  T1_count,F    ;1(2)  

    goto    T01sloop    ;2            4+10003*9+10004=100035

    return                 ;  2            

 

;-----------約0.4s待つ

T04sWAIT                ;2 (call分)

    movlw    D'40'        ;1

    movwf    T1_count    ;1 

T04sloop

    call    T10mWAIT    ;10000

    decfsz  T1_count,F    ;1(2)  

    goto    T04sloop    ;2            4+10003*39+10004=400121

    return                 ;  2

 

;-----------約1s待つ

T1sWAIT                    ;2 (call分)

    movlw    D'100'        ;1

    movwf    T1_count    ;1

T1sloop    

    call    T10mWAIT    ;10000

    decfsz  T1_count,F  ;1(2)

    goto    T1sloop        ;2

    return                 ;  2

 

;-----------10STEP待つ

;10STEP(10μs=0.01ms) 

TIME10STEP                ;2 (call分)

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                 ;1

    nop                    ;1

    nop                    ;1

    return                ;2 

 

;-----------100STEP待つ

;100STEP(0.1ms) 

TIME100STEP                ;2  (call分)

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    call TIME10STEP        ;10

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                    ;1

    nop                    ;1

    return                ;2 

 

 

;************4秒間スイッチの押下を待つ。 押されたら M_data,0を1にする********************

switchCK

    bcf        M_data,0

    movlw    D'40'

    movwf    LP_count3    

loop99

    call    T01sWAIT

    btfss    GPIO,3        ;

    goto    hyoujiX

    decfsz    LP_count3

    goto    loop99

    goto    jump99

hyoujiX

    bsf        M_data,0    ;スイッチが押されたことを記録する。

    call    T10mBEEP    ;10msの間音を出す

    call    T01sWAIT

jump99    

    return

 

;*************************************************************************

;***************LCDスタートシーケンス*******************************************

;*************************************************************************

LCDstart

    call    BSTART

    movlw    B'01111100'

    movwf    txdata

    call    TX

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    38h            ;FUNCTION SET テーブルは0セレクト

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    39h            ;FUNCTION SET テーブルは1セレクト(拡張コマンド選択)

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    14h            ;作動周波数設定 380Hz(拡張コマンド選択後に設定)

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    B'01110011'    ; 'XXXX0011'(C3,C2,C1,C0)はやや薄めの設定。    

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち

    movlw    B'01010101'    ;C5=0,C4=1 コントラストの一部等設定(拡張コマンド選択後に設定)

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    6Ch            ;フォロワ制御設定(ON)(拡張コマンド選択後に設定);

    movwf    txdata

    call    TX

    call    T01sWAIT    ;100ms時間待ち

    call    T01sWAIT    ;100ms時間待ち

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    38h            ;FUNCTION SET テーブルは0セレクト

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    0Ch            ;DISPLAY ON/OFF設定(表示オン、カーソルオフ、ブリンクオフ)

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

 

    call    clear01        ;画面クリア

    return

 

;**************************************LCDEND*************************

LCDend

;表示終了処置

      movlw    B'00000000'

    movwf    txdata

    call    TX

    movlw    01h            ;CLEAR DISPLAY

    movwf    txdata

    call    TX

    call    T2mWAIT        ;2ms時間待ち

    call    BSTOP        ;ストップビットを送る

 

;液晶電源オフ

    bcf        GPIO,2        ;液晶電源をオフとする

    nop

    bcf        GPIO,1        ;clkをオフとする

    nop

    bcf        GPIO,0        ;SDAをオフとする

    nop

    ;注電源終了までの待ち時間は別途確保する

    return

 

;******************コントラストのC3,C2,C1,C0部分を変更する*********************

Cont3210

;FANCTION set

    movlw    B'10000000'

    movwf    txdata

    call    TX

    movlw    39h            ;FUNCTION SET (拡張コマンド選択)

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

;コントラストを変えるtx_conがデータ

    movlw    B'10000000'

    movwf    txdata

    call    TX

    movfw    tx_con

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

;FANCTION set

    movlw    B'10000001'

    movwf    txdata

    call    TX

    movlw    39h            ;FUNCTION SET (ノーマルコマンド選択)

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

    return

 

;画面クリア****************************************************************

clear01

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    01h            ;CLEAR DISPLAY

    movwf    txdata

    call    TX

    call    T2mWAIT        ;2ms時間待ち

    return

 

;*******************2行目左端下に”1”を記述(初期設定0を1に変更する)*************

moji_1

    call    gyou_2        ;左下に表示

    movlw    "1"            ;1 と表示

    movwf    txdatax

    call    TXx

    return

 

;1行目を左端を指定********************************************************

gyou_1

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    B'10000000'    ;アドレス指定

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

    return

 

;2行目左端を指定*********************************************************

gyou_2

    movlw    B'10000000'

    movwf    txdata

    call    TX

    call    TIME10STEP    ;10μs時間待ち    

    movlw    B'11000000'    ;アドレス指定

    movwf    txdata

    call    TX

    call    TIME100STEP    ;100μs時間待ち

    return

 

 

; ********* 簡易データ送信サブルーチン(表示後表示アドレスは右に一文字分ずれる)**********

TXx

    movlw    B'11000000'    ;データ継続でデータオペレーションするとの信号を送信

    movwf    txdata

    call    TX

    movfw    txdatax    

    movwf    txdata                    

    call    TX

    call    TIME10STEP    ;10μs時間待ち

    call    TIME10STEP    ;10μs時間待ち

    call    TIME10STEP    ;10μs時間待ち

    return

 

; ********* txdataを送信するサブルーチン ************************************

;---------------------------------------TX-----------------------------

TX

    movlw    08H        

    movwf    tx_bit    ; 1バイト=8ビット繰り返し用カウンタ

;1.データの送信

TXLoop

;(1)SDA操作

    btfsc    txdata, 7    ; 書き込みデータ(7bit目)が0の場合スキップしてSDAをLOWに

    goto    sdalow        ; 

    bcf        GPIO,0        ; 書き込みビットが0の場合SDAをLOW

    nop

    goto    clkhigh        ; クロック操作へジャンプ

sdalow

    bsf        GPIO,0        ; 書き込みビットが1の場合:SDAをHIGHにする

    nop    

    nop                    ;temp

;(2)CLC操作

clkhigh

    bsf        GPIO,1        ; SCLをHighにする

    nop

    nop

    nop

    bcf        GPIO,1        ; SCLをLowにする。

    nop    

;(3)データ操作

    rlf        txdata, f    ; 送信データバイトをシフトする

    decfsz    tx_bit, f    ; 8ビット送信終わったか?

    goto    TXLoop        ; 終わるまでループ

 

;2.ACKビット受信

    bsf        STATUS, RP0

    bsf        TRISIO,0    ; SDAポートを入力にする

    bcf        OPTION_REG,7; プルアップ有効にする

    bcf        STATUS, RP0

    nop

    nop    

    bsf        GPIO,1        ; SCLをHighにする

    nop

    btfsc    GPIO,0       ; SDAポートからの入力がlow(ACKした)場合スキップ

    bcf        GPIO,2        ; ポート2(スピーカの出力を借用)をLOWにする 

    nop

    bcf        GPIO,1        ; SCLをLowにする

    nop

    bsf        STATUS, RP0

    bcf        TRISIO,0    ; SDAポートを出力に戻す

    bcf        STATUS, RP0

    bcf        GPIO,0        ; SDAをLowにする                   20171001変更    

    nop

    bsf        GPIO,2        ; ポート2(スピーカの出力を借用)をhighにもどす

    nop

    return

 

;************************ スタートビット発生サブルーチン  *************************

BSTART

    bsf        GPIO,0        ; まずSDAをHighにする

    nop            

    nop

    nop

    nop

    bsf        GPIO,1        ; SCLをHighにする

    nop

    nop

    nop

    nop    

    bcf        GPIO,0        ; SCLがHighの間にSDAをLowにする

    nop        

    nop

    nop            

    nop    

    bcf        GPIO,1        ; SCLをLowに戻す。

    nop

    nop

    nop

    nop

    return

 

;*********************** ストップビット発生サブルーチン **************************

BSTOP

    bcf        GPIO,0        ; まずSDAをLowにする

    nop

    nop

    nop

    nop

    bsf        GPIO,1        ; SDAがLOWで安定してるときにSCLをHighにする

    nop

    nop    

    nop

    nop

    bsf        GPIO,0        ; SCLがHighの間にSDAをHighにする。

    nop    

    nop

    nop

    nop

    return

 

;**********************文字列処理****************************************

;MsgNO番号に応じたメッセージを表示する-MgsNOに番号を入れてからコールする---------------

MSG01

    clrf    h_count

loop_x01    

    movfw    MsgNO        ;PCLに加算する数をワークレジスタに入れサブルーチンをコールする    

    call    MOJI_ALL

    movwf    txdatax

    call    TXx

    incf    MsgNO

    incf    h_count

    btfss    h_count,3    ;8個データ処理したら戻る(文字数は8個ずつに限定)

    goto    loop_x01    

    return

 

 

;*******************************文字列***********************************

 

    org    0x390

MOJI_ALL

    clrf    PCLATH

    bsf        PCLATH,0

    bsf        PCLATH,1

    addwf    PCL,f

;0

    retlw    "O"

    retlw    "N"

    retlw    " "

    retlw    "Y"

    retlw    "O"

    retlw    "U" 

    retlw    "R"

    retlw    " "

;8

    retlw    " "

    retlw    " "

    retlw    "M"

    retlw    "A"

    retlw    "R"

    retlw    "K"

    retlw    " "

    retlw    " "

;16

    retlw    " "

    retlw    " "

    retlw    "S"

    retlw    "E"

    retlw    "T"

    retlw    " "

    retlw    " "

    retlw    " "

;24

    retlw    "ナ"

    retlw    "カ"

    retlw    "゙"

    retlw    "オ"

    retlw    "シ"

    retlw    "テ"

    retlw    "゙"

    retlw    " "

;32

    retlw    "キ"

    retlw    "ノ"

    retlw    "ウ"

    retlw    "セ"

    retlw    "ッ"

    retlw    "テ"

    retlw    "イ"

    retlw    " "

 

;40

    retlw    "カ"

    retlw    "゙"

    retlw    "メ"

    retlw    "ン"

    retlw    "ス"

    retlw    "ウ"

    retlw    " "

    retlw    " "

 

;48

    retlw    "オ"    

    retlw    "フ"

    retlw    "ヘ"

    retlw    "ノ"

    retlw    "シ"

    retlw    "゙"

    retlw    "カ"

    retlw    "ン"

;56

    retlw    "ケ"

    retlw    "イ"

    retlw    "ソ"

    retlw    "ク"

    retlw    " "

    retlw    "チ"

    retlw    "エ"

    retlw    "ン"

;64

    retlw    " "

    retlw    " "

    retlw    B'00000110'

    retlw    "="

    retlw    "ヘ"

    retlw    "ン"

    retlw    "コ"

    retlw    "ウ"

;72

    retlw    "v"

    retlw    "."

    retlw    "1"

    retlw    "8"

    retlw    "0"

    retlw    "4"

    retlw    "2"

    retlw    "2"

;80

    retlw    "セ"

    retlw    "ッ"

    retlw    "テ"

    retlw    "イ"

    retlw    "イ"

    retlw    "チ"

    retlw    "ラ"

    retlw    "ン"

;88

    retlw    "コ"

    retlw    "ン"

    retlw    "ト"

    retlw    "ラ"

    retlw    "ス"

    retlw    "ト"

    retlw    " "

    retlw    " "

 

    end