📄 dout.lst
字号:
00027e 9a8e sbi ddrd,6
00027f 9a96 sbi portd,6
000280 df17 rcall cs8279 ;显示字符
000281 e400 ldi r16,$40 ;'-'
000282 df1e rcall outxs
000283 e441 ldi r20,$41 ;调用延时
000284 d107 rcall delay
000285 e400 ldi r16,$40 ;'-'
000286 df1a rcall outxs
000287 e441 ldi r20,$41 ;调用延时
000288 d103 rcall delay
000289 e400 ldi r16,$40 ;'-'
00028a df16 rcall outxs
00028b e441 ldi r20,$41 ;调用延时
00028c d0ff rcall delay
00028d e400 ldi r16,$40 ;'-'
00028e df12 rcall outxs
00028f e441 ldi r20,$41 ;调用延时
000290 d0fb rcall delay
000291 e400 ldi r16,$40 ;'-'
000292 df0e rcall outxs
000293 e441 ldi r20,$41 ;调用延时
000294 d0f7 rcall delay
000295 e400 ldi r16,$40 ;'-'
000296 df0a rcall outxs
000297 9a95 sbi portd,5
000298 e441 ldi r20,$41 ;调用延时
000299 d0f2 rcall delay
00029a df0a rcall beep
00029b e441 ldi r20,$41 ;调用延时
00029c d0ef rcall delay
00029d df07 rcall beep
00029e 2711 clr r17 ;ADIN 4051地址计数
00029f d02f main: rcall ADC1
0002a0 d040 rcall zhcwsd ;转换成温度
0002a1 fd10 sbrc r17,0 ;r17的0位清0跳行
0002a2 d062 rcall zhcsd ;转换成湿度
0002a3 2c4b mov res1,m16ua
0002a4 2c5c mov res2,m16ub
0002a5 d088 rcall htd3 ;16进制转10进制
0002a6 fd10 sbrc r17,0 ;r17的0位清0跳行
0002a7 c001 rjmp main0 ;1\3\5\7 通道为湿度
0002a8 c002 rjmp main1 ;0\2\4\6 通道为温度
0002a9 e100 main0: ldi r16,$10 ;湿度补偿10%
0002aa 0e70 add cnt2d,r16
0002ab d0a3 main1: rcall display ;调用显示子程序
0002ac 3017 cpi r17,$07
0002ad f439 brne addre1 ;不等于7则跳转
0002ae 2711 clr r17 ;等于7
0002af 9938 sbic admux,0 ;内地址
0002b0 c002 rjmp addre2 ;如果admux=1则置0
0002b1 9a38 sbi admux,0 ;如果admux=0则置1
0002b2 c003 rjmp addre3
0002b3 9838 addre2: cbi admux,0
0002b4 c001 rjmp addre3
0002b5 9513 addre1: inc r17
0002b6 2f21 addre3: mov r18,r17
0002b7 7021 andi r18,$01
0002b8 3021 cpi r18,$01
0002b9 f411 brne addre4
0002ba 9adb sbi porta,3
0002bb c001 rjmp addre5
0002bc 98db addre4: cbi porta,3
0002bd 2f21 addre5: mov r18,r17
0002be 7022 andi r18,$02
0002bf 3022 cpi r18,$02
0002c0 f411 brne addre6
0002c1 9adc sbi porta,4
0002c2 c001 rjmp addre7
0002c3 98dc addre6: cbi porta,4
0002c4 2f21 addre7: mov r18,r17
0002c5 7024 andi r18,$04
0002c6 3024 cpi r18,$04
0002c7 f411 brne addre8
0002c8 9add sbi porta,5
0002c9 c001 rjmp addre9
0002ca 98dd addre8: cbi porta,5
0002cb e546 addre9: ldi r20,0X56 ;延时1秒
0002cc d0bf rcall Delay
0002cd 9a36 sbi adcsr,6 ;启动ADC
0002ce cfd0 rjmp main ;
;********* 子程序区 *********
;**** ADC转换子程序
0002cf 9b34 ADC1: sbis adcsr,adif ;转换结束 ADC中断发生跳行否则等待
0002d0 cffe rjmp ADC1
0002d1 b024 in r2,adcl ;把转换结果送r2,r3
0002d2 b035 in r3,adch
0002d3 99ca sbic pina,2 ;读开关量
0002d4 e020 ldi r18,$0 ;开关量关
0002d5 e021 ldi r18,$1 ;开关量开
0002d6 e0b1 ldi r27,$01 ;传数据到SRAM 0100 处
0002d7 2fa1 mov r26,r17
0002d8 932c st x,r18 ;传开关量到 0100
0002d9 9938 sbic admux,0
0002da c002 rjmp admux1
0002db 9650 adiw r26,$10 ;传A0数据到SRAM 0110 处
0002dc c001 rjmp chuan
0002dd 9690 admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
0002de 922d chuan: st x+,r2 ;传低位数据
0002df 923c st x,r3 ;传高位数据
0002e0 9508 ret
;**** 数据转换成温湿度
0002e1 2c92 zhcwsd: mov mc16ul,r2 ;T=D*40/1023=D*50/11*10/3*4/31*2
0002e2 2ca3 mov mc16uh,r3
0002e3 24cc clr mp16uh
0002e4 e352 ldi mcnt16u,50
0002e5 2eb5 mov mp16ul,mcnt16u
0002e6 d025 rcall mpy16u
0002e7 2cbb mov mp16ul,m16ua
0002e8 2ccc mov mp16uh,m16ub
0002e9 e05b ldi mcnt16u,11
0002ea 2e95 mov mc16ul,mcnt16u
0002eb 24aa clr mc16uh
0002ec d02e rcall div16u
0002ed 2c9b mov mc16ul,m16ua
0002ee 2cac mov mc16uh,m16ub
0002ef e05a ldi mcnt16u,10
0002f0 2eb5 mov mp16ul,mcnt16u
0002f1 24cc clr mp16uh
0002f2 d019 rcall mpy16u
0002f3 2cbb mov mp16ul,m16ua
0002f4 2ccc mov mp16uh,m16ub
0002f5 e053 ldi mcnt16u,3
0002f6 2e95 mov mc16ul,mcnt16u
0002f7 24aa clr mc16uh
0002f8 d022 rcall div16u
0002f9 2c9b mov mc16ul,m16ua
0002fa 2cac mov mc16uh,m16ub
0002fb e054 ldi mcnt16u,4
0002fc 2eb5 mov mp16ul,mcnt16u
0002fd 24cc clr mp16uh
0002fe d00d rcall mpy16u
0002ff 2cbb mov mp16ul,m16ua
000300 2ccc mov mp16uh,m16ub
000301 e15f ldi mcnt16u,31
000302 2e95 mov mc16ul,mcnt16u
000303 24aa clr mc16uh
000304 d016 rcall div16u
000305 2c9b zhcsd: mov mc16ul,m16ua ;湿度10~90%,应多乘2
000306 2cac mov mc16uh,m16ub
000307 e052 ldi mcnt16u,2
000308 2eb5 mov mp16ul,mcnt16u
000309 24cc clr mp16uh
00030a d001 rcall mpy16u
00030b 9508 ret
;**** 16位无符号乘法
.def mc16uL =r9 ;被乘数低字节
.def mc16uH =r10 ;被乘数高字节
.def mp16uL =r11 ;乘数低字节
.def mp16uH =r12 ;乘数高字节
.def m16ua =r11 ;结果 字节 0 (LSB)
.def m16ub =r12 ;结果 字节 1
.def m16u2 =r13 ;结果 字节 2
.def m16u3 =r14 ;结果 字节 3 (MSB)
.def mcnt16u =r21 ;循环计数
00030c 24ee mpy16u: clr m16u3 ;清2.3
00030d 24dd clr m16u2
00030e e150 ldi mcnt16u,16 ;
00030f 94c6 lsr mp16uH
000310 94b7 ror mp16uL
000311 f410 m16u_1: brcc noad8 ;C清零转
000312 0cd9 add m16u2,mc16uL ;加被乘数到2
000313 1cea adc m16u3,mc16uH ;加被乘数到3
000314 94e7 noad8: ror m16u3 ;带进位右循环
000315 94d7 ror m16u2 ;带进位右循环
000316 94c7 ror m16ub ;带进位右循环
000317 94b7 ror m16ua ;带进位右循环
000318 955a dec mcnt16u ;计数减1
000319 f7b9 brne m16u_1 ;不为零转
00031a 9508 ret
;***** 16位无符号除法
.def drem16uL=r13 ;余数 低位
.def drem16uH=r14 ;余数 高位
.def dres16uL=r11 ; 商 低位
.def dres16uH=r12 ; 商 高位
.def dd16uL =r11 ;被除数 低位
.def dd16uH =r12 ;被除数 高位
.def dv16uL =r9 ;除数 低位
.def dv16uH =r10 ;除数 高位
.def dcnt16u =r21
00031b 24dd div16u: clr drem16uL ;清除余数低位
00031c 18ee sub drem16uH,drem16uH ;清除余数高位
00031d e151 ldi dcnt16u,17 ;循环计数
00031e 1cbb d16u_1: rol dd16uL ;带进位左移
00031f 1ccc rol dd16uH
000320 955a dec dcnt16u ;decrement counter
000321 f409 brne d16u_2 ;不为0转
000322 9508 ret ;return
000323 1cdd d16u_2: rol drem16uL ;shift dividend into remainder
000324 1cee rol drem16uH
000325 18d9 sub drem16uL,dv16uL ;remainder = remainder - divisor
000326 08ea sbc drem16uH,dv16uH ;
000327 f420 brcc d16u_3 ;if result negative
000328 0cd9 add drem16uL,dv16uL ;restore remainder
000329 1cea adc drem16uH,dv16uH
00032a 9488 clc ;clear carry to be shifted into result
00032b cff2 rjmp d16u_1 ;else
00032c 9408 d16u_3: sec ;set carry to be shifted into result
00032d cff0 rjmp d16u_1
;**** 16进制转10进制子程序
00032e e130 htd3: ldi temp,16
00032f 2e83 mov count,temp
000330 2733 clr temp
000331 2466 clr cnt1d
000332 2477 clr cnt2d
000333 9488 clc
loopd:
000334 1c44 rol res1
000335 1c55 rol res2
000336 1c66 rol cnt1d
000337 1c77 rol cnt2d
000338 948a dec count
000339 f409 brne c
00033a 9508 ret
00033b d001 c: rcall adjn
00033c cff7 rjmp loopd
adjn:
00033d 928f push count
00033e 2c86 mov count,cnt1d
00033f d006 rcall adjd1
000340 2c68 mov cnt1d,count
000341 2c87 mov count,cnt2d
000342 d003 rcall adjd1
000343 2c78 mov cnt2d,count
000344 908f pop count
000345 9508 ret
adjd1:
000346 e033 ldi temp,3
000347 0d38 add temp,count
000348 fd33 sbrc temp,3
000349 2e83 mov count,temp
00034a e330 ldi temp,$30
00034b 0d38 add temp,count
00034c fd37 sbrc temp,7
00034d 2e83 mov count,temp
00034e 9508 ret
;**** LED数显子程序
00034f 9a95 display:sbi portd,5 ;初始化8279控制字
000350 9894 cbi portd,4
000351 9a93 sbi portd,3
000352 e970 ldi r23,$90
000353 bb78 out portb,r23
000354 0000 nop
000355 9a94 sbi portd,4
000356 9895 cbi portd,5
000357 e0f8 ldi zh,high(label*2) ;0~15通道号切换
000358 2fe1 mov zl,r17
000359 9938 sbic admux,0
00035a c001 rjmp dis1
00035b c001 rjmp dis0
00035c 9638 dis1: adiw zl,$08
00035d 95c8 dis0: lpm
00035e ba08 out portb,r0
00035f 9894 cbi portd,4
000360 0000 nop
000361 9a94 sbi portd,4
000362 2d07 mov r16,cnt2d
000363 9502 swap r16
000364 d010 rcall outpd
000365 e1e0 ldi zl,$10
000366 2d07 mov r16,cnt2d
000367 700f andi r16,$0f
000368 0fe0 add zl,r16
000369 95c8 lpm
00036a ba08 out portb,r0
00036b 9894 cbi portd,4
00036c 0000 nop
00036d 9a94 sbi portd,4
00036e 2d06 mov r16,cnt1d
00036f 9502 swap r16
000370 d004 rcall outpd
000371 2d06 mov r16,cnt1d
000372 d002 rcall outpd
000373 9a95 sbi portd,5 ;向8279传送数据结束
000374 9508 ret
000375 e0e0 outpd: ldi zl,low(label*2)
000376 700f andi r16,$0f
000377 0fe0 add zl,r16
000378 95c8 lpm
000379 ba08 out portb,r0
00037a 9894 cbi portd,4
00037b 0000 nop
00037c 9a94 sbi portd,4
00037d 9508 ret
00037e bb05 AOOUT: out portc,r16 ;out data
00037f 9adf sbi porta,7 ;打开DAC锁存
000380 0000 nop
000381 98df cbi porta,7
000382 bb15 out portc,r17 ;地址
000383 9ade sbi porta,6 ;打开地址锁存
000384 0000 nop
000385 98de cbi porta,6
000386 9508 ret
000387 bb05 DOOUT: out portc,r16 ;out data
000388 9a97 sbi portD,7 ;打开DO锁存
000389 0000 nop
00038a 9897 cbi portD,7
00038b 9508 ret
;**** 延时子程序
;delay: ret
00038c 934f delay: push r20 ;2t
00038d 934f l0: push r20 ;2t
00038e 934f l1: push r20 ;2t
00038f 934f l2: push r20 ;2t
000390 954a l3: dec r20 ;1t
000391 f7f1 brne l3 ;1t/2t
000392 914f pop r20 ;2t
000393 954a dec r20 ;1t
000394 f7d1 brne l2 ;1t/2t
000395 914f pop r20 ;2t
000396 954a dec r20 ;1t
000397 f7b1 brne l1 ;1t/2t
000398 914f pop r20 ;2t
000399 954a dec r20 ;1t
00039a f791 brne l0 ;1T/2T
00039b 914f pop r20 ;2t
00039c 9508 ret ;4t
;**** 数据区
.cseg
.org $0400
.dw 0x063f,0x4f5b,0x6d66,0x077d
000400 063f
000401 4f5b
000402 6d66
000403 077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179
000404 6f7f
000405 7c77
000406 5e39
000407 7179
.dw 0x86bf,0xcfdb,0xede6,0x87fd
000408 86bf
000409 cfdb
00040a ede6
00040b 87fd
.dw 0xefff00040c efff
Assembly complete with no errors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -