📄 b8_tb4.asm
字号:
CBR R17,$80
sdd_iic:
rcall WRITE_24C02
ld r17,x+
inc r18
cpi r18,$09
brne sdd_iic
cbi ddrd,0
sbi ddrd,1
ldi r16,$d8
sts ucsr0b,r16
Rcall led_flash
POP R18
POP R19
RET
SLAY_DONE:
PUSH YH
PUSH YL
PUSH R18
PUSH R19
ldi XL,LOW(ALL_ERT_BUF);主从处理
ldi XH,HIGH(ALL_ERT_BUF)
ldi r18,$00
exit_RDopo:
rcall READ_24C02
st x+,r17
inc r18
cpi r18,$08
brne exit_RDopo
LDI YL,LOW(RD_MAP+$5)
LDI YH,HIGH(RD_MAP+$5)
ldi XL,LOW(ALL_ERT_BUF+1);主从处理
ldi XH,HIGH(ALL_ERT_BUF+1)
LDI R18,$0
GOONER_OP:
LD R16,X+
LD R17,Y+
INC R18
CP R16,R17
BRNE ERRORI_DEAL
CPI R18,$4
BRNE GOONER_OP
ldi XL,LOW(ALL_ERT_BUF+6);主从处理
ldi XH,HIGH(ALL_ERT_BUF+6)
LD R16,X
CPI R16,$0
BREQ ERRORI_DEAL
STS JUDG_SIGN,R16
LDI YL,LOW(RD_MAP+$4)
LDI YH,HIGH(RD_MAP+$4)
ldi XL,LOW(ALL_ERT_BUF);主从处理
ldi XH,HIGH(ALL_ERT_BUF)
LDI R18,$0
GOONER_1OP:
LD R16,X+
ST Y+,R16
INC R18
CPI R18,$8
BRNE GOONER_1OP
ldi ZL,$08
LDI ADR_L,$4
LDI XL,LOW(ALL_ERT_BUF)
LDI XH,HIGH(ALL_ERT_BUF)
EXITX_EDN:
LD R16,X+
mov EE_DAT,r16
RCALL EEROM_W
INC ADR_L
CLC
SUBI ZL,$01
BRNE EXITX_EDN
rcall clr_eerom
cbi ddrd,0
sbi ddrd,1
ldi r16,$d8
sts ucsr0b,r16
Rcall led_flash
ldi r16,$0
STS DISTURB_SIGN,R16
LDI R16,$0
STS DAYS_COUNT,R16
STS HOURS,R16
STS MINITS,R16
STS SECOND,R16
RCALL OPEN_RECI_DATA
ERRORI_DEAL:
POP R19
POP R18
POP YL
POP YH
RET
CLR_IICT:;--------------------------------
LDS R16,S_DIGN;IIC TIMES CLEAR
CBR R16,$4
STS S_DIGN,R16
RET
SET_IICT:
LDS R16,S_DIGN;IIC TIMES SET
SBR R16,$4
STS S_DIGN,R16
RET
SET_MSECOND:
LDS R16,S_DIGN;SET TIME ARRIVED
SBR R16,$2
STS S_DIGN,R16
RET
CLR_MSECOND:
LDS R16,S_DIGN;CLR TIME ARRIVED
CBR R16,$02
STS S_DIGN,R16
RET
CLOSE_RECI_DATA:
LDS R17,S_DIGN;CLOSE RECIEVE DATA
SBR R17,$01
STS S_DIGN,R17
RET
OPEN_RECI_DATA:
LDS R16,S_DIGN;SET RECIEVE DATA
CBR R16,$1
STS S_DIGN,R16
RET
;----------------------------------------------------
led_flash:
PUSH R16
LDI R16,$00
EFE_LKED:
SBI PORTB,$0
RCALL DL300MS
CBI PORTB,$0
RCALL DL300MS
INC R16
CPI R16,$20
BRNE EFE_LKED
POP R16
RET
DL300MS:
PUSH R16
PUSH R17
LDI R16,10
LDI R17,10
DERER:
RCALL DELAY3US
RCALL DELAY3US
RCALL DELAY3US
RCALL DELAY3US
CLC
SUBI R16,$1
BRNE DERER
LDI R16,200
CLC
SUBI R17,$1
BRNE DERER
POP R17
POP R16
RET
clr_eerom:
PUSH R18
PUSH R17
PUSH XL
PUSH XH
ldi r18,$00
exit_op:
ldi r17,$0
rcall WRITE_24C02
inc r18
cpi r18,$80
brne exit_op
nop
POP XH
POP XL
POP R17
POP R18
ret
;函数名:START_I2C
;功能:启动I2C
;输入参数:无
;输出参数:无
START_I2C:
SBI DDRD,0
SBI DDRD,1
SBI PORTD,0
SBI PORTD,1
RCALL DELAY3US
CBI PORTD,0
RCALL DELAY3US
CBI PORTD,1
RCALL DELAY3US
RET
;函数名:STOP_I2C
;功能:停止I2C
;输入参数:无
;输出参数:无
STOP_I2C:
SBI DDRD,$0
SBI DDRD,$1
CBI PORTD,1
CBI PORTD,0
SBI PORTD,1
RCALL DELAY3US
SBI PORTD,0
RET
;函数名:SEND_DATA
;功能:发送八位数据
;输入参数:要发送的数据放在r17中
;输出参数:如果出错则置ACK_ERROR
SEND_DATA: ;发送子程序,要发送的数据放在r17中
PUSH R16
PUSH R20
LDI R20,$08
MOV R16,R17
CBI PORTD,1
BITCOUNT:
SBRS R16,$07
RJMP SET_0
SBI PORTD,0
RJMP DELAY
SET_0:
CBI PORTD,0
DELAY:
RCALL DELAY3US
SBI PORTD,1
RCALL DELAY5US
CBI PORTD,1
RCALL DELAY3US
LSL R16
DEC R20
BRNE BITCOUNT
POP R20
POP R16
RET
;函数名:TESTACK
;功能:测试应答信号
;输入参数:无
;输出参数:无
TESTACK: ;应答测试子程序
PUSH R16
SBI PORTD,0
CBI DDRD,0
RCALL DELAY3US
SBI PORTD,1
RCALL DELAY3US
LDI R16,$28
ACK:
SBIS PIND,0
RJMP OK
DEC R16
BRNE ACK
LDI R16,$01
STS ACK_ERROR,R16
OK:
SBI DDRD,0
CBI PORTD,1
POP R16
RET
;函数名:SETNOACK
;功能:无应答
;输入参数:无
;输出参数:无
SETNOACK: ;notack子程序
SBI PORTD,0
SBI PORTD,1
RCALL DELAY5US
CBI PORTD,1
RET
;函数名:RECEIVE_DATA
;功能:从I2C总线接收一字节
;输入参数:无
;输出参数:接收的字节放在r17中
RECEIVE_DATA: ;接收数据子程序,接收的数据放在r17
PUSH R16
PUSH R20
LDI R20,$08
CBI DDRD,0
REBIT:
SBI PORTD,1
LSL R17
SBIC PIND,0
RJMP READ_1
RJMP EXIT_ORNOT
READ_1:
ORI R17,$01
EXIT_ORNOT:
RCALL DELAY5US
CBI PORTD,1
RCALL DELAY5US
DEC R20
BRNE REBIT
SBI DDRD,0
POP R20
POP R16
RET
;函数名:WRITE_24C02
;功能:写24C02
;输入参数:待写的数据放在R17中,要写的地址放在R18中
;输出参数:无
WRITE_24C02: ;写24c02子程序,数据放在r17中,地址在r19,r18中
PUSH R16
PUSH R17
RCALL START_I2C
LDI R17,$A0
RCALL SEND_DATA
RCALL TESTACK
MOV R17,R18
RCALL SEND_DATA
RCALL TESTACK
POP R17
RCALL SEND_DATA
RCALL TESTACK
RCALL STOP_I2C
RCALL DELAY10MS
POP R16
RET
;函数名:READ_24C02
;功能:从I2C总线读一字节
;输入参数:读出的数据放在R17中,要读的地址放在R18中
;输出参数:无
READ_24C02: ;读24c02子程序,读回的数据放在r17中,地址在r18中
PUSH R16
RCALL START_I2C
LDI R17,$A0
RCALL SEND_DATA
RCALL TESTACK
MOV R17,R18
RCALL SEND_DATA
RCALL TESTACK
RCALL START_I2C
LDI R17,$A1
RCALL SEND_DATA
RCALL TESTACK
RCALL RECEIVE_DATA
RCALL SETNOACK
RCALL STOP_I2C
POP R16
RET
;函数名:DELAY5US
;功能:延时5us
;输入参数:无
;输出参数:无
DELAY5US:
PUSH R16
LDI R16,$21
DY5US:
DEC R16
BRNE DY5US
POP R16
RET
;函数名:DELAY3US
;功能:延时3us
;输入参数:无
;输出参数:无
DELAY3US:
PUSH R16
LDI R16,$10
DY3US:
DEC R16
BRNE DY3US
POP R16
RET
;函数名:DELAY10MS
;功能:延时10MS
;输入参数:无
;输出参数:无
DELAY10MS:
PUSH R16
PUSH R17
LDI R16,$FF
LDI R17,$FF
LP1:
DEC R16
BRNE LP1
DEC R17
BRNE LP1
POP R17
POP R16
RET
scom_reci:
push r16
push r17
push xh
push xl
lds r16,udr0
lds r17,comsign
sbrc r17,$1
rjmp jimp_1reci
sbrc r17,$0
rjmp jimp_reci
cpi r16,$68
brne exit_reci_scoms
ldi r17,$01
sts comsign,r17
rjmp exit_reci_scoms
jimp_reci:
ldi r17,$00
sts comsign,r17
cpi r16,$96
brne exit_reci_scoms
ldi r17,$02
sts comsign,r17
ldi xl,LOW(reci_BUF)
ldi xh,HIGH(reci_BUF)
ldi r16,$68
st x+,r16
ldi r16,$96
st x+,r16
sts sav_adressh,xh
sts sav_adressl,xl
rjmp exit_reci_scoms
jimp_1reci:
lds xh,sav_adressh
lds xl,sav_adressl
st x+,r16
sts sav_adressh,xh
sts sav_adressl,xl
cpi xl,LOW(reci_BUF+$b)
brne exit_reci_scoms
ldi r17,$04
sts comsign,r17
nop
nop
rjmp exit_reci_scoms
exit_reci_scoms:
pop xl
pop xh
pop r17
pop r16
reti
scom_txd:
push r16
PUSH R17
push xl
push xh
LDs R16,comT_sign
SBRs R16,$0
RJMP sendr_end
LDS XH,SEND_adressh
LDS XL,SEND_adressl
CPI xl,LOW(SEND_BUF+9)
brne sendr_1end
LDI R16,0
sts comT_sign,r16
rjmp sendr_end
sendr_1end:
ld r16,x+
sts udr0,r16
STS SEND_adressh,XH
STS SEND_adressl,XL
sendr_end:
pop xh
pop xl
POP R17
pop r16
reti
TIGR_SEN:
PUSH R16
PUSH R17
LDI XH,HIGH(SEND_BUF)
LDI XL,LOW(SEND_BUF)
LD R16,X+
STS SEND_adressh,XH
STS SEND_adressl,XL
CLI
STS UDR0,R16
LDI R16,$01
STS comT_sign,R16
SEI
GERIO:
LDS R16,comT_sign
SBRC R16,$0
RJMP GERIO
POP R17
POP R16
RET
RESPONSE:
PUSH XH
PUSH XL
push yh
push yl
PUSH R17
PUSH R16
push r18
LDI XH,HIGH(SEND_BUF)
LDI XL,LOW(SEND_BUF)
ldi r16,$68
st x+,r16
ldi r16,$96
st x+,r16
LDI yh,HIGH(reci_BUF+2)
LDI yl,LOW(reci_BUF+2)
ld r16,y+
st x+,r16
ld r16,y+
st x+,r16
ldi r16,$3
st x+,r16
ldi r16,'o'
st x+,r16
ldi r16,'k'
st x+,r16
ldi r16,'!'
st x+,r16
LDI XH,HIGH(SEND_BUF)
LDI XL,LOW(SEND_BUF)
ldi r17,$0
ldi r16,$8
summ:
ld r18,x+
add r17,r18
clc
subi r16,$1
brne summ
st x+,r17
rcall TIGR_SEN
pop r18
POP R16
POP R17
pop yl
pop yh
POP XL
POP xh
RET
;函数名:WRITE_E2P
;功能:写E2P
;输入参数:R17----低地址,R18-----高地址在mega48中为0,R19-----要写入的数据
;输出参数:无
EEROM_W:
PUSH R16
IN R16,SREG
PUSH R16
CLI
LDI ADR_H,$0
WAIT_WRITE:
IN R16,EECR
SBRC R16,1
RJMP WAIT_WRITE
OUT EEARH,ADR_H
OUT EEARL,ADR_L
OUT EEDR,EE_DAT
LDI R16,$04
OUT EECR,R16
IN R16,EECR
ORI R16,$02
OUT EECR,R16
LDI R16,$04
OUT EECR,R16
NOP
NOP
NOP
NOP
LDI R16,$06
OUT EECR,R16
POP R16
OUT SREG,R16
POP R16
RET
;函数名:READ_E2P
;功能:读E2P
;输入参数:R17----低地址,R18-----高地址在mega48中为0
;输出参数:R19-----从地址(r18:r17)中读出的数据
EEROM_R:
PUSH R16
IN R16,SREG
PUSH R16
CLI
LDI ADR_H,$0
WAIT_READ:
IN R16,EECR
SBRC R16,1
RJMP WAIT_READ
OUT EEARH,ADR_H
OUT EEARL,ADR_L
LDI R16,$01
OUT EECR,R16
IN EE_DAT,EEDR
POP R16
OUT SREG,R16
POP R16
RET
.EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -