📄 程序.txt
字号:
MOVLW 0x80 ;周辺割り込み不可(TMR0 は使用せず)
MOVWF INTCON
RETURN
;******************************************
; タイトル表示ルーチン
;******************************************
TITLEDSP
MOVLW 0H
MOVWF TITLCNT
MOVLW 80H
CALL LCD_CMD
TITL_LP
MOVLW 03H
MOVWF PCLATH
MOVF TITLCNT,W
CALL TITLMEM
CALL LCD_DATA
INCF TITLCNT,F
MOVLW 10H
SUBWF TITLCNT,W
BTFSS STATUS,Z
GOTO TITL_LP
RETURN
71
;*********************************
; タイマーサブルーチン
; TIME10 :10usec
; TIME100 :100usec
; TIME1M :1msec
; TIME5M :5msec
; TIM1S :1sec
;*********************************
TIME100 ;100usec
MOVLW 9H
MOVWF CNT1
T_LP1 CALL TIME10 ;2+(26+3)*9-1=262
DECFSZ CNT1,F
GOTO T_LP1
RETURN ;264*0.4=106usec(about)
TIME10 ;10usec
MOVLW 7H
MOVWF CNT2
T_LP2 DECFSZ CNT2,F ;2+3*7-1=22
GOTO T_LP2
RETURN ;22+2=24
TIME1M ;1msec(about)
MOVLW 0AH
MOVWF CNT3
T_LP3 CALL TIME100 ;2+(266+3)*10-1=2691
DECFSZ CNT3,F
GOTO T_LP3
RETURN ;2693
TIME5M ;5msec(about)
MOVLW 38H
MOVWF CNT4
72
T_LP4 CALL TIME100 ;2+(266+3)*56-1=15065
DECFSZ CNT4,F
GOTO T_LP4
RETURN ;15067
TIM1S
MOVLW 0C8H ;set 200
MOVWF CNT5
T_LP5 CALL TIME5M
DECFSZ CNT5,F
GOTO T_LP5
RETURN
ORG 300H
TITLMEM
ADDWF PCL,F
RETLW 'U'
RETLW 'l'
RETLW 't'
RETLW 'r'
RETLW 'a'
RETLW 'S'
RETLW 'o'
RETLW 'n'
RETLW 'i'
RETLW 'c'
RETLW ' '
RETLW '4'
RETLW '0'
RETLW 'k'
RETLW 'H'
RETLW 'z'
ORG 320H
FRQ_MEM
ADDWF PCL,F
73
RETLW 'F'
RETLW 'r'
RETLW 'e'
RETLW 'q'
RETLW 'u'
RETLW 'e'
RETLW 'n'
RETLW 'c'
RETLW 'y'
RETLW ':'
ORG 330H
FRQ_TABLE
ADDWF PCL,F
RETLW '5'
RETLW '7'
RETLW '5'
RETLW '0'
RETLW '4'
RETLW '1'
RETLW '3'
RETLW '8'
RETLW '3'
RETLW '5'
RETLW '3'
RETLW '1'
RETLW '2'
RETLW '9'
RETLW '2'
RETLW '4'
ORG 350H
TR_DISP_MEM
ADDWF PCL,F
RETLW 'k'
RETLW 'H'
74
RETLW 'z'
END
75
リスト2 赤外線コード送受信機プログラムリスト
;**************************************************************
; 赤外線受信コード表示プログラム for 16F628
;**************************************************************
LIST P=16F628
INCLUDE "P16F628.INC"
__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF &_PWRTE_ON & _XT_OSC
&_MCLRE_ON
CBLOCK 20H
DISPCODE0,DISPCODE1,DISPCODE2,DISPCODE3
DISPCODE4,DISPCODE5,DISPCODE6,DISPCODE7 ;コード表示変数
IRCODE0,IRCODE1,IRCODE2,IRCODE3 ;受信コード(4Byte)
CPCODE0,CPCODE1,CPCODE2,CPCODE3 ;比較用変数
TRDATA0,TRDATA1,TRDATA2,TRDATA3 ;送信用変数
CODECNT1,CODECNT2,CODECNT3 ;受信コードカウント
(CODECNT3 は何ビット受信したか数える)
FSRTEMP0,FSRTEMP1 ;,FSR保存レジスタ
DISPTEMP,CODEST,CODEST2,STRTCNT ;表示仮バッファ,
受信状態フラグ,スタート準備カウント
EXCODE ;ASCII変換バッファ
TEXTCNT,OUTCNT ;テキスト,コード表示カウンタ
ERRTEXT ;エラー番号
INTST ;割り込みステータス
TRDTCNT,TRNSCNT,TRNSCNT2 ;送信データカウンタ
SHBUF ;SHARP変換時変数仮置き
DPDT ;LCD各変数
CNT1,CNT2,CNT3,CNT4,CNT5
WSAVE,STATUSSAVE,FSRSAVE,PCSAVE ;ステータス退避
先
ENDC
;*************************************
; ポートの割付定義
;*************************************
LCDCNT EQU PORTB ;Control PORT
LCDDT EQU PORTB ;DATA PORT
STB EQU 1H ;RB1
RS EQU 2H ;RB2
;RW EQU 3H ;RB3 書き込みだけなので使用せず
ERR EQU 0H ;受信エラーフラグ
EDCD EQU 1H ;1byte 受信終了フラグ
RB0 EQU 2H ;割り込み選別フラグ0->INT 1->CCP
STRT EQU 3H ;受信開始フラグ
FN EQU 4H ;全体受信終了フラグ
HIRD EQU 5H ;1?フラグ
LORD EQU 6H ;DATA 読み込み'Hi'認識
EDRD EQU 7H ;終了判別フラグ
IC EQU 0H ;割り込み判別
SHARP EQU 1H
SONY EQU 2H
DT_LONG EQU 5H ;受信データの数
SH_DTLONG EQU 2H ;↑のSHARP Ver.
DT_BYTE EQU 8H ;受信データ長(DT_BYTE/2)Byte
DT_BIT EQU 20H ;受信Bit 数
ORG 0H
GOTO INIT
ORG 4H
GOTO INTERAPT
;******************初期設定*************************
INIT
BSF STATUS,RP0
MOVLW 40H ;PullUp-on INT-fallingEdge
MOVWF OPTION_REG
MOVLW 08H
MOVWF TRISA ;RA3入力
77
MOVLW 01H
MOVWF TRISB ;RB0入力
BCF STATUS,RP0
MOVLW 50H ;RB0割り込み許可,周辺割り込み許可
MOVWF INTCON
MOVLW 01H ;TMR1 動作→内部クロック、プリスケーラ1:1、オシ
レータ非動作
MOVWF T1CON
MOVLW 0AH ;CCPモード設定:コンペア割り込み
MOVWF CCP1CON
MOVLW 07H
MOVWF CMCON ;コンパレータ使わない
GOTO MAIN
;************************メインルーチン*****************
MAIN
CLRF PORTA
CLRF PORTB
CALL LCD_INI ;LCD初期化
CALL TITLE_DISP ;タイトル表示
CLRF TMR1H
CLRF TMR1L
CLRF CODEST
CLRF INTST
MOVLW DT_LONG
MOVWF CODECNT2
CLRF CODECNT3
BSF INTCON,GIE ;割り込み許可
BSF CODEST,EDCD
MOVLW 20H ;ここから
MOVWF FSR ;↓
MOVLW DT_BYTE ;↓
MOVWF OUTCNT ;↓
CLR_CODE CLRF INDF ;↓
INCF FSR,F ;↓
DECFSZ OUTCNT,F ;↓
78
GOTO CLR_CODE ;ここまで表示変数クリア
MAIN_LP BTFSC CODEST,FN
CALL CODE_DISP ;コード表示
BTFSC CODEST,ERR
CALL ERROR_DISP
BTFSC PORTA,3 ;スイッチが押されてなければ
GOTO MAIN_LP ;MAIN_LPへ
MAIN0 BTFSS PORTA,3
GOTO MAIN0 ;スイッチが離されるまで待つ
CALL TRANS_DATA
CALL TRANS_CMPLT ;"TransmitComplete"表示
GOTO MAIN_LP
;********************* 液晶表示変換 *************************
DISP_CHANGE:
BCF INTCON,GIE
MOVLW 27H
MOVWF FSRTEMP0
MOVLW 2BH
MOVWF FSRTEMP1 ;IRCODE0 の番地
D_CHANGE0 MOVF FSRTEMP1,W ;上位4BIT格納
MOVWF FSR
SWAPF INDF,W ;IRCODE取得
ANDLW 0FH
CALL EXCHANGE
MOVWF DISPTEMP ;バッファに仮置き
MOVF FSRTEMP0,W
MOVWF FSR
MOVF DISPTEMP,W
MOVWF INDF ;DISPCODE に書き込み
DECF FSRTEMP0,F
MOVF FSRTEMP1,W ;下位4BIT格納
MOVWF FSR
MOVF INDF,W ;IRCODE取得
ANDLW 0FH
CALL EXCHANGE
79
MOVWF DISPTEMP ;バッファに仮置き
MOVF FSRTEMP0,W
MOVWF FSR
MOVF DISPTEMP,W
MOVWF INDF ;DISPCODE に書き込み
DECF FSRTEMP1,F
DECF FSRTEMP0,F
MOVF FSRTEMP0,W
SUBLW 1FH
BTFSS STATUS,Z
GOTO D_CHANGE0
BCF PIR1,CCP1IF
BCF INTCON,INTF
MOVLW 0D0H
MOVWF INTCON
BSF STATUS,RP0
BCF PIE1,CCP1IE
BCF STATUS,RP0
RETURN
;****************** ASCII CODE 変換 ****************
EXCHANGE ;割り込みがないとCODE の中身が30H な
ので
MOVWF EXCODE ;これをなんとかするルーチンを考える
MOVLW 0AH
SUBWF EXCODE,W
BTFSC STATUS,C ;0-9までか調べる
GOTO OVER9 ;A-FならOVER9 へ
MOVLW 30H
ADDWF EXCODE,W ;30Hを足して'0'-'9'に変換
GOTO EX_END
OVER9 MOVWF EXCODE
MOVLW 41H
ADDWF EXCODE,W ;40Hを足して'A'-'F'に変換
EX_END RETURN
80
;*****************タイトル表示***********************
TITLE_DISP
CLRF TEXTCNT
MOVLW 80H ;ADDRES SET 1行目
CALL LCD_CMD
TITL_LP MOVLW 07H
MOVWF PCLATH
MOVF TEXTCNT,W
CALL TITLMEM
CALL LCD_DATA
INCF TEXTCNT,F
MOVLW 10H
SUBWF TEXTCNT,W
BTFSS STATUS,Z
GOTO TITL_LP
MOVLW 0C0H
CALL LCD_CMD
RETURN
;***************** メーカー表示 **********************
IRCODE_DISP:
CLRF TEXTCNT
MOVLW 0C0H ;ADDRES SET 2行目
CALL LCD_CMD
BTFSS INTST,SONY
GOTO IRCODE_LP1
IRCODE_LP0 MOVLW 07H
MOVWF PCLATH
MOVF TEXTCNT,W
CALL SONY_OUT
CALL LCD_DATA
INCF TEXTCNT,F
MOVLW 06H
SUBWF TEXTCNT,W
BTFSS STATUS,Z
GOTO IRCODE_LP0
81
GOTO IRCODE_RET
IRCODE_LP1 MOVLW 07H
MOVWF PCLATH
MOVF TEXTCNT,W
CALL SHARP_OUT
CALL LCD_DATA
INCF TEXTCNT,F
MOVLW 06H
SUBWF TEXTCNT,W
BTFSS STATUS,Z
GOTO IRCODE_LP1
IRCODE_RET RETURN
;**************** タイトルとコード表示 *****************
CODE_DISP:
BCF INTCON,GIE
CALL TITLE_DISP
CALL OUT_DISP
BSF INTCON,GIE
RETURN
;******************* ERROR 表示 ************************
ERROR_DISP:
BCF INTCON,GIE
CLRF TEXTCNT
MOVLW 80H ;ADDRES SET 1行目
CALL LCD_CMD
MOVF ERRTEXT,W
CALL LCD_DATA ;エラータイプ表示
MOVLW '_'
CALL LCD_DATA
ERROR_LP MOVLW 07H ;'ERROR'表示
MOVWF PCLATH
MOVF TEXTCNT,W
CALL ERROR_OUT
CALL LCD_DATA
82
INCF TEXTCNT,F
MOVLW 10H
SUBWF TEXTCNT,W
BTFSS STATUS,Z
GOTO ERROR_LP
MOVLW 89H
CALL LCD_CMD
MOVF CODECNT2,W ;何回目まで読み取ったか表示
BTFSS INTST,SHARP
SUBLW DT_LONG ;SONYは5 回
BTFSS INTST,SONY
SUBLW SH_DTLONG ;SHARP は3 回
ADDLW 30H
CALL LCD_DATA
INCF TEXTCNT,F
ERROR_LP2 CALL OUT_DISP
CLRF TMR1H
CLRF TMR1L
CLRF INTST
CLRF CODEST
BSF CODEST,EDCD
MOVLW DT_LONG
MOVWF CODECNT2
CLRF INTST
MOVLW 50H ;RB0割り込み許可,周辺割り込み許可
MOVWF INTCON
BSF STATUS,RP0
BCF PIE1,CCP1IE ;CCP割り込み禁止
BCF STATUS,RP0
BSF INTCON,GIE
RETURN
;***************** 受信コード表示ルーチン **************
OUT_DISP:
CALL IRCODE_DISP ;メーカー表示
CALL DISP_CHANGE
MOVLW 08H
MOVWF OUTCNT
MOVLW 27H
MOVWF FSR
MOVLW 0C6H
CALL LCD_CMD
OUT_DISP4 MOVF INDF,W
CALL LCD_DATA
DECF FSR,F
DECFSZ OUTCNT,F
GOTO OUT_DISP4
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
CLRF TMR1H
CLRF TMR1L
CLRF INTST
CLRF CODEST
BSF CODEST,EDCD
MOVLW DT_LONG
MOVWF CODECNT2
CLRF INTST
MOVLW 50H ;RB0割り込み許可,周辺割り込み許可
MOVWF INTCON
BSF STATUS,RP0
BCF PIE1,CCP1IE ;CCP割り込み禁止
BCF STATUS,RP0
RETURN
84
;*************************割り込み処理******************
INTERAPT:
BCF INTCON,GIE ;割り込み禁止
BCF STATUS,RP0
MOVWF WSAVE ;W退避
MOVF STATUS,W
MOVWF STATUSSAVE ;STATUS退避
MOVF PCLATH,W
MOVWF PCSAVE ;PCLATH退避
MOVF FSR,W
MOVWF FSRSAVE ;FSR退避
BSF PORTA,0 ;----10CYC
BTFSC INTST,SHARP
GOTO SH_CODE ;SHARP=1 ならSHARP ルーチンへ
BTFSS INTST,IC
GOTO RB0_INT
BTFSS PIR1,CCP1IF ;ちゃんとCCP割り込みになっているか?
GOTO CCP_ERR
BTFSC CODEST,RB0 ;開始フラグ?CCP 割り込み
GOTO CCP1INT
BTFSC CODEST,STRT ;スタートコード?
GOTO START_RDY
BTFSC CODEST,EDRD ;終了コード?
GOTO END_RDY
BTFSC CODEST,LORD ;Lo?
GOTO LO_CODE
BTFSC CODEST,HIRD ;Hi?
GOTO HI_CODE
GOTO ALL_ERR
RB0_INT: BTFSS INTCON,INTF
GOTO RB0_ERR
MOVLW 0AH ;コンペアモード設定
MOVWF CCP1CON
85
MOVLW 01H
MOVWF CCPR1H ;コンペア値
MOVLW 47H ;327
MOVWF CCPR1L ;ここで348cyc
CLRF TMR1H ;TMR1カウントスタート
CLRF TMR1L ;INT割り込み発生から350CYC 後にCCP 割り込み
;--23CYC
MOVLW DT_BIT
MOVWF CODECNT1 ;受信bit 数リセット
CLRF CODECNT3 ;受信bit カウンタリセット
BCF PIR1,CCP1IF ;CCPフラグクリア
BSF STATUS,RP0
BSF PIE1,CCP1IE ;CCP割り込み許可
BCF STATUS,RP0
BCF INTCON,INTE ;INT割り込み禁止
BSF INTST,IC ;次からコンペア割り込み
BCF CODEST,EDCD
BSF CODEST,RB0 ;次の割り込みをスタート準備に
GOTO END_INT
CCP1INT BTFSS PORTB,0 ;スタートシーケンスか?
GOTO READY_ERR
MOVLW 0BH ;スペシャルイベントトリガセット
MOVWF CCP1CON
MOVLW 02H
MOVWF CCPR1H
MOVLW 56H
MOVWF CCPR1L ;コンペア値600
CLRF TMR1H
CLRF TMR1L ;カウントスタート
BCF PIR1,CCP1IF ;CCP割り込みフラグクリア
BSF STATUS,RP0
BSF PIE1,CCP1IE ;CCP割り込み許可
BCF STATUS,RP0
MOVLW 04H
MOVWF STRTCNT
86
BCF CODEST,RB0
BSF CODEST,STRT ;スタートコードフラグセット
GOTO END_INT
START_RDY BTFSC INTST,SONY
GOTO START_RDY0
DECFSZ STRTCNT,F ;'Hi'を3 回認識したらスタートへ
GOTO START_RDY1
GOTO START
START_RDY0 DECFSZ STRTCNT,F
GOTO START_RDY2
GOTO START
START_RDY1 BTFSS PORTB,0
GOTO SELECT_SH
BCF INTST,SHARP ;SHARP フラグOFF
BSF INTST,SONY ;SONYフラグON
GOTO END_INT
START_RDY2 BTFSS PORTB,0
GOTO STRDY_ERR
BSF INTST,SONY
GOTO END_INT
START BTFSC PORTB,0
GOTO START_ERR ;'Hi'が4 階続いたらエラー
BCF CODEST,STRT
BSF CODEST,EDRD
GOTO END_INT
END_RDY BTFSS PORTB,0
GOTO END_TRUE ;2階続けて'Lo'なら終了
BCF CODEST,EDRD
BSF CODEST,LORD
GOTO END_INT
LO_CODE BTFSS PORTB,0
GOTO LO_SIGNAL ;'Lo'なら'0'と認識
BCF CODEST,LORD
BSF CODEST,HIRD ;2階続けて'Hi'なので'1'かも
GOTO END_INT
LO_SIGNAL DECF CODECNT1,F
INCF CODECNT3,F ;受信回数カウンタ+1
BCF STATUS,C
RLF IRCODE0,F ;IRCODE 左に1bit シフト
RLF IRCODE1,F
RLF IRCODE2,F
RLF IRCODE3,F
BCF CODEST,LORD ;DATA 読み込みフラグクリア
BSF CODEST,EDRD
GOTO END_INT
HI_CODE BTFSC PORTB,0
GOTO HI_ERR
DECF CODECNT1,F
INCF CODECNT3,F ;受信回数カウンタ+1
BSF STATUS,C
RLF IRCODE0,F ;IRCODE 左に1bit シフト
RLF IRCODE1,F
RLF IRCODE2,F
RLF IRCODE3,F
BCF CODEST,HIRD ;'1'認識フラグクリア
BSF CODEST,EDRD
GOTO END_INT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -