未成年飲酒喫煙防止カレンダーを作成したい その4
うるう年のチェックはこんな感じ・・・
「400で割り切れる」だの、「100で割り切れる」だのはここ数年関係ないし、今から30年分くらいあればいいだろうし(死んでるかも、笑)
かなり野蛮なプログラム・・・
;---------カレンダー用テーブルデータ------------------------------------------------
TB_U ;うるう年の判断テーブル (YEAR1と比較)
ADDWF PCL
DT D'92',D'96',D'0',D'4',D'8',D'12',D'16',D'20',D'24',D'28'
TB_TDAY ;うるう年で無い月別日数(DAYの桁上がり)0番目はダミー
ADDWF PCL
DT D'0',D'32',D'29',D'32',D'31',D'32',D'31',D'32'
DT D'32',D'31',D'32',D'31',D'32'
TB_UDAY ;うるう年の月別日数(DAYの桁上がり)0番目はダミー
ADDWF PCL
DT D'0',D'32',D'30',D'32',D'31',D'32',D'31',D'32'
DT D'32',D'31',D'32',D'31',D'32'
---------< 中略 >-------------------------------------------------------------
以下はTMR0の割込ルーチン中で時間とカレンダーのカウントアップを行う。
;------- 時間計算 カウントアップ ------------------------------------------------
INCF SEC1,F ; SEC1+1→SEC1 1秒カウントアップする。
MOVLW D'10' ; 秒1ケタ目
SUBWF SEC1,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF SEC1 ; 0 → SEC1
INCF SEC10,F ; SEC10+1→SEC10
MOVLW D'6' ; 秒2ケタ目
SUBWF SEC10,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF SEC10 ; 0 → SEC10
INCF MIN1,F ; MIN1+1→MIN1
MOVLW D'10' ; 分1ケタ目
SUBWF MIN1,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF MIN1 ; 0 → MIN1
INCF MIN10,F ; MIN10+1→MIN10
MOVLW D'6' ; 分2ケタ目
SUBWF MIN10,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF MIN10 ; 0 → MIN10
INCF HOUR,F ; HOUR+1→HOUR
MOVLW D'24' ; 時間2ケタ分まとめて
SUBWF HOUR,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF HOUR ; 0 → HOUR
;----- 日付カウントアップ まずうるう年のチェック---------------------------------------
CLRF POINT ; テーブルポインタのリセット
TB_U_R
MOVF POINT,W ; テーブルポインタの値をWregへロードする(OFFSET)
CALL TB_U ; うるう年テーブルを呼び出す
SUBWF YEAR1,W ; YEAR1-TB_U (例;96-96=0)読み出し値
BTFSC STATUS,Z ; 演算結果がゼロかチェック ゼロ1 ゼロでない0
GOTO U_DATE1 ; 1の時一致でうるう年U_DATEへジャンプ
MOVLW D'9' ; 0の時一致しない
SUBWF POINT,W ; POINT-9
BTFSC STATUS,Z ; 演算結果がゼロかチェック ゼロ1 ゼロでない0
GOTO DATE1 ; 1の時うるう年でないのでDATE1へ
INCF POINT,F ; 0の時次をチェックの為テーブルポインタ +1
GOTO TB_U_R ; TB_U_R のラベルへ戻り繰り返す
U_DATE1 ;------うるう年----------------------------------------------------
INCF DAY,F ; DAY+1→DAY
MOVF MON,W
CALL TB_UDAY
SUBWF DAY,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 1H
MOVWF DAY ; 1 → DAY
GOTO MON1
DATE1 ;------うるう年でない----------------------------------------------
INCF DAY,F ; DAY+1→DAY
MOVF MON,W
CALL TB_TDAY
SUBWF DAY,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 1H
MOVWF DAY ; 1 → DAY
; --------------------------------------------------------------------------
MON1 INCF MON,F ; MON+1→MON
MOVLW D'13' ; 月2ケタ分まとめて
SUBWF MON,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 1H
MOVWF MON ; 1 → MON
INCF YEAR1,F ; YEAR1+1→YEAR1
MOVLW D'100' ; 年下2ケタ分まとめて
SUBWF YEAR1,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF YEAR1 ; 0 → YEAR1
INCF YEAR2,F ; YEAR2+1→YEAR2
MOVLW D'100' ; 年上2ケタ分まとめて
SUBWF YEAR2,W
BTFSS STATUS,C
GOTO CLKEND
MOVLW 0H
MOVWF YEAR2 ; 0 → YEAR2
CLKEND
---------< 中略 >-------------------------------------------------------------
プログラム書いてる時は集中してるから理解出来るんだけど、注釈付けても後から見返すとサッパリ忘れている(笑)
HP「ジムニーおや爺の部屋」
http://homepage3.nifty.com/jimny-oyaji/
自転車 サイクリング 電子工作
PIC 16F84A
プリント基板
ジムニー JA12W ノア AZR65G



![: トランジスタ技術 (Transistor Gijutsu) 2007年 12月号 [雑誌]](http://ecx.images-amazon.com/images/I/51%2B6xOW4gmL._SL75_.jpg)



































![: トランジスタ技術 (Transistor Gijutsu) 2008年 02月号 [雑誌]](http://ecx.images-amazon.com/images/I/512TT9%2BfugL._SL75_.jpg)













最近のコメント