<プログラム>
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