📄 no3b.lst
字号:
000304 d138 rcall delay
000305 e400 ldi r16,$40 ;'-'
000306 debe rcall outxs
000307 e441 ldi r20,$41 ;调用延时
000308 d134 rcall delay
000309 e400 ldi r16,$40 ;'-'
00030a deba rcall outxs
00030b e441 ldi r20,$41 ;调用延时
00030c d130 rcall delay
00030d e400 ldi r16,$40 ;'-'
00030e deb6 rcall outxs
00030f e441 ldi r20,$41 ;调用延时
000310 d12c rcall delay
000311 e400 ldi r16,$40 ;'-'
000312 deb2 rcall outxs
000313 e441 ldi r20,$41 ;调用延时
000314 d128 rcall delay
000315 e400 ldi r16,$40 ;'-'
000316 deae rcall outxs
000317 9a95 sbi portd,5
000318 e441 ldi r20,$41 ;调用延时
000319 d123 rcall delay
00031a deae rcall beep
00031b e441 ldi r20,$41 ;调用延时
00031c d120 rcall delay
00031d deab rcall beep
00031e 2711 clr r17 ;ADIN 4051地址计数
00031f 2799 clr r25 ;setup键计数器
;rcall ADC1
000320 9b34 main: sbis adcsr,adif ;转换结束 ADC中断发生跳行否则等待 ADC1:
000321 cffe rjmp main
000322 b024 in r2,adcl ;把转换结果送r2,r3
000323 b035 in r3,adch
000324 99ca sbic pina,2 ;读开关量
000325 e020 ldi r18,$0 ;开关量关
000326 e021 ldi r18,$1 ;开关量开
000327 e0b1 ldi r27,$01 ;传数据到SRAM 0100 处
000328 2fa1 mov r26,r17
000329 932c st x,r18 ;传开关量到 0100
00032a 9938 sbic admux,0
00032b c002 rjmp admux1
00032c 9650 adiw r26,$10 ;传A0数据到SRAM 0110 处
00032d c001 rjmp chuan
00032e 9690 admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
00032f 922d chuan: st x+,r2 ;传低位数据
000330 923c st x,r3 ;传高位数据
000331 d030 rcall zhcwsd ;转换成温度
000332 fd10 sbrc r17,0 ;r17的0位清0跳行
000333 d030 rcall zhcsd ;转换成湿度
000334 2c4f mov res1,R15 ;00000000000000000000
000335 2e50 mov res2,R16 ;00000000000000000000
000336 d088 rcall htd3 ;16进制转10进制
000337 fd10 sbrc r17,0 ;r17的0位清0跳行
000338 c001 rjmp main0 ;1\3\5\7 通道为湿度
000339 c002 rjmp main1 ;0\2\4\6 通道为温度
00033a e100 main0: ldi r16,$10 ;湿度补偿10%
00033b 0e80 add cnt2d,r16
00033c 3090 main1: cpi r25,$0 ;setup键计数器为0
00033d f409 brne main2
00033e d0d1 rcall display ;调用显示子程序
00033f 3017 main2: cpi r17,$07
000340 f439 brne addre1 ;不等于7则跳转
000341 2711 clr r17 ;等于7
000342 9938 sbic admux,0 ;内地址
000343 c002 rjmp addre2 ;如果admux=1则置0
000344 9a38 sbi admux,0 ;如果admux=0则置1
000345 c003 rjmp addre3
000346 9838 addre2: cbi admux,0
000347 c001 rjmp addre3
000348 9513 addre1: inc r17
000349 2f21 addre3: mov r18,r17
00034a 7021 andi r18,$01
00034b 3021 cpi r18,$01
00034c f411 brne addre4
00034d 9adb sbi porta,3
00034e c001 rjmp addre5
00034f 98db addre4: cbi porta,3
000350 2f21 addre5: mov r18,r17
000351 7022 andi r18,$02
000352 3022 cpi r18,$02
000353 f411 brne addre6
000354 9adc sbi porta,4
000355 c001 rjmp addre7
000356 98dc addre6: cbi porta,4
000357 2f21 addre7: mov r18,r17
000358 7024 andi r18,$04
000359 3024 cpi r18,$04
00035a f411 brne addre8
00035b 9add sbi porta,5
00035c c001 rjmp addre9
00035d 98dd addre8: cbi porta,5
00035e e546 addre9: ldi r20,0X56 ;延时1秒
00035f d0dd rcall Delay
000360 9a36 sbi adcsr,6 ;启动ADC
000361 cfbe rjmp main ;
;********* 子程序区 *********
;**** ADC转换子程序
;ADC1: sbis adcsr,adif ;转换结束 ADC中断发生跳行否则等待
; rjmp ADC1
; in r2,adcl ;把转换结果送r2,r3
; in r3,adch
; sbic pina,2 ;读开关量
; ldi r18,$0 ;开关量关
; ldi r18,$1 ;开关量开
;
; ldi r27,$01 ;传数据到SRAM 0100 处
; mov r26,r17
; st x,r18 ;传开关量到 0100
; sbic admux,0
; rjmp admux1
; adiw r26,$10 ;传A0数据到SRAM 0110 处
; rjmp chuan
;admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
;chuan: st x+,r2 ;传低位数据
; st x,r3 ;传高位数据
; ret
;**** 数据转换成温湿度
000362 d049 zhcwsd: rcall div16
000363 9508 ret
zhcsd: ;湿度10~90%,应多乘2
000364 d039 rcall MUL16
000365 9508 ret
;**** 四字节压缩BCD码相加子程序(R15,R14,R13,R12)+(R11,R10,R9,R8)→R15,R14,R13,R12
000366 0cc8 ADBCD: add R12,R8 ;最低位字节相加
000367 2d4c mov R20,R12
000368 d00e rcall ADAA ;在R20里进行加法十进制调整
000369 2ec4 mov R12,R20 ;调整后结果送回
00036a 1cd9 adc R13,R9 ;对高位字节也照此处理
00036b 2d4d mov R20,R13
00036c d00a rcall ADAA
00036d 2ed4 mov R13,R20
00036e 1cea adc R14,R10
00036f 2d4e mov R20,R14
000370 d006 rcall ADAA
000371 2ee4 mov R14,R20
000372 1cfb adc R15,R11
000373 2d4f mov R20,R15
000374 d002 rcall ADAA
000375 2ef4 mov R15,R20 ;最高位字节相加调整完毕
000376 9508 ret
;**** BCD码相加或左移十进制调整子程序
000377 b67f ADAA: in R7,SREG ;BCD码相加十进制调整子程序,先保存相加后的状态
000378 e666 ldi R22,$66
000379 0f46 add R20,R22 ;予加$66
00037a b66f in R6,SREG ;存加$66后的状态
00037b 2867 or R6,R7 ;将新旧两状态或起来(只用C,H两位)
00037c fe60 sbrs R6,0 ;若进位C置位,跳过下条指令
00037d 5640 subi R20,$60 ;否则减去$60
00037e fe65 sbrs R6,5 ;若半进位H置位,跳过下条指令
00037f 5046 subi R20,6 ;否则减去6
000380 be6f out SREG,R6 ;恢复进位C,以保证高位字节正确相加
000381 9508 ret
;**** 四字节压缩BCD码相加子程序(R15,R14,R13,R12)-(R11,R10,R9,R8)→R15,R14,R13,R12
000382 18c8 SUBCD: sub R12,R8 ;最低位字节相减
000383 2d4c mov R20,R12
000384 d00e rcall SDAA ;在R20里进行减法十进制调整
000385 2ec4 mov R12,R20
000386 08d9 sbc R13,R9
000387 2d4d mov R20,R13
000388 d00a rcall SDAA
000389 2ed4 mov R13,R20
00038a 08ea sbc R14,R10
00038b 2d4e mov R20,R14
00038c d006 rcall SDAA
00038d 2ee4 mov R14,R20
00038e 08fb sbc R15,R11
00038f 2d4f mov R20,R15
000390 d002 rcall SDAA
000391 2ef4 mov R15,R20 ;最高位字节相减调整完毕并回送
000392 9508 ret
;**** 十进制减法调整子程序
000393 f420 SDAA: brcc SBD1 ;进位位清除,跳转
000394 f435 brhc SBD2 ;半进位清除,跳转
000395 5646 subi R20,$66 ;否则将差减去$66
000396 9408 sec ;并恢复借位C
000397 9508 ret
000398 f425 SBD1: brhc SBD3 ;半进位也清除,返回(不须调整)
000399 5046 subi R20,$6 ;否则将差减去6
00039a 9508 ret
00039b 5640 SBD2: subi R20,$60 ;将差减去$60
00039c 9408 sec ;并恢复借位C
00039d 9508 SBD3: ret
;**** 定点整数乘法子程序 (R5,R4)×(R7,R6)→R9,R8,R7,R6
00039e e121 MUL16: ldi R18,$11 ;循环右移17次
00039f 2499 clr R9
0003a0 2488 clr R8 ;积高位部分予清除
0003a1 9488 clc ;第一次只移位
0003a2 f410 MLOP: brcc MUL1 ;进位位被清除,跳转
0003a3 0c84 add R8,R4
0003a4 1c95 adc R9,R5 ;否则,被乘数加入部分积
0003a5 9497 MUL1: ror R9
0003a6 9487 ror R8
0003a7 9477 ror R7
0003a8 9467 ror R6 ;并将部分积(及乘数)带进位右移
0003a9 952a dec R18
0003aa f7b9 brne MLOP ;相加右移16次,结束
0003ab 9508 ret
;**** 定点整数除法子程序 R7,R6←(R9,R8,R7,R6)÷(R5,R4)
0003ac e120 DIV16: ldi R18,$10 ;循环左移16次
0003ad 0c66 DLOP: lsl R6
0003ae 1c77 rol R7
0003af 1c88 rol R8
0003b0 1c99 rol R9 ;被除数算数左移一位
0003b1 f418 brcc DIV1 ;进位清除,跳转
0003b2 1884 sub R8,R4
0003b3 0895 sbc R9,R5
0003b4 c006 rjmp DIV2 ;否则将被除数(比除数多1位)减去除数并转记商1
0003b5 1884 DIV1: sub R8,R4
0003b6 0895 sbc R9,R5 ;相减试商
0003b7 f418 brcc DIV2 ;进位被清除(够减),本位商为1
0003b8 0c84 add R8,R4
0003b9 1c95 adc R9,R5
0003ba c001 rjmp DIV3 ;不够减,恢复被减数,本位商为0
0003bb 9463 DIV2: inc R6 ;记商1
0003bc 952a DIV3: dec R18
0003bd f779 brne DLOP ;16次循环,除法结束
0003be 9508 ret
;**** HEX TO BCD 子程序
0003bf e138 htd3: ldi temp,24
0003c0 2ea3 mov count,temp
0003c1 2733 clr temp
0003c2 2477 clr cnt1d
0003c3 2488 clr cnt2d
0003c4 2499 clr cnt3d
0003c5 9488 clc
0003c6 1c44 htd31: rol res1
0003c7 1c55 rol res2
0003c8 1c66 rol res3
0003c9 1c77 rol cnt1d
0003ca 1c88 rol cnt2d
0003cb 1c99 rol cnt3d
0003cc 94aa dec count
0003cd f409 brne htd32
0003ce 9508 ret
0003cf 92af htd32: push count
0003d0 2ca7 mov count,cnt1d
0003d1 d009 rcall htd33
0003d2 2c7a mov cnt1d,count
0003d3 2ca8 mov count,cnt2d
0003d4 d006 rcall htd33
0003d5 2c8a mov cnt2d,count
0003d6 2ca9 mov count,cnt3d
0003d7 d003 rcall htd33
0003d8 2c9a mov cnt3d,count
0003d9 90af pop count
0003da cfeb rjmp htd31
0003db e033 htd33: ldi temp,3
0003dc 0d3a add temp,count
0003dd fd33 sbrc temp,3
0003de 2ea3 mov count,temp
0003df e330 ldi temp,$30
0003e0 0d3a add temp,count
0003e1 fd37 sbrc temp,7
0003e2 2ea3 mov count,temp
0003e3 9508 ret
;**** BCD TO HEX 子程序
0003e4 2444 btoh: clr r4
0003e5 2455 clr r5
0003e6 e033 ldi r19,$03
0003e7 ee28 ldi r18,$e8
0003e8 2d07 mov r16,r7
0003e9 9502 swap r16
0003ea 700f andi r16,$0f
0003eb f039 breq btoh03
0003ec 0e53 btoh01: add r5,r19
0003ed 0e42 add r4,r18
0003ee 1642 cp r4,r18
0003ef f408 brsh btoh02
0003f0 9453 inc r5
0003f1 950a btoh02: dec r16
0003f2 f7c9 brne btoh01
0003f3 e624 btoh03: ldi r18,$64
0003f4 2d07 mov r16,r7
0003f5 700f andi r16,$0f
0003f6 f031 breq btoh06
0003f7 0e42 btoh04: add r4,r18
0003f8 1642 cp r4,r18
0003f9 f408 brsh btoh05
0003fa 9453 inc r5
0003fb 950a btoh05: dec r16
0003fc f7d1 brne btoh04
0003fd e02a btoh06: ldi r18,$0a
0003fe 2d06 mov r16,r6
0003ff 9502 swap r16
000400 700f andi r16,$0f
000401 f031 breq btoh09
000402 0e42 btoh07: add r4,r18
000403 1642 cp r4,r18
000404 f408 brsh btoh08
000405 9453 inc r5
000406 950a btoh08: dec r16
000407 f7d1 brne btoh07
000408 2d06 btoh09: mov r16,r6
000409 700f andi r16,$0f
00040a f021 breq btoh11
00040b 0e40 btoh10: add r4,r16
00040c 1640 cp r4,r16
00040d f408 brsh btoh11
00040e 9453 inc r5
00040f 9508 btoh11: ret
;**** LED数显子程序
000410 9a95 display:sbi portd,5 ;初始化8279控制字
000411 9894 cbi portd,4
000412 9a93 sbi portd,3
000413 e970 ldi r23,$90
000414 bb78 out portb,r23
000415 0000 nop
000416 9a94 sbi portd,4
000417 9895 cbi portd,5
000418 e0fc ldi zh,high(label*2);0~15通道号切换
000419 2fe1 mov zl,r17
00041a 9938 sbic admux,0
00041b 9638 adiw zl,8
00041c 95c8 lpm
00041d ba08 out portb,r0
00041e 9894 cbi portd,4
00041f 0000 nop
000420 9a94 sbi portd,4
000421 2d08 mov r16,cnt2d
000422 9502 swap r16
000423 d010 rcall outpd
000424 e1e0 ldi zl,$10
000425 2d08 mov r16,cnt2d
000426 700f andi r16,$0f
000427 0fe0 add zl,r16
000428 95c8 lpm
000429 ba08 out portb,r0
00042a 9894 cbi portd,4
00042b 0000 nop
00042c 9a94 sbi portd,4
00042d 2d07 mov r16,cnt1d
00042e 9502 swap r16
00042f d004 rcall outpd
000430 2d07 mov r16,cnt1d
000431 d002 rcall outpd
000432 9a95 sbi portd,5 ;向8279传送数据结束
000433 9508 ret
000434 e0e0 outpd: ldi zl,low(label*2)
000435 700f andi r16,$0f
000436 0fe0 add zl,r16
000437 95c8 lpm
000438 ba08 out portb,r0
000439 9894 cbi portd,4
00043a 0000 nop
00043b 9a94 sbi portd,4
00043c 9508 ret
;**** 延时子程序
;delay: ret
00043d 934f delay: push r20 ;2t
00043e 934f l0: push r20 ;2t
00043f 934f l1: push r20 ;2t
000440 934f l2: push r20 ;2t
000441 954a l3: dec r20 ;1t
000442 f7f1 brne l3 ;1t/2t
000443 914f pop r20 ;2t
000444 954a dec r20 ;1t
000445 f7d1 brne l2 ;1t/2t
000446 914f pop r20 ;2t
000447 954a dec r20 ;1t
000448 f7b1 brne l1 ;1t/2t
000449 914f pop r20 ;2t
00044a 954a dec r20 ;1t
00044b f791 brne l0 ;1T/2T
00044c 914f pop r20 ;2t
00044d 9508 ret ;4t
;**** 数据区
.cseg
.org $0600
.dw 0x063f,0x4f5b,0x6d66,0x077d
000600 063f
000601 4f5b
000602 6d66
000603 077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179
000604 6f7f
000605 7c77
000606 5e39
000607 7179
.dw 0x86bf,0xcfdb,0xede6,0x87fd
000608 86bf
000609 cfdb
00060a ede6
00060b 87fd
.dw 0xefff00060c efff
Assembly complete with no errors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -