📄 m_master.asm
字号:
NOP ;NOP
JMP $+1 ;GOTO $+1
JMP $+1 ;GOTO $+1
JMP $+1 ;GOTO $+1
SNZ [CNT1].3 ;BTFSS CNT1,3
JMP RCV3 ;GOTO RCV3
JMP RMT_0 ;GOTO RMT_0 ; 计时指令 Total = 32
RCV6:
CLR C ;CLRC ; CNT1:CNT0 / 16 --> 1/2LCK
RRC [CNT1] ;RRF CNT1,F
RRC [CNT0] ;RRF CNT0,F
CLR C ;CLRC
RRC [CNT1] ;RRF CNT1,F
RRC [CNT0] ;RRF CNT0,F
CLR C ;CLRC
RRC [CNT1] ;RRF CNT1,F
RRC [CNT0] ;RRF CNT0,F
CLR C ;CLRC
RRC [CNT1] ;RRF CNT1,F
RRC [CNT0] ;RRF CNT0,F
MOV A,[CNT0] ;MOVLW MIN/.8 ; 判断同步头合法性(MIN为同步头最小时间)
SUB A,30d;MIN/8D ;SUBWF CNT0,W
SNZ C ;BTFSS STATUS,C
JMP RMT_0 ;GOTO RMT_0 ; 小于MIN, 错误
; *************** 有效同步头接收 *********************
RCV7:
MOV A,24d;NBITS ;MOVLW NBITS ; 位接收计数器
MOV [CNT1],A ;MOVWF CNT1
MOV A,[CNT0] ;MOVF CNT0,W
MOV [CNT2],A ;MOVWF CNT2 ; CNT2 = CNT0
MOV A,[CNT2] ;MOVLW 6H
SUB A,6H ;SUBWF CNT2,F
JMP DL1 ;GOTO DL1 ; 补偿第一位
RCV8:
MOV A,4H ;MOVLW 4H ; 最大等待4个LCK
MOV [TMP_CNT],A ;MOVWF TMP_CNT
RCV10A:
MOV A,[CNT0] ;MOVF CNT0,W
MOV [CNT2],A ;MOVWF CNT2
RCV10B:
SZ RF ;BTFSC RFIN ; 等待高电平?
JMP RCV11 ;GOTO RCV11
SDZ [CNT2] ;DECFSZ CNT2,1
JMP RCV10B ;GOTO RCV10B
SDZ [TMP_CNT] ;DECFSZ TMP_CNT,1
JMP RCV10A ;GOTO RCV10A
JMP RMT01 ;GOTO RMT01 ; 时间溢出,错误
RCV11:
MOV A,[CNT0] ;MOVLW 3H ; 补偿时间 #####332223333;;;;;;;;;;;;;;;;;;
SUB A,3H ;SUBWF CNT0,W
MOV [CNT2],A ;MOVWF CNT2
DL1:
NOP ;CLRWDT ; 清看门狗
SDZ [CNT2] ;DECFSZ CNT2,1
JMP DL1 ;GOTO DL1 ; CNT0 * 4 us
SAMPLE1:
SNZ RF ;BTFSS RFIN ; 2LCK处为高电平?
JMP RMT01 ;GOTO RMT01 ; 否,错误数据
MOV A,[CNT0] ;MOVF CNT0,W ; 调整时间 #####3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV [CNT2],A ;MOVWF CNT2 ;
DEC [CNT2] ;DECF CNT2,F
JMP $+1 ;GOTO $+1
NOP ;NOP
DL2:
CLR WDT ;CLRWDT ; 清看门狗
JMP $+1 ;GOTO $+1 ; 消耗2uS
JMP $+1 ;GOTO $+1 ; 消耗2uS
JMP $+1 ;GOTO $+1 ; 消耗2uS
JMP $+1 ;GOTO $+1 ; 消耗2uS
SDZ [CNT2] ;DECFSZ CNT2,1
JMP DL2 ;GOTO DL2 ; CNT0 * 12
SAMPLE2:
CLR [FLAGS].BITIN ;BCF FLAG1,BITIN ; 读入数据(8LCK处)
SZ RF ;BTFSC RFIN ;
SET [FLAGS].BITIN ;BSF FLAG1,BITIN ;
RLC [DATA3] ;RLF CSR0,F ; 左移
RLC [DATA2] ;RLF CSR1,F
RLC [DATA1] ;RLF CSR2,F
CLR [DATA3].0 ;BCF CSR0,0
SZ [FLAGS].BITIN ;BTFSC FLAG1,BITIN
SET [DATA3].0 ;BSF CSR0,0
MOV A,[CNT0] ;MOVF CNT0,W ; 调整时间
MOV [CNT2],A ;MOVWF CNT2
SUB A,3H ;MOVLW 3
MOV [CNT2],A ;SUBWF CNT2,1
CLR WDT ;NOP
DL3:
JMP $+1 ;GOTO $+1 ; 消耗2uS
JMP $+1 ;GOTO $+1 ; 消耗2uS
JMP $+1 ;GOTO $+1 ; 消耗2uS
JMP $+1 ;GOTO $+1 ; 消耗2uS
NOP ;CLRWDT ; 清除看门狗
SDZ [CNT2] ;DECFSZ CNT2,1
JMP DL3 ;GOTO DL3 ; CNT0 * 12 us
SAMPLE3:
SZ RF ;BTFSC RFIN ; 14LCK输入低电平? <<6>>
JMP RMT0 ;GOTO RMT0 ; [0] NO--RECEIVE ERROR
;CALL TST_TMR0_PAGE0 ; [11] CHECK RTCC
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
NOP
SDZ [CNT1] ;DECFSZ CNT1,F ; 最后一位?
JMP RCV8 ;GOTO RCV8 ; 否,继续
RMT1:
;set pb.1;打开喇叭;BSF LED ; 表示有效数据
CLR C ; CLRC
RET ;RETLW 0 ; RETURN
RMT_0:
RMT0:
RMT01:
SET C ;BSF STATUS,C ; 非法数据
RET ;
;======================================================================
;====================================================================
; E2ROM段
;====================================================================
;----------- 防止复位清除使用的遥控器码,不能正确的回传----
WriteRemote:
mov a,20h
mov [dataaddr],a
mov a,[Tx_Data1]
mov [tempdata2],a
call WriteOneByte
mov a,21h
mov [dataaddr],a
mov a,[Tx_Data2]
mov [tempdata2],a
call WriteOneByte
mov a,22h
mov [dataaddr],a
mov a,[Tx_Data3]
mov [tempdata2],a
call WriteOneByte
ret
ReadRemote:
mov a,20h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [Tx_Data1],a
mov a,21h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [Tx_Data2],a
mov a,22h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [Tx_Data3],a
ret
;--------------------------------------------------------
;----------------------------------------------
WRITEBYTE1:
MOV A,1FH ;断电记忆
MOV [DATAADDR],A
MOV A,MEMORY_RET
MOV [TEMPDATA2],A
CALL WRITEONEBYTE
RET
READBYTE1:
mov a,1fh
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov MEMORY_RET,a
RET
;--------------------------------------------
WRITEBYTE:
mov a,16h
mov [dataaddr],a
mov a,[CHKData1]
mov [tempdata2],a
call WriteOneByte
mov a,17h
mov [dataaddr],a
mov a,[CHKData2]
mov [tempdata2],a
call WriteOneByte
mov a,18h
mov [dataaddr],a
mov a,[CHKData3]
mov [tempdata2],a
call WriteOneByte
mov a,19h
mov [dataaddr],a
mov a,[CHKData4]
mov [tempdata2],a
call WriteOneByte
mov a,1ah
mov [dataaddr],a
mov a,[CHKData5]
mov [tempdata2],a
call WriteOneByte
mov a,1bh
mov [dataaddr],a
mov a,[CHKData6]
mov [tempdata2],a
call WriteOneByte
mov a,1ch
mov [dataaddr],a
mov a,[CentreConlTime]
mov [tempdata2],a
call WriteOneByte
; mov a,1dh ;;;;;;;;;;;;;;;;
; mov [dataaddr],a ;;;;;;;;;;;;;;;;
; mov a,[flag7] ;;;;;;;;;;;;;;;;
; mov [tempdata2],a;;;;;;;;;;;;;;;
; call WriteOneByte ;;;;;;;;;;;;;;;;
ret
READBYTE:
mov a,16h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CHKData1],a
mov a,17h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CHKData2],a
mov a,18h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CHKData3],a
mov a,19h
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CHKData4],a
mov a,1ah
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CHKData5],a
mov a,1bh
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CHKData6],a
mov a,1ch
mov [dataaddr],a
call ReadOneByte
mov a,[read_out]
mov [CentreConlTime],a
; mov a,1dh ;;;;;;;;;;;;;;;;;;;
; mov [dataaddr],a ;;;;;;;;;;;;;;;;;;;
; call ReadOneByte ;;;;;;;;;;;;;;;;;;;
; mov a,[read_out] ;;;;;;;;;;;;;;;;;;;
; mov [flag7],a ;;;;;;;;;;;;;;;;;;;
ret
;====================================================================
;====================================================================
WriteOneByte:
CLR WDT
clr scl
clr sda
ht24_write_byte:
clr sda_c
clr scl_c
set sda
set scl
clr sda ;起始信号
clr scl
set sda ;1
set scl
clr scl
clr sda ;0
set scl
clr scl
set sda ;1
set scl
clr scl
clr sda ;0
set scl
clr scl
clr sda ;a2,a1,a0=000
set scl
clr scl
set scl
clr scl
set scl
clr scl
set scl ;写0,给出写模式
clr scl
set sda_c
set scl
wait_ack0:
sz sda ;等待应答信号
jmp wait_ack0
clr scl
clr sda_c
;====================================================================
mov a,08h ;写E2ROM中的地址
mov [Temp3],a
Lpwrite0:
clr sda
sz [dataaddr].7
set sda
set scl
clr scl
rl [dataaddr]
sdz [Temp3]
jmp Lpwrite0
set sda_c
set scl
wait_ack1:
sz sda ;等待应答信号
jmp wait_ack1
clr scl
clr sda_c
;====================================================================
mov a,08h ;写数据
mov [Temp3],a
Lpwrite1:
clr sda
sz [tempdata2].7
set sda
set scl
clr scl
rl [tempdata2]
sdz [Temp3]
jmp Lpwrite1
set scl
clr scl
clr sda
set scl
set sda ;停止信号
CLR SCL;;;;;;;???????退出时,拉低,防止电流过高,一直维持高,耗电大,不能拉低
mov a,30h
MOV [COUNT_IIC0],A;mov [count0],a
mov a,05h
MOV [COUNT_IIC1],A;mov [count1],a
LpDly1:
CLR WDT
SDZ [COUNT_IIC0];sdz [count0]
jmp LpDly1
SDZ [COUNT_IIC1];sdz [count1]
jmp LpDly1
ret
;====================================================================
;====================================================================
ReadOneByte:
CLR WDT
clr scl
clr sda
ht24_read_byte:
do_read:
clr [read_out]
clr sda_c
clr scl_c
set sda
set scl
clr sda ;起始信号
clr scl
set sda ;1
set scl
clr scl
clr sda ;0
set scl
clr scl
set sda ;1
set scl
clr scl
clr sda ;0
set scl
clr scl
clr sda
set scl ;a0,a1,a2=0
clr scl
set scl ;0
clr scl
set scl ;0
clr scl
clr sda ;写模式,写地址
set scl
clr scl
set sda_c
set scl
wait_ack2:
sz sda
jmp wait_ack2
clr scl
;====================================================================
mov a,08h
mov [Temp3],a
clr sda_c
Lpread0:
clr sda
sz [dataaddr].7
set sda
set scl
clr scl
rl [dataaddr]
sdz [Temp3]
jmp Lpread0
set sda_c
set scl
wait_ack3:
sz sda
jmp wait_ack3
clr scl
clr sda_c
;====================================================================
read_data:
set sda
set scl
clr sda ;start bit
clr scl
set sda ;1
set scl
clr scl
clr sda ;0
set scl
clr scl
set sda ;1
set scl
clr scl
clr sda ;0
set scl
clr scl
clr sda ;a2,a1,a0
set scl
clr scl
set scl
clr scl
set scl
clr scl
set sda ;读模式
set scl
clr scl
set sda_c
;set scl
wait_ack4:
sz sda
jmp wait_ack4 ;wait_ack2 改的.gao
;clr scl
set scl ;down_edge data out
mov a,08h
mov [Temp3],a
set sda_c
Lp_readout:
set scl
NOP;call del
NOP
NOP
clr scl
NOP;call del
NOP
NOP
rl [read_out]
clr [read_out].0
sz sda
set [read_out].0
sdz [Temp3]
jmp Lp_readout
clr sda_c ;for stop
clr scl
set scl
set sda
clr sda
set sda ;stop end
CLR SCL;;;;;;;???????退出时,拉低,防止电流过高,一直维持高,耗电大,不能拉低
ret
;====================================================================
;====================================================================
;del: ;for delay
; nop
; nop
; nop
; ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -