⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 程序.txt

📁 此源码是我从一篇日本论文中摘下来的
💻 TXT
📖 第 1 页 / 共 3 页
字号:
END_TRUE BCF INTST,IC
BSF INTCON,INTE ;INT割り込みに
BSF STATUS,RP0
BCF PIE1,CCP1IE ;CCP割り込み禁止
BCF STATUS,RP0
BSF CODEST,EDCD ;1命令受信フラグon
END_TRUE1 MOVF CODECNT1,W
BTFSC STATUS,Z
GOTO END_TRUE2
BCF STATUS,C
88
RLF IRCODE0,F ;IRCODE 左に1bit シフト
RLF IRCODE1,F
RLF IRCODE2,F
RLF IRCODE3,F
DECF CODECNT1,F
GOTO END_TRUE1
END_TRUE2 MOVF CODECNT2,W
SUBLW DT_LONG
BTFSC STATUS,Z
GOTO COMP_CODE1 ;1回目ならCOMP_CODE1 へ
GOTO COMP_CODE2 ;それ以外ならCOMP_CODE2 へ
COMP_CODE1 MOVF IRCODE0,W ;1 回目は比較用の変数に代入す
るだけ
MOVWF CPCODE0
MOVF IRCODE1,W
MOVWF CPCODE1
MOVF IRCODE2,W
MOVWF CPCODE2
MOVF IRCODE3,W
MOVWF CPCODE3
DECF CODECNT2,F
GOTO END_INT
COMP_CODE2 MOVF CPCODE0,W ;前の状態と比較して
SUBWF IRCODE0,W ;違ったらCOMP_ERR へ
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF CPCODE1,W
SUBWF IRCODE1,W
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF CPCODE2,W
SUBWF IRCODE2,W
BTFSS STATUS,Z
GOTO COMP_ERR
89
MOVF CPCODE3,W
SUBWF IRCODE3,W
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF IRCODE0,W ;合致したので変数に代入
MOVWF CPCODE0
MOVF IRCODE1,W
MOVWF CPCODE1
MOVF IRCODE2,W
MOVWF CPCODE2
MOVF IRCODE3,W
MOVWF CPCODE3
DECFSZ CODECNT2,F
GOTO END_INT
BSF CODEST,FN ;規定回受信したら終了コード吐き出す
GOTO END_INT
;********************* SHARP 判別ルーチン ************************
SELECT_SH BCF INTST,SONY ;SONY フラグOFF
BSF INTST,SHARP ;SHARP フラグON
BCF STATUS,C
MOVLW 02H
MOVWF CODEST2
MOVLW 50H ;RB0割り込み許可,周辺割り込み許可
MOVWF INTCON
BSF STATUS,RP0
BCF PIE1,CCP1IE ;CCP割り込み禁止
BCF STATUS,RP0
MOVLW SH_DTLONG
MOVWF CODECNT2 ;3回受信選択
CALL TIME5M
CALL TIME5M
CALL TIME5M
CALL TIME5M
CALL TIME5M
90
CALL TIME5M ;1回目のデータは捨てる
GOTO END_INT
SH_CODE BTFSC CODEST2,EDCD ;終了フラグ?RB0 割り込み
GOTO SH_RB0INT
BTFSC CODEST2,STRT ;開始フラグ?CCP 割り込み
GOTO SH_CCPINT
BTFSC CODEST2,HIRD ;H/L フラグ?スペシャルイベントトリガ
GOTO SH_HI_CODE ;HならHI_CODE
GOTO SH_LO_CODE ;LならLO_CODE
SH_RB0INT BTFSS INTCON,INTF
GOTO RB0_ERR
BCF INTCON,INTE ;INT割り込み禁止
BSF INTCON,PEIE
MOVLW 0AH ;コンペアモード設定
MOVWF CCP1CON
MOVLW 0H
MOVWF CCPR1H ;コンペア値
MOVLW 0D0H ;16+7+223=250
MOVWF CCPR1L
CLRF TMR1H
CLRF TMR1L ;TMR1クリア(割り込み発生からここまで18CYC)
BCF PIR1,CCP1IF ;CCPフラグクリア
BSF STATUS,RP0
BSF PIE1,CCP1IE ;CCP割り込み許可
BCF STATUS,RP0
BCF CODEST2,EDCD
BSF CODEST2,STRT ;次回からの割り込みをCCPに
GOTO END_INT
SH_CCPINT BTFSS PIR1,CCP1IF
GOTO CCP_ERR
BTFSS PORTB,0
GOTO READY_ERR
MOVLW 0BH ;スペシャルイベントトリガセット
91
MOVWF CCP1CON
MOVLW 04H
MOVWF CCPR1H
MOVLW 1AH
MOVWF CCPR1L ;コンペア値1065
CLRF TMR1H
CLRF TMR1L ;カウントスタート
BCF PIR1,CCP1IF ;CCP割り込みフラグクリア
BSF STATUS,RP0
BSF PIE1,CCP1IE ;CCP割り込み許可
BCF STATUS,RP0
MOVLW DT_BIT
MOVWF CODECNT1 ;カウンタ初期化
BCF CODEST2,STRT ;スタートフラグクリア
BCF CODEST2,HIRD ;H/L フラグクリア
GOTO END_INT
SH_HI_CODE BTFSS PIR1,CCP1IF
GOTO HI_ERR
BTFSS PORTB,0
GOTO SH_END_CODE
BSF STATUS,C
RLF IRCODE0,F ;IRCODE 左に1bit シフト
RLF IRCODE1,F
RLF IRCODE2,F
RLF IRCODE3,F
BCF CODEST2,HIRD ;H/L フラグクリア
DECF CODECNT1,F
GOTO END_INT
SH_LO_CODE BTFSS PIR1,CCP1IF
GOTO LO_ERR
BTFSS PORTB,0
GOTO SH_NEXT_CODE
BCF STATUS,C
RLF IRCODE0,F ;IRCODE 左に1bit シフト
92
RLF IRCODE1,F
RLF IRCODE2,F
RLF IRCODE3,F
BCF CODEST2,HIRD ;H/L フラグクリア
DECFSZ CODECNT1,F
GOTO END_INT
SH_NEXT_CODE
BSF CODEST2,HIRD
GOTO END_INT
SH_END_CODE
BSF INTCON,INTE ;INT割り込みに
BSF STATUS,RP0
BCF PIE1,CCP1IE ;CCP割り込み禁止
BCF STATUS,RP0
BSF CODEST2,EDCD ;1 命令受信フラグon
SH_END1 MOVF CODECNT1,W
BTFSC STATUS,Z
GOTO SH_END2
BCF STATUS,C
RLF IRCODE0,F ;IRCODE 左に1bit シフト
RLF IRCODE1,F
RLF IRCODE2,F
RLF IRCODE3,F
DECF CODECNT1,F
GOTO SH_END1
SH_END2 MOVF CODECNT2,W
SUBLW SH_DTLONG
BTFSC STATUS,Z
GOTO SH_COMP1 ;1回目ならSH_COMP1へ
GOTO SH_COMP2 ;それ以外ならSH_COMP2 へ
SH_COMP1 MOVF IRCODE0,W ;1 回目は比較用の変数に代入す
るだけ
MOVWF CPCODE0
93
MOVF IRCODE1,W
MOVWF CPCODE1
MOVF IRCODE2,W
MOVWF CPCODE2
MOVF IRCODE3,W
MOVWF CPCODE3
DECF CODECNT2,F
GOTO END_INT
SH_COMP2 MOVF CODECNT2,W
SUBLW 01H
BTFSS STATUS,Z
GOTO SH_COMP3
MOVF IRCODE3,W ;2回目だけここを通る
ANDLW 07H ;上位5bit はシステムコードなので
MOVWF SHBUF ;下位3bit を抜き取る
COMF SHBUF,W ;それを反転
ANDLW 07H
MOVWF SHBUF ;SHBUF に格納
MOVF IRCODE3,W
ANDLW 0F8H ;IRCODE3 の上位5bit を抜き取る
ADDWF SHBUF ;SHBUF に足す
MOVF SHBUF,W
MOVWF IRCODE3 ;IRCODE3 に移す
MOVF IRCODE2,W
ANDLW 0FEH ;2byte めは上位7bit反転
MOVWF SHBUF
COMF SHBUF,W
ANDLW 0FEH
MOVWF SHBUF
MOVF IRCODE2,W
ANDLW 01H ;STOPビットはそのまま残す
ADDWF SHBUF
MOVF SHBUF,W
MOVWF IRCODE2
94
SH_COMP3 MOVF CPCODE3,W ;前の状態と比較して
SUBWF IRCODE3,W ;違ったらCOMP_ERR へ
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF CPCODE2,W
SUBWF IRCODE2,W
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF CPCODE1,W
SUBWF IRCODE1,W
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF CPCODE0,W
SUBWF IRCODE0,W
BTFSS STATUS,Z
GOTO COMP_ERR
MOVF IRCODE0,W ;合致したので変数に代入
MOVWF CPCODE0
MOVF IRCODE1,W
MOVWF CPCODE1
MOVF IRCODE2,W
MOVWF CPCODE2
MOVF IRCODE3,W
MOVWF CPCODE3
SH_CMP_END DECFSZ CODECNT2,F
GOTO END_INT
BSF CODEST,FN ;規定回受信したら終了コード吐き出す
GOTO END_INT
RB0_ERR MOVLW 'b'
MOVWF ERRTEXT
GOTO ERR_CODE
CCP_ERR MOVLW 'c'
MOVWF ERRTEXT
95
GOTO ERR_CODE
READY_ERR MOVLW 'r'
MOVWF ERRTEXT
GOTO ERR_CODE
STRDY_ERR MOVLW 's'
MOVWF ERRTEXT
GOTO ERR_CODE
START_ERR MOVLW 't'
MOVWF ERRTEXT
GOTO ERR_CODE
LO_ERR MOVLW 'l'
MOVWF ERRTEXT
GOTO ERR_CODE
HI_ERR MOVLW 'h' ;3 回続けて'Hi'になっている
MOVWF ERRTEXT
GOTO ERR_CODE
END_ERR MOVLW 'e'
MOVWF ERRTEXT
GOTO ERR_CODE
ALL_ERR MOVLW 'a'
MOVWF ERRTEXT
GOTO ERR_CODE
COMP_ERR MOVLW 'C'
MOVWF ERRTEXT
GOTO ERR_CODE
ERR_CODE BSF CODEST,ERR
BCF INTCON,PEIE
BCF INTCON,INTE
BSF STATUS,RP0
BCF PIE1,CCP1IE
BCF STATUS,RP0
GOTO END_INT
END_INT MOVF FSRSAVE,W
MOVWF FSR
MOVF PCSAVE,W
96
MOVWF PCLATH
MOVF STATUSSAVE,W
MOVWF STATUS ;STATUS復帰
SWAPF WSAVE,F
SWAPF WSAVE,W ;W復帰
BCF INTCON,INTF ;RB0フラグクリア
BCF PIR1,CCP1IF ;CCP割り込みフラグクリア
BCF PORTA,0
RETFIE
;*********************データ送信ルーチン*****************
TRANS_DATA
BCF INTCON,GIE ;割り込み禁止
MOVF IRCODE3,W ;データ移し変え
MOVWF TRDATA3
MOVF IRCODE2,W
MOVWF TRDATA2
MOVF IRCODE1,W
MOVWF TRDATA1
MOVF IRCODE0,W
MOVWF TRDATA0
MOVF CODECNT3,W
MOVWF TRDTCNT ;bit データ量移し変え
MOVLW 05H
MOVWF TRNSCNT ;繰り返し回数セット(5回)
CALL PWM_SET ;38kHz 搬送波セット
TR_0 CALL TMR0_SET
BCF PIR1,TMR1IF
BCF PORTA,4
TR_1 MOVLW 0F6H
MOVWF TMR1H
MOVLW 080H
MOVWF TMR1L ;TMR1<-F680H(2550)
BSF PORTA,4
BTFSS PIR1,TMR1IF ;オーバーフロー監視
GOTO $-1
BCF PIR1,TMR1IF
BCF PORTA,4
MOVLW 0FDH
MOVWF TMR1H
MOVLW 0C5H
MOVWF TMR1L ;TMR1<-FDC5H(480)
BTFSS PIR1,TMR1IF ;オーバーフロー監視
GOTO $-1
BCF PIR1,TMR1IF
TR_2 BCF STATUS,C
RLF TRDATA0,F
RLF TRDATA1,F
RLF TRDATA2,F
RLF TRDATA3,F
BTFSS STATUS,C
GOTO TRNS0
;******************************************** '1'送信
TRNS1 MOVLW 0FBH
MOVWF TMR1H
MOVLW 05AH ;TMR1<-FB5AH
MOVWF TMR1L ;桁あふれまで04A5H(1300us)
BSF PORTA,4 ;RA4'Hi'出力
MOVLW 0DH
MOVWF T1CON ;TMR1 START
BTFSS PIR1,TMR1IF
GOTO $-1 ;1275us になるまで待つ
BCF PIR1,TMR1IF
MOVLW 0FDH
MOVWF TMR1H
MOVLW 0C5H
MOVWF TMR1L
BCF PORTA,4 ;480us RA4'Lo'出力
BTFSS PIR1,TMR1IF
GOTO $-1
BCF PIR1,TMR1IF
98
GOTO TR_3
;******************************************* '0'送信
TRNS0 MOVLW 0FDH
MOVWF TMR1H
MOVLW 0B0H ;TMR1<-FD20H
MOVWF TMR1L ;桁あふれまで02DFH(735us)
BSF PORTA,4 ;RA4'Hi'出力
MOVLW 0DH
MOVWF T1CON ;TMR1 START
BTFSS PIR1,TMR1IF
GOTO $-1 ;735us になるまで待つ
BCF PIR1,TMR1IF
MOVLW 0FDH
MOVWF TMR1H
MOVLW 0C5H
MOVWF TMR1L
BCF PORTA,4 ;480us RA4'Lo'出力
BTFSS PIR1,TMR1IF
GOTO $-1
BCF PIR1,TMR1IF
TR_3 DECFSZ TRDTCNT,F ;送信データを全て送り終えるまで
ループ
GOTO TR_2
BCF PORTA,4
MOVF IRCODE3,W ;データ移し変え
MOVWF TRDATA3
MOVF IRCODE2,W
MOVWF TRDATA2
MOVF IRCODE1,W
MOVWF TRDATA1
MOVF IRCODE0,W
MOVWF TRDATA0
MOVF CODECNT3,W
MOVWF TRDTCNT
99
BTFSS INTCON,T0IF ;TMR0桁あふれ監視
GOTO $-1 ;45ms 経ったら次へ
DECFSZ TRNSCNT,F
GOTO TR_0
CALL CCP_SET ;受信用CCP 再設定
RETURN
;******************** 38kHz 送信波生成 ********************
PWM_SET
BSF STATUS,RP0
MOVLW 08H
MOVWF PORTA ;RA3入力
MOVLW 19H
MOVWF PR2 ;PWM周期26usec
BCF STATUS,RP0
MOVLW 0CH
MOVWF CCP1CON ;CCPモード設定:PWM モード
CLRF CCPR1H
MOVLW 0DH
MOVWF CCPR1L ;DUTY13usec
MOVLW 04H
MOVWF T2CON ;PWM START
RETURN
;****************** TMR0 設定 ***********************
TMR0_SET
BSF STATUS,RP0
MOVLW 47H
MOVWF OPTION_REG ;TMR0プリスケーラ1:256
BCF STATUS,RP0
BCF INTCON,T0IF
MOVLW 4FH ;79*256*1us=45056us
MOVWF TMR0 ;タイマ0 初期値79設定
RETURN
;****************** 受信CCPセット *******************
100
CCP_SET
MOVLW 50H ;RB0割り込み許可,周辺割り込み許可
MOVWF INTCON
MOVLW 01H ;TMR1 動作→内部クロック、プリスケーラ1:1、オシ
レータ非動作
MOVWF T1CON
MOVLW 0AH ;CCPモード設定:コンペア割り込み
MOVWF CCP1CON
BSF STATUS,RP0
CLRF PIE1
BCF STATUS,RP0
CLRF TMR1H
CLRF TMR1L
CLRF PORTB
CLRF CODEST
MOVLW DT_LONG
MOVWF CODECNT2
BSF CODEST,EDCD
BSF INTCON,GIE ;割り込み許可
RETURN
;******************* 送信完了表示ルーチン *******************
TRANS_CMPLT
MOVLW 80H ;ADDRES SET 2行目
CALL LCD_CMD
CLRF TEXTCNT
MOVLW 07H
MOVWF PCLATH
TR_TEST0 MOVF TEXTCNT,W
CALL TRANS_OUT
CALL LCD_DATA
INCF TEXTCNT,F
MOVLW 10H
SUBWF TEXTCNT,W
101
BTFSS STATUS,Z
GOTO TR_TEST0
CALL TIME1S
CALL TIME1S
CALL TITLE_DISP
RETURN
;***************************************************
; LCD control routines
;***************************************************
;**** LCD Data Write ****
LCD_DATA
MOVWF DPDT ;save dat
ANDLW 0F0H
MOVWF LCDDT ;output upper
; BCF LCDCNT,RW ;R/W
BSF LCDCNT,RS ;RS high
BSF LCDCNT,STB ;E high
BCF LCDCNT,STB ;E low
SWAPF DPDT,W ;output lower
ANDLW 0F0H
MOVWF LCDDT
BSF LCDCNT,RS ;RS high
BSF LCDCNT,STB ;E high
BCF LCDCNT,STB ;E low
CALL TIME1M
RETURN
;**** LCD command out *****
LCD_CMD
MOVWF DPDT ;save dat
ANDLW 0F0H
MOVWF LCDDT ;output upper
; BCF LCDCNT,RW ;R/W
BCF LCDCNT,RS ;RS low
102
BSF LCDCNT,STB ;E high
BCF LCDCNT,STB ;E low
SWAPF DPDT,W ;output lower
ANDLW 0F0H
MOVWF LCDDT
BSF LCDCNT,STB
BCF LCDCNT,STB
CALL TIME1M
RETURN
;**** LCD Display Clear ****
LCD_CLR
MOVLW 01H ;clear command
CALL LCD_CMD
RETURN
;***************** 8BIT_MODE ********************
LCD_CMD8
MOVWF LCDDT
; BCF LCDCNT,RW ;R/W
BCF LCDCNT,RS ;RS
BSF LCDCNT,STB ;E high
BCF LCDCNT,STB ;E low
CALL TIME1M
RETURN
;**** Initialize *****
LCD_INI
CLRF LCDDT
CALL TIME5M
CALL TIME5M
CALL TIME5M ;wait
MOVLW 30H ;Function set 8bits
CALL LCD_CMD8
CALL TIME5M
MOVLW 30H ;Function reset 8bits
CALL LCD_CMD8
103
MOVLW 30H ;Function reset 8bits
CALL LCD_CMD8
MOVLW 20H ;Function set 4bits mode
CALL LCD_CMD8 ;function DL=0 4bit mode
MOVLW 28H
CALL LCD_CMD
MOVLW 08H
CALL LCD_CMD
MOVLW 01H
CALL LCD_CMD
MOVLW 06H
CALL LCD_CMD
MOVLW 0CH
CALL LCD_CMD ;Cursur on
RETURN
;**** LCD Busy Check ************
LCD_BUSY
BSF STATUS,RP0 ;Bank 1
MOVLW 0FFH ;PORTB input
MOVWF TRISB
BCF STATUS,RP0 ;Bank 0
BCF LCDCNT,RS ;RS low
; BSF LCDCNT,RW ;R/W high
BSF LCDCNT,STB ;E high
MOVF LCDCNT,W ;get upper
BCF LCDCNT,STB ;E low
ANDLW 0F0H ;Mask out lower
MOVWF DPDT
MOVF LCDCNT,W ;get upper
BSF LCDCNT,STB ;E high
SWAPF DPDT,F ;get lower
BCF LCDCNT,STB ;E low
ANDLW 0FH ;Mask out upper

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -