📄 no5.asm
字号:
;************* 宏方科技 HFKJAVR.asm ************************
;*
;* 标题:AT90S8535 集散式洁净空调自动控制系统
;* 版本: 1.0
;* 最后更新日期: 2002.12.13
;* 支援 TEL: 8102124 & 8106097
;*
;*************************************************************
.include"8535def.inc"
.equ label=$0900
.org 0x00
rjmp reset
.org INT0addr ;键盘中断服务子程序
rjmp EXT_INT0
.org URXCaddr ;UART接收结束中断
rjmp UART_RXC
.org OVF1addr ;timerl溢出中断
rjmp TIMER1
;reti
.org 0x0020 ;
;*****************************
;************中断*************
;*****************************
TIMER1: ;TIMER1溢出中断子程序
push r4
push r5
push r6
push r7
push r8
push r9
push r16
push r17
push r18
push r19
push r20
push r21
push r24
push r28
push r29
push r30
push r31
in r24,SREG ;保存状态寄存器
sei
ldi r16,$e1 ;重置TIMER1时间常数
ldi r17,$7c
out tcnt1h,r16
out tcnt1l,r17
rcall display
lds r16,$011a ;DO OUT
rcall doout
lds r16,$010a ;判断周期1是否到
lds r17,$0063
inc r17
cp r16,r17
brne timer10
rcall valjs1 ;冷水 热水阀值计算
lds r16,$00d9 ;冷水 AO1
ldi r17,2
rcall aoout
lds r16,$00da ;热水 AO2
ldi r17,4
rcall aoout
clr r17
timer10:sts $0063,r17
lds r16,$010b ;判断周期2是否到
lds r17,$0064
inc r17
cp r16,r17
brne timer11
rcall valjs2 ;冷水 加湿阀值计算
lds r16,$00d9 ;冷水 AO1
ldi r17,2
rcall aoout
lds r16,$00db ;加湿 AO3
ldi r17,8
rcall aoout
clr r17
timer11:sts $0064,r17
out sreg,r24
pop r31
pop r30
pop r29
pop r28
pop r24
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
reti
UART_RXC: ;通讯中断子程序
push r16 ;压栈
push r17
push r18
push r19
push r23
push r24
push r28
push r29
in r18,SREG ;保存状态寄存器
ldi r19,$ff ;无数据测试次数255次
rdlp1: sbis usr,7
rjmp rdlp2
ldi r19,$ff
rdlp3: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp4
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh1
rdlp2: dec r19
cpi r19,$00
breq qt1
rjmp rdlp1
qt1: rjmp qt
rdlp4: dec r19
cpi r19,$00
breq qt1
rjmp rdlp3
zh1: cpi r17,$ff ;站号起位1
brne qt1
rdlp5: sbis usr,7
rjmp rdlp6
ldi r19,$ff
rdlp7: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp8
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh2
rdlp6: dec r19
cpi r19,$00
breq qt1
rjmp rdlp5
rdlp8: dec r19
cpi r19,$00
breq qt1
rjmp rdlp7
zh2: cpi r17,$ff ;站号起位2
brne qt1
rdlp9: sbis usr,7
rjmp rdlp10
ldi r19,$ff
rdlp11: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp12
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh3
rdlp10: dec r19
cpi r19,$00
breq qt1
rjmp rdlp9
rdlp12: dec r19
cpi r19,$00
breq qt
rjmp rdlp11
zh3: ldi r29,$01 ;站号
ldi r28,$4c ;SRAM中站号地址
ld r16,y
ldi r16,$01
cpse r17,r16 ;是本站则跳行
rjmp qt ;非本站,退出
rdlp13: sbis usr,7
rjmp rdlp14
ldi r19,$ff
rdlp15: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp16
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh4
rdlp14: dec r19
cpi r19,$00
breq qt
rjmp rdlp13
rdlp16: dec r19
cpi r19,$00
breq qt
rjmp rdlp15
zh4: cpi r17,$00 ;站号停位1
brne qt
rdlp17: sbis usr,7
rjmp rdlp18
ldi r19,$ff
rdlp19: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp20
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh5
rdlp18: dec r19
cpi r19,$00
breq qt
rjmp rdlp17
rdlp20: dec r19
cpi r19,$00
breq qt
rjmp rdlp19
zh5: cpi r17,$00 ;站号停位2
brne qt
ldi r16,$ff
rcall redt ;调用发送数据子程序(站号确认成功$ff)
rdlp21: sbis usr,7
rjmp rdlp22
ldi r19,$ff
rdlp23: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp24
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh6
rdlp22: dec r19
cpi r19,$00
breq qt
rjmp rdlp21
rdlp24: dec r19
cpi r19,$00
breq qt
rjmp rdlp23 ;读控制命令.
zh6: rcall datapd ;调判断控制命令执行命令子过程;
qt: out sreg,r18 ;退出通讯中断
pop r29
pop r28
pop r24
pop r23
pop r19
pop r18
pop r17
pop r16
reti
redt: ;发送成功返回数据子程序
loop3: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loop3
out udr,r16 ;上传数据给PC机确认成功.
ret
datapd:
cpi r17,$fe
brne cop1
rcall txdt ;Fe指令为上传数据
ret
cop1: cpi r17,$fd
brne cop2
;rcall ;Fd指令启动DDC,风机
ldi r16,$00
rcall redt ;命令执行后返回PC数据
ret
cop2: cpi r17,$fc
brne cop3
;rcall ;Fc指令停止DDC,风机
ldi r16,$11
rcall redt ;命令执行后返回PC数据
ret
cop3: cpi r17,$fb
brne cop4
rcall xgml ;Fb指令修改程序参数
ret
cop4: cpi r17,$fa
brne cop5
;rcall ;Fa指令锁定DDC
ldi r16,$33
rcall redt ;命令执行后返回PC数据
ret
cop5: cpi r17,$f9
brne cop6
;rcall ;F9指令臭氧灭菌
ldi r16,$44
rcall redt ;命令执行后返回PC数据
ret
cop6: cpi r17,$f8
;brne cop7
;rcall ;F8指令其它功能待定
ldi r16,$55
rcall redt ;命令执行后返回PC数据
ret
xgml: ldi r29,$01 ;修改参数子程序
ldi r28,$50
xgml0:
rdlp25: sbis usr,7
rjmp rdlp26
ldi r19,$ff
rdlp27: sbic usr,4 ;低电平跳行,高电平帧错误
rjmp rdlp28
in r17,udr ;读串口数据到r17
ldi r19,$ff
rjmp zh7
rdlp26: dec r19
cpi r19,$00
breq qt
rjmp rdlp25
rdlp28: dec r19
cpi r19,$00
breq qt
rjmp rdlp27
zh7: st y+,r17
cpi r28,$6e
brne xgml0
ldi r28,$50
xgml1: ldd r17,y+15
ld r16,y+
cpse r17,r16
rjmp xgml2
cpi r28,$5f
brne xgml1
ldi r16,$fb
sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp xgml2
ldi r16,$22 ;接收数据成功,可以修改参数,返回33
rcall redt ;命令执行后返回PC数据
ldi r28,$40
xgml3: ldd r17,y+10
ld r16,y+
cpse r17,r16
rjmp xgml4
xgml5: cpi r28,$4f
brne xgml3
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
ret
xgml4: mov r24,r28
subi r24,$41 ;对应EEP地址为0x0100开始
mov r23,r17
rcall EEWrite
dec r28
st y+,r17 ;更新SRAM中的EEP参数
rjmp xgml5
xgml2:
ldi r16,$00
rcall redt ;命令执行后返回PC数据修改参数失败,返回00
ret
txdt: ldi r29,$01 ;上传数据子程序--PC
ldi r28,$00
loop5: ld r16,y+
loop4: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loop4
out udr,r16 ;发送数据
cpi r28,$4F
brne loop5
loep: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loep
ldi r16,$ff ;
out udr,r16
loep1: sbis usr,5 ;测试USR第5位发送寄存器是否空
rjmp loep1
ldi r16,$ff ;
out udr,r16
ret
EXT_INT0:
push r2 ;键盘中断子程序
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
push r16 ;压栈
push r17
push r18
push r19
push r20
;push r21
push r22
;push r23
push r24
push r25
push r26
push r27
push r28
push r29
push r30
push r31
in r24,SREG
read: rcall readkey ;读按键值
cpi r17,$c0 ;启动编码
breq startsystem
cpi r17,$c8 ;停止编码
breq stopsystem
cpi r17,$d0 ;设定编码
brne read1
rjmp setup
read1: cpi r17,$d8 ;退出编码
brne read2
rjmp quit
read2: cpi r17,$e0 ;LEFT编码
brne read3
rjmp LEFT
read3: cpi r17,$e8 ;RIGHT编码
brne read4
rjmp RIGHT
read4: cpi r17,$c1 ;消音
breq mute
kqt: out SREG,r24
pop r31 ;弹出
pop r30
pop r29 ;弹出
pop r28
pop r27 ;弹出
pop r26
pop r25 ;弹出
pop r24
;pop r23
pop r22
;pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
reti ;中断返回
startsystem:
rcall beep ;BEEP
ldi r16,01 ;启动风机输出
ldi xh,$01
ldi xl,$19
st x,r16
rcall EEWrite
rjmp kqt
stopsystem:
rcall beep ;BEEP
clr r16 ;停止风机输出
ldi xh,$01
ldi xl,$19
st x,r16
rcall EEWrite
rjmp kqt
mute: rcall beep ;报警消音
ldi yh,$00
ldi yl,$60
ldd r16,y+5 ;$0065是否在设定参数
cpi r16,2 ;正在修改参数
breq mute1
lds r16,$011b ;上次是否静音
inc r16
sbrs r16,0
clr r16
sts $011b,r16
rjmp kqt
mute1: ldd r16,y+6 ;$0066参数位选择0-个位,1-十位,2-百位,3-千位
inc r16
cpi r16,4
brne mute2
clr r16
mute2: std y+6,r16
rjmp kqt
quit: rcall beep
ldi yh,$00
ldi yl,$60
ldd r16,y+5 ;$0065是否在设定参数
cpi r16,0 ;未修改参数
breq quit1
cpi r16,1 ;正在显示通道
brne quit2
clr r16
st y,r16 ;$0060取消通道锁定
std y+1,r16 ;$0061通道号=0
std y+5,r16 ;$0065参数设定计数=0
quit1: rjmp kqt
quit2: ldi r16,1
std y+5,r16 ;$0065参数设定计数=1
rjmp kqt
setup: rcall beep ;设定按钮
ldi yh,$00 ;y >>> $0060
ldi yl,$60
ldi zh,$01 ;z >>> $0100
ldi zl,$00
ldd r16,y+5 ;$0065参数设定计数器
inc r16 ;计数器+1
cpi r16,1
brne setup1
std y+5,r16 ;$0065参数设定计数=1
ldi r16,16 ;通道号为16
std y+1,r16 ;$0061
ldi r16,$78 ;'t'
std y+7,r16 ;$0067
ldi r16,$06 ;'1'
std y+8,r16 ;$0068
ldi r16,$40 ;'-'
std y+9,r16 ;$0069
std y+10,r16 ;$006a
std y+11,r16 ;$006b
rjmp kqt
setup1: cpi r16,2
breq setup2
rjmp setup30 ;去和3比较
setup2: std y+5,r16 ;$0065参数设定计数=2
clr r25
lds r16,$00d0 ;DI0 风机状态
cpi r16,0
breq set21
sbr r25,2
set21: lds r16,$0112 ;运行模式
cpi r16,0
brne set22
sbr r25,4
set22: lds r16,$00d1 ;DI1 报警
cpi r16,0
breq set23
sbr r25,8
set23: lds r16,$011b ;$011b静音
cpi r16,0
breq set24
sbr r25,1
set24: ldd r16,y+1 ;$0061取通道号
cpi r16,16 ;t1
brne setup3
ld r2,z
ldd r3,z+1
rcall wendu
sbr r25,16 ;指示灯
ldi r16,0 ;小数点在3位
rjmp set25
setup3: cpi r16,17 ;h1
brne setup4
ldd r2,z+2
ldd r3,z+3
rcall shidu
sbr r25,32
ldi r16,0 ;小数点在3位
rjmp set25
setup4: cpi r16,18 ;t2
brne setup5
ldd r2,z+4
ldd r3,z+5
rcall tehpa
sbr r25,16
ldi r16,1 ;小数点在4位
rjmp set25
setup5: cpi r16,19 ;Pa
brne setup6
ldd r2,z+6
ldd r3,z+7
rcall tehpa
sbr r25,64
ldi r16,1 ;小数点在4位
rjmp set25
setup6: cpi r16,20 ;FL
brne setup7
clr r6 ;风量 0~1023 百立方
ldd r4,z+8
ldd r5,z+9
rcall htd3
sbr r25,128
ldi r16,2 ;无小数
rjmp set26
setup7: cpi r16,21 ;S1
brne setup8
ldd r4,z+10
rjmp set26
setup8: cpi r16,22 ;S2
brne setup9
ldd r4,z+11
rjmp set26
setup9: cpi r16,23 ;P1
brne setup10
ldd r4,z+12
rjmp set27
setup10:cpi r16,24 ;I1
brne setup11
ldd r4,z+13
rjmp set27
setup11:cpi r16,25 ;D1
brne setup12
ldd r4,z+14
rjmp set27
setup12:cpi r16,26 ;P2
brne setup13
ldd r4,z+15
rjmp set27
setup13:cpi r16,27 ;I2
brne setup14
ldd r4,z+16
rjmp set27
setup14:cpi r16,28 ;D2
brne setup15
ldd r4,z+17
rjmp set27
setup15:cpi r16,29 ;MODLE
brne setup16
ldd r4,z+18
rjmp set26
setup16:cpi r16,30 ;SN
brne setup17
ldd r4,z+19
rjmp set26
setup17:cpi r16,31 ;UBR
brne setup18
ldd r4,z+20
rjmp set26
setup18:cpi r16,32 ;t1下限
brne setup19
ldd r2,z+21
clr r3
rcall wendu
sbr r25,16 ;指示灯
ldi r16,0 ;小数点在3位
rjmp set25
setup19:cpi r16,33 ;t1上限
brne setup20
ldd r2,z+22
clr r3
rcall wendu
sbr r25,16 ;指示灯
ldi r16,0 ;小数点在3位
rjmp set25
setup20:cpi r16,34 ;h1下限
brne setup21
ldd r2,z+23
clr r3
rcall shidu1
sbr r25,32 ;指示灯
ldi r16,0 ;小数点在3位
rjmp set25
setup21:ldd r2,z+24 ;h1上限
clr r3
rcall shidu1
sbr r25,32 ;指示灯
ldi r16,0 ;小数点在3位
set25: std y+12,r8 ;$006c
std y+13,r9 ;$006d
rjmp set28
set26: clr r6
clr r5
rcall htd3
std y+12,r7 ;$006c
std y+13,r8 ;$006d
ldi r16,2 ;无小数
rjmp set28
set27: clr r6
clr r5
rcall htd3
std y+12,r7 ;$006c
std y+13,r8 ;$006d
ldi r16,1 ;一位小数
set28: std y+14,r25 ;$006e指示灯
std y+15,r16 ;$006f小数点
rjmp kqt
setup30:ldi r16,1
std y+5,r16 ;$0065参数设定计数=1
clr r16
std y+6,r16 ;参数位数选择=0
ldi xh,$01
ldd r16,y+1 ;$0061取通道号
cpi r16,16 ;t1
brne setup31
rcall wendubh
st z,r6
std z+1,r7
ldi xl,0
rcall eewrite
mov r16,r7
ldi xl,1
rcall eewrite
rjmp kqt
setup31:cpi r16,17 ;h1
brne setup32
ldd r6,y+12
ldd r7,y+13
ldi r16,$e8
sub r6,r16
ldi r16,$03
sbc r7,r16 ;-10%
rcall shidubh
std z+2,r6
std z+3,r7
ldi xl,2
rcall eewrite
mov r16,r7
ldi xl,3
rcall eewrite
rjmp kqt
setup32:cpi r16,18 ;t2
brne setup33
rcall tehpabh
std z+4,r6
std z+5,r7
ldi xl,4
rcall eewrite
mov r16,r7
ldi xl,5
rcall eewrite
rjmp kqt
setup33:cpi r16,19 ;Pa
brne setup34
rcall tehpabh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -