; 2007/4/22のバグ修正内容 ; ポートが入力設定のときに出力していたので修正した。 ; 具体的にはINT_ACブロック、PLUSブロック、MINUSブロックをINT_SEGブロック ; の後ろに移した。 ;******************************************************************** ; 100円電卓LCD動作検証プログラム 4MHz用 ;******************************************************************** LIST P=PIC16F84A INCLUDE "P16F84A.INC" __config _HS_OSC & _WDT_OFF & _PWRTE_OFF ;**************************************************** ; CBLOCK H'0C' CCLECNT ; サイクルカウンタ ONESCNT ; 1秒カウンタ PM_FLG ; プラスマイナスフラグ CC_CNT ; 文字変化カウンタ TB_OFFST MULW ENDC ONECCLE SET D'3' CHARMAX SET D'11' ; 0123456789. ORG 0 GOTO START ORG H'4' ;**************************** ; 割り込みルーチン ;**************************** ; 4ms毎に割り込み INTPR BCF INTCON,T0IF ; 割り込み要因クリア ; セグメント処理(毎回) INT_SEG ; CC_CNT x ONECCLE(ONECCLEは3以下、結果は8bit以内に限定の簡易掛け算) MOVLW ONECCLE MOVWF MULW ; MULWにコピー MOVF CC_CNT,W MOVWF TB_OFFST ; TB_OFFSTにコピー BTFSS MULW,1 ; ONECCLEの2bit目を判定 GOTO $+4 ; TB_OFFSTをクリアしにいく BCF STATUS,C RLF TB_OFFST,F ; TB_OFFSTx2をTB_OFFSTにセットする GOTO $+2 CLRF TB_OFFST BTFSS MULW,0 ; ONECCLEの1bit目を判定 GOTO $+3 ; そのまま次の処理に移る MOVF CC_CNT,W ADDWF TB_OFFST,W ; 現在のTB_OFFSTにCC_CNTを足したものWREGにセット ; ; WREG上の(CC_CNT x ONECCLE)にCCLECNTを足す ADDWF CCLECNT,W CALL TRIS_TABLE ; (CC_CNT x ONECCLE)+CCLECNTの位置にあるデータを取ってくる BSF STATUS,RP0 ; バンク1へ切替 MOVWF TRISB BCF STATUS,RP0 ; バンク0に戻す INT_CCLE INCF CCLECNT,F MOVLW ONECCLE SUBWF CCLECNT,W BTFSS STATUS,Z ; CCLECNTがONECCLEに達したか判定 GOTO INT_ONES CLRF CCLECNT ; CCLECNT初期化 INT_ONES INCF ONESCNT,F BTFSS STATUS,Z ; 1秒に達したか判定 GOTO INT_AC ; 1秒毎の文字の切替 INCF CC_CNT,F ; 文字を周期的に循環 MOVF CC_CNT,W SUBLW CHARMAX BTFSC STATUS,C ; CC_CNTがCHARMAXを超えたか判定 GOTO INT_AC CLRF CC_CNT ; CC_CNTがCHARMAXを超えていた場合 ; 交流作成処理(ONECCLE回に1回(CCLECNT=0の時のみ)) INT_AC MOVF CCLECNT,F BTFSS STATUS,Z GOTO INT_END ; プラスマイナスのトグル処理 MOVLW D'128' ADDWF PM_FLG,F BTFSC STATUS,Z GOTO MINUS PLUS MOVLW B'11110000' MOVWF PORTB GOTO INT_END MINUS MOVLW B'00001111' MOVWF PORTB INT_END RETFIE ;**************************** ; TRISB値テーブル ;**************************** TRIS_TABLE ADDWF PCL,F ; PC+OFFSET DT B'11000110' DT B'10100101' DT B'11000011' DT B'11110110' DT B'10110101' DT B'11010011' DT B'11010110' DT B'10000101' DT B'11100011' DT B'11010110' DT B'10010101' DT B'11000011' DT B'11100110' DT B'10010101' DT B'11010011' DT B'11000110' DT B'11010101' DT B'11000011' DT B'11000110' DT B'11000101' DT B'11000011' DT B'11000110' DT B'10110101' DT B'11010011' DT B'11000110' DT B'10000101' DT B'11000011' DT B'11000110' DT B'10010101' DT B'11000011' DT B'11110110' DT B'11110101' DT B'10110011' ;**************************** ; プログラム開始 ;**************************** START CLRF ONESCNT CLRF PM_FLG CLRF CCLECNT CLRF CC_CNT ; TMR0設定 BSF STATUS,RP0 ; バンク1へ切替 MOVLW B'11010011' MOVWF OPTION_REG ; ポートBプルアップOFF、TMR0クロックinternal、プリスケーラ=1:16 BCF STATUS,RP0 ; バンク0へ切替 ; 割り込み設定 MOVLW B'10100000' MOVWF INTCON ; グローバル割り込み,タイマ0割り込み許可,ポートB割り込み禁止 ;**************************** ; ループ開始 ;**************************** GOTO $ END