📄 no5.asm
字号:
rcall ADC1
cbi porta,3
cbi porta,4
cbi porta,5
sbi admux,0 ;admux=0则置1
std y+7,r16 ;传开关量到 00d7
rcall shidu
std y+30,r8 ;传A7L >>> 00ee
std y+31,r9 ;传A7H >>> 00ef
rcall ADC1
sbi porta,3
cbi porta,4
cbi porta,5
rcall wendu
std y+32,r8 ;传A8L >>> 00f0
std y+33,r9 ;传A8H >>> 00f1
rcall ADC1
cbi porta,3
sbi porta,4
cbi porta,5
rcall shidu
std y+34,r8 ;传A9L >>> 00f2
std y+35,r9 ;传A9H >>> 00f3
rcall ADC1
sbi porta,3
sbi porta,4
cbi porta,5
rcall wendu
std y+36,r8 ;传AaL >>> 00f4
std y+37,r9 ;传AaH >>> 00f5
rcall ADC1
cbi porta,3
cbi porta,4
sbi porta,5
rcall shidu
std y+38,r8 ;传AbL >>> 00f6
std y+39,r9 ;传AbH >>> 00f7
; rcall ADC1
; sbi porta,3
; cbi porta,4
; sbi porta,5
; std y+40,r2 ;传AcL >>> 00f8
; std y+41,r3 ;传AcH >>> 00f9
rcall ADC1
cbi porta,3
sbi porta,4
sbi porta,5
sts $00a4,r2 ;传AdL >>> 00a4
sts $00a5,r3 ;传AdH >>> 00a5
rcall TEHPA ;冷凝水温度 0~100'C
std y+42,r8 ;传AdL >>> 00fa
std y+43,r9 ;传AdH >>> 00fb
rcall ADC1
sbi porta,3
sbi porta,4
sbi porta,5
sts $00a6,r2 ;传AeL >>> 00a6
sts $00a7,r3 ;传AeH >>> 00a7
rcall TEHPA ;正压 0~100Pa
std y+44,r8 ;传AeL >>> 00fc
std y+45,r9 ;传AeH >>> 00fd
rcall ADC1
cbi porta,3
cbi porta,4
cbi porta,5
cbi admux,0 ;admux=0则置0
sts $00a8,r2 ;传AfL >>> 00a8
sts $00a9,r3 ;传AfH >>> 00a9
clr r6 ;风量 0~1023 百立方
mov r5,r3
mov r4,r2
rcall htd3
std y+46,r7 ;传AfL >>> 00fe
std y+47,r8 ;传AfH >>> 00ff
rjmp main
;********* 子程序区 *********
;**** ADC转换子程序 R2,R3,R16
ADC1: sbi adcsr,6 ;启动ADC
ADC2: sbis adcsr,adif ;转换结束 ADC中断发生跳行否则等待
rjmp ADC2
in r2,adcl ;把转换结果送r2,r3
in r3,adch
clr r16 ;开关量关
sbis pina,2 ;读开关量
ldi r16,$1 ;开关量开
ret
;**** 数据转换成温度 0.00~40.00 'c
WENDU: mov r6,r2
mov r7,r3
ldi r18,$01 ;(r7,r6)*$187
mov r5,r18
ldi r18,$87
mov r4,r18
rcall mul16
clr r16 ;四舍五入
ldi r18,$32
add r6,r18
adc r7,r16
adc r8,r16
adc r9,r16
mov r4,r6 ;R8,R7,R6>>>BCD
mov r5,r7
mov r6,r8
rcall htd3
ret
;**** 数据转换成湿度 10.00~90.00%
SHIDU: mov r6,r2
mov r7,r3
ldi r18,$03 ;(r7,r6)*$30e
mov r5,r18
ldi r18,$0e
mov r4,r18
rcall mul16
ldi r19,$01 ;四舍五入+湿度补偿10%
ldi r18,$86
ldi r16,$d2
add r6,r16
adc r7,r18
adc r8,r19
clr r16
adc r9,r16
mov r4,r6 ;R8,R7,R6>>>BCD
mov r5,r7
mov r6,r8
rcall htd3
ret
;**** 数据转换成温度和压力 (0.0~100.0'c 0.0~100.0Pa)
TEHPA: mov r6,r2
mov r7,r3
clr r5
ldi r18,$62 ;(r7,r6)*$62
mov r4,r18
rcall mul16
mov r4,r6 ;R8,R7,R6>>>BCD
mov r5,r7
mov r6,r8
rcall htd3
ret
;**** 四字节压缩BCD码相加子程序(R15,R14,R13,R12)+(R11,R10,R9,R8)→R15,R14,R13,R12
ADBCD: add R12,R8 ;最低位字节相加
mov R20,R12
rcall ADAA ;在R20里进行加法十进制调整
mov R12,R20 ;调整后结果送回
adc R13,R9 ;对高位字节也照此处理
mov R20,R13
rcall ADAA
mov R13,R20
adc R14,R10
mov R20,R14
rcall ADAA
mov R14,R20
adc R15,R11
mov R20,R15
rcall ADAA
mov R15,R20 ;最高位字节相加调整完毕
ret
;**** BCD码相加或左移十进制调整子程序 R6,R7,R20,R22
ADAA: in R7,SREG ;BCD码相加十进制调整子程序,先保存相加后的状态
ldi R22,$66
add R20,R22 ;予加$66
in R6,SREG ;存加$66后的状态
or R6,R7 ;将新旧两状态或起来(只用C,H两位)
sbrs R6,0 ;若进位C置位,跳过下条指令
subi R20,$60 ;否则减去$60
sbrs R6,5 ;若半进位H置位,跳过下条指令
subi R20,6 ;否则减去6
out SREG,R6 ;恢复进位C,以保证高位字节正确相加
ret
;**** 四字节压缩BCD码相减子程序(R15,R14,R13,R12)-(R11,R10,R9,R8)→R15,R14,R13,R12
SUBCD: sub R12,R8 ;最低位字节相减
mov R20,R12
rcall SDAA ;在R20里进行减法十进制调整
mov R12,R20
sbc R13,R9
mov R20,R13
rcall SDAA
mov R13,R20
sbc R14,R10
mov R20,R14
rcall SDAA
mov R14,R20
sbc R15,R11
mov R20,R15
rcall SDAA
mov R15,R20 ;最高位字节相减调整完毕并回送
ret
;**** 十进制减法调整子程序 R20
SDAA: brcc SBD1 ;进位位清除,跳转
brhc SBD2 ;半进位清除,跳转
subi R20,$66 ;否则将差减去$66
sec ;并恢复借位C
ret
SBD1: brhc SBD3 ;半进位也清除,返回(不须调整)
subi R20,$6 ;否则将差减去6
ret
SBD2: subi R20,$60 ;将差减去$60
sec ;并恢复借位C
SBD3: ret
;**** 定点整数乘法子程序 (R5,R4)×(R7,R6)→R9,R8,R7,R6 count=R18
MUL16: ldi R18,$11 ;循环右移17次
clr R9
clr R8 ;积高位部分予清除
clc ;第一次只移位
MLOP: brcc MUL1 ;进位位被清除,跳转
add R8,R4
adc R9,R5 ;否则,被乘数加入部分积
MUL1: ror R9
ror R8
ror R7
ror R6 ;并将部分积(及乘数)带进位右移
dec R18
brne MLOP ;相加右移16次,结束
ret
;**** 定点整数除法子程序 R7,R6←(R9,R8,R7,R6)÷(R5,R4) count=R18
DIV16: ldi R18,$10 ;循环左移16次
DLOP: lsl R6
rol R7
rol R8
rol R9 ;被除数算数左移一位
brcc DIV1 ;进位清除,跳转
sub R8,R4
sbc R9,R5
rjmp DIV2 ;否则将被除数(比除数多1位)减去除数并转记商1
DIV1: sub R8,R4
sbc R9,R5 ;相减试商
brcc DIV2 ;进位被清除(够减),本位商为1
add R8,R4
adc R9,R5
rjmp DIV3 ;不够减,恢复被减数,本位商为0
DIV2: inc R6 ;记商1
DIV3: dec R18
brne DLOP ;16次循环,除法结束
ret
;**** HEX TO BCD 子程序 R6,R5,R4→R9,R8,R7 COUNT=R10,TEMP=R19
htd3: ldi R19,24
mov R10,R19
clr R19
clr R7
clr R8
clr R9
clc
htd31: rol R4
rol R5
rol R6
rol R7
rol R8
rol R9
dec R10
brne htd32
ret
htd32: push R10
mov R10,R7
rcall htd33
mov R7,R10
mov R10,R8
rcall htd33
mov R8,R10
mov R10,R9
rcall htd33
mov R9,R10
pop R10
rjmp htd31
htd33: ldi R19,3
add R19,R10
sbrc R19,3
mov R10,R19
ldi R19,$30
add R19,R10
sbrc R19,7
mov R10,R19
ret
;**** BCD TO HEX 子程序 R7,R6→R5,R4 R16,R18,R19
btoh: clr r4
clr r5
ldi r19,$03
ldi r18,$e8
mov r16,r7
swap r16
andi r16,$0f
breq btoh02
btoh01: add r4,r18
adc r5,r19
dec r16
brne btoh01
btoh02: clr r19
ldi r18,$64
mov r16,r7
andi r16,$0f
breq btoh04
btoh03: add r4,r18
adc r5,r19
dec r16
brne btoh03
btoh04: ldi r18,$0a
mov r16,r6
swap r16
andi r16,$0f
breq btoh06
btoh05: add r4,r18
adc r5,r19
dec r16
brne btoh05
btoh06: mov r16,r6
andi r16,$0f
add r4,r16
adc r5,r19
ret
;**** LED数显子程序
display:sbi portd,5 ;初始化8279控制字
cbi portd,4
sbi portd,3
ldi r22,$90
out portb,r22
nop
sbi portd,4
cbi portd,5
lds r17,$0061 ;sram中的通道号
cpi r17,16
brlo disp0 ;通道号小于16转移
rjmp keydis
disp0: ldi zh,high(label*2);0~15通道号切换
mov zl,r17
lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
ldi yl,$e0 ;Y >>>> SRAM 0X00e0
clr yh
mov r16,r17
lsl r16
add yl,r16
ldd r16,y+1 ;千位
swap r16
ldi zl,low(label*2)
rcall outpd
ldd r16,y+1 ;百位
ldi zl,low(label*2)
cpi r17,13
brsh dis0 ;通道号大于等于13转移
adiw zl,16 ;有小数点
dis0: rcall outpd
ld r16,y ;十位
swap r16
ldi zl,low(label*2)
cpi r17,13
brlo dis1 ;通道号小于13转移
adiw zl,16 ;有小数点
dis1: rcall outpd
ld r16,y ;个位
ldi zl,low(label*2)
rcall outpd
clr r16 ;指示灯
cpi r17,13
brsh dis2 ;通道号大于等于13转移
ldi r16,32 ;湿度
sbrs r17,0 ;0/2.../10/12通道为温度
ldi r16,16 ;温度
rjmp dis5
dis2: cpi r17,13
brne dis3
sbr r16,16 ;冷凝水
dis3: cpi r17,14
brne dis4
sbr r16,64 ;压力
dis4: cpi r17,15
brne dis5
sbr r16,128 ;风量
dis5: lds r18,$00d0 ;DI0 风机状态
cpi r18,0
breq dis6
sbr r16,2
dis6: lds r18,$0112 ;运行模式
cpi r18,0
brne dis7
sbr r16,4
dis7: lds r18,$00d1 ;DI1 报警
cpi r18,0
breq dis8
sbr r16,8
dis8: lds r18,$011b ;$011b静音
cpi r18,0
breq dis9
sbr r16,1
dis9: out portb,r16
cbi portd,4
nop
sbi portd,4
lds r16,$0060 ;显示通道是否=1锁定
cpi r16,0
brne dis11
inc r17
cpi r17,16
brne dis10
clr r17
dis10: sts $0061,r17
dis11: rjmp dis12
keydis: ldi yh,$00
ldi yl,$60 ;y >>>> $0060
ldd r16,y+5
cpi r16,1
brne keydis1
ldd r16,y+7 ;$0067
rcall outpd1
ldd r16,y+8 ;$0068
rcall outpd1
ldd r16,y+9 ;$0069
rcall outpd1
ldd r16,y+10 ;$006a
rcall outpd1
ldd r16,y+11 ;$006b
rcall outpd1
rjmp dis12
keydis1:sbi portd,5 ;初始化8279控制字
cbi portd,4
sbi portd,3
ldi r22,$91 ;从第二位开始显示
out portb,r22
nop
sbi portd,4
cbi portd,5
ldi zh,high(label*2)
ldi zl,low(label*2)
ldd r16,y+13 ;$006d
swap r16 ;千位
rcall outpd
ldd r16,y+13 ;$006d
ldd r18,y+15 ;$006f
ldi zl,low(label*2)
cpi r18,0
brne keydis2
adiw zl,16
keydis2:rcall outpd ;百位
ldd r16,y+12 ;$006c
swap r16 ;十位
ldi zl,low(label*2)
cpi r18,1
brne keydis3
adiw zl,16
keydis3:rcall outpd
ldi zl,low(label*2)
ldd r16,y+12 ;$006c
rcall outpd ;个位
ldd r16,y+14 ;$006e
out portb,r16 ;指示灯
cbi portd,4
nop
sbi portd,4
dis12: sbi portd,5 ;向8279传送数据结束
ret
outpd: andi r16,$0f
add zl,r16
lpm
out portb,r0
cbi portd,4
nop
sbi portd,4
ret
outpd1: out portb,r16
cbi portd,4
nop
sbi portd,4
ret
;**** 延时子程序 R20
;delay: ret
delay: push r20 ;2t
l0: push r20 ;2t
l1: push r20 ;2t
l2: push r20 ;2t
l3: dec r20 ;1t
brne l3 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l2 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l1 ;1t/2t
pop r20 ;2t
dec r20 ;1t
brne l0 ;1T/2T
pop r20 ;2t
ret ;4t
;***** 参数计算子程序
cansujs1:ldi yh,$01 ;Y >>>0X0100
ldi yl,$00
ldi zh,$00 ;Z >>>0X00b0
ldi zl,$b0
clr r7
clr r5
ldd r4,y+13 ;I1
ldd r6,y+14 ;D1
add r4,r6
adc r5,r7 ;I1+D1
ldi r16,10
add r4,r16
adc r5,r7 ;I1+D1+1
ldd r6,y+12 ;P1
rcall mul16 ;P1*(I1+D1+1)
st z,r6 ;A1 L>>>0X00b0
std z+1,r7 ;A1 H>>>0X00b1
clr r7
clr r5
ldd r4,y+14 ;D1
lsl r4 ;D1*2
rol r5
ldi r16,10
add r4,r16
adc r5,r7 ;D1*2+1
ldd r6,y+12 ;P1
rcall mul16 ;P1*(D1*2+1)
std z+2,r6 ;B1 L>>>0X00b2
std z+3,r7 ;B1 H>>>0X00b3
clr r7
clr r5
ldd r4,y+12 ;P1
ldd r6,y+14 ;D1
rcall mul16 ;P1*D1
std z+4,r6 ;C1 L>>>0X00b4
std z+5,r7 ;C1 H>>>0X00b5
ret
cansujs2:ldi yh,$01 ;Y >>>0X0100
ldi yl,$00
ldi zh,$00 ;Z >>>0X00b0
ldi zl,$b0
clr r7
clr r5
ldd r4,y+16 ;I2
ldd r6,y+17 ;D2
add r4,r6
adc r5,r7 ;I2+D2
ldi r16,10
add r4,r16
adc r5,r7 ;I2+D2+1
ldd r6,y+15 ;P2
rcall mul16 ;P2*(I2+D2+1)
std z+16,r6 ;A2 L>>>0X00c0
std z+17,r7 ;A2 H>>>0X00c1
clr r7
clr r5
ldd r4,y+17 ;D2
lsl r4 ;D2*2
rol r5
ldi r16,10
add r4,r16
adc r5,r7 ;D2*2+1
ldd r6,y+15 ;P2
rcall mul16 ;P2*(D2*2+1)
std z+18,r6 ;B2 L>>>0X00c2
std z+19,r7 ;B2 H>>>0X00c3
clr r7
clr r5
ldd r4,y+15 ;P2
ldd r6,y+17 ;D2
rcall mul16 ;P2*D2
std z+20,r6 ;C2 L>>>0X00c4
std z+21,r7 ;C2 H>>>0X00c5
ret
muabc: rcall suhex2 ;E-Es=E0
std y+6,r6 ;E0 L
std y+7,r7 ;E0 H
std y+13,r19 ;E0 +-
std Z+2,r19 ;A1*E0 +-
ld r4,y ;A1 L
ldd r5,y+1 ;A1 H
rcall mudi
st Z,r6 ;A1*E0/400 L
std Z+1,r7 ;A1*E0/400 H
ldd r4,Z+3 ;B1*E1/400 L
ldd r5,Z+4 ;B1*E1/400 H
ldd r8,Z+6 ;C1*E2/400 L
ldd r9,Z+7 ;C1*E2/400 H
rcall ADSU
ret
mubc: ldd r4,y+8 ;E1 L
ldd r5,y+9 ;E1 H
ldd r21,y+14 ;E1 +-
std y+10,r4 ;E2 L
std y+11,r5 ;E2 H
std y+15,r21 ;E2 +-
std Z+8,r21 ;C1*E2 +-
ldd r6,y+4 ;C1 L
ldd r7,y+5 ;C1 H
rcall mudi
std Z+6,r6 ;C1*E2/400 L
std Z+7,r7 ;C1*E2/400 H
ldd r4,y+6 ;E0 L
ldd r5,y+7 ;E0 H
ldd r20,y+13 ;E0 +-
std y+8,r4 ;E1 L
std y+9,r5 ;E1 H
std y+14,r20 ;E1 +-
std Z+5,r20 ;B1*E1 +-
ldd r6,y+2 ;B1 L
ldd r7,y+3 ;B1 H
rcall mudi
std Z+3,r6 ;B1*E1/400 L
std Z+4,r7 ;B1*E1/400 H
ret
ADSU: clr r16
inc r20 ;B1*E1符号取反
sbrs r19,0 ;A1*E0为负跳行
sbr r16,1 ;A1*E0为正 R16+1
sbrs r20,0 ;B1*E1为负跳行
sbr r16,2 ;B1*E1为正 R16+2
sbrs r21,0 ;C1*E2为负跳行
sbr r16,4 ;C1*E2为正 R16+4
clr r17 ;A B C 存放^V的符号 为正=0
cpi r16,7 ;+ + +
breq ADSU1
cpi r16,0 ;- - -
brne ADSU2
inc r17 ;-
ADSU1: add r6,r4
adc r7,r5 ;A+B
add r6,r8
adc r7,r9 ;A+B+C
rjmp ADSU8
ADSU2: cpi r16,3 ;+ + -
breq ADSU3
cpi r16,4 ;- - +
brne ADSU4
inc r17 ;-
ADSU3: add r6,r4
adc r7,r5 ;A+B
mov r4,r8
mov r5,r9
rcall suhex2 ;A+B-C
add r17,r19
rjmp ADSU8
ADSU4: cpi r16,5 ;+ - +
breq ADSU5
cpi r16,2 ;- + -
brne ADSU6
inc r17 ;-
ADSU5: add r6,r8
adc r7,r9 ;A+C
rcall suhex2 ;A+C-B
add r17,r19
rjmp ADSU8
ADSU6: cpi r16,1 ;+ - -
breq ADSU7
inc r17 ;- 6 - + +
ADSU7: add r5,r8
adc r4,r9 ;B+C
rcall suhex2 ;A-(B+C)
add r17,r19
ADSU8: clr r18
sbrc r17,0
sbr r18,1 ;r18=1 ^V为负
mov r5,r7
mov r4,r6 ;^V >>> R5,R4
ret
;VAL0 r19,r18,r17,r16,r9,r8,r7,r6,r5,r4
VAL0: clr r9 ;V0+^V >>> r9,r8
mov r8,r6
add r8,r4
adc r9,r5
mov r17,r9
cpi r17,1
brlo VAL1
ser r16
mov r8,r16
VAL1: mov r16,r8 ;冷水
rcall suhex2 ;V0-^V >>> r7,r6
cpi r19,0
breq VAL2
clr r6
VAL2: mov r17,r6 ;热水
cpi r18,0
brne VAL3
mov r16,r6 ;冷水
mov r17,r8 ;热水
VAL3: ret
;mudi r4,r5,r6,r7,r8,r9,r18
mudi: rcall mul16 ;A1*E0
ldi r16,$90
ldi r18,$01
mov r4,r16
mov r5,r18
rcall div16 ;A1*E0/400
ret
;SUB HEX2 R7,R6-R5,R4>>>R7,R6 TEMP=R16,R19
suhex2: clr r19 ;结果为正=0
cp r7,r5
breq suhex20 ;R7=R5
brsh suhex22 ;R7>R5
rjmp suhex21 ;R7<R5
suhex20:cp r6,r4
brsh suhex22 ;R6>=R4
suhex21:mov r16,r7
mov r7,r5
mov r5,r16
mov r16,r6
mov r6,r4
mov r4,r16
ldi r19,1 ;结果为负=1
suhex22:sub r6,r4
sbc r7,r5
ret
;**** 数据区
.cseg
.org $0900
.dw 0x063f,0x4f5b,0x6d66,0x077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179
.dw 0x86bf,0xcfdb,0xede6,0x87fd
.dw 0xefff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -