📄 no3a.lst
字号:
00029e 930d st x+,r16
00029f 9583 inc r24
0002a0 308f cpi r24,$0f
0002a1 f7a9 brne EEpRead
;rcall cansujs ;^^^^^^^^^^^^^^^^^^^^
0002a2 e908 ldi r16,$98 ;初始化COM
0002a3 b90a out ucr,r16 ;设置UART控制寄存器---UCR
0002a4 e5aa ldi r26,$5a ;波特率在SRAM的0x015a处
0002a5 910c ld r16,x
;ldi r16,25
0002a6 b909 out ubrr,r16 ;设置UART波特率
0002a7 e003 ldi r16,$3 ;INT0上升沿触发 0b00000011
0002a8 bf05 out mcucr,r16
0002a9 e400 ldi r16,$40
0002aa bf0b out GIMSK,R16 ;INT0可用,INT1屏蔽 0b01000000
0002ab bf0a out GIFR,r16
0002ac 9478 sei
0002ad 9894 cbi portd,4
0002ae e000 ldi r16,$00 ;8279键盘显示方式初始
0002af bb08 out portb,r16
0002b0 9a94 sbi portd,4
0002b1 0000 nop
0002b2 9894 cbi portd,4
0002b3 e202 ldi r16,$22 ;8279时钟分频=2
0002b4 bb08 out portb,r16
0002b5 9a94 sbi portd,4
0002b6 df18 rcall cs8279 ;显示字符
0002b7 e400 ldi r16,$40 ;'-'
0002b8 df1f rcall outxs
0002b9 e441 ldi r20,$41 ;调用延时
0002ba d0fc rcall delay
0002bb e400 ldi r16,$40 ;'-'
0002bc df1b rcall outxs
0002bd e441 ldi r20,$41 ;调用延时
0002be d0f8 rcall delay
0002bf e400 ldi r16,$40 ;'-'
0002c0 df17 rcall outxs
0002c1 e441 ldi r20,$41 ;调用延时
0002c2 d0f4 rcall delay
0002c3 e400 ldi r16,$40 ;'-'
0002c4 df13 rcall outxs
0002c5 e441 ldi r20,$41 ;调用延时
0002c6 d0f0 rcall delay
0002c7 e400 ldi r16,$40 ;'-'
0002c8 df0f rcall outxs
0002c9 e441 ldi r20,$41 ;调用延时
0002ca d0ec rcall delay
0002cb e400 ldi r16,$40 ;'-'
0002cc df0b rcall outxs
0002cd 9a95 sbi portd,5
0002ce e441 ldi r20,$41 ;调用延时
0002cf d0e7 rcall delay
0002d0 df0b rcall beep
0002d1 e441 ldi r20,$41 ;调用延时
0002d2 d0e4 rcall delay
0002d3 df08 rcall beep
0002d4 2711 clr r17 ;ADIN 4051地址计数
0002d5 2799 clr r25 ;setup键计数器
0002d6 d031 main: rcall ADC1
0002d7 d042 rcall zhcwsd ;转换成温度
0002d8 fd10 sbrc r17,0 ;r17的0位清0跳行
0002d9 d064 rcall zhcsd ;转换成湿度
0002da 2c4b mov res1,m16ua
0002db 2c5c mov res2,m16ub
0002dc d08a rcall htd3 ;16进制转10进制
0002dd fd10 sbrc r17,0 ;r17的0位清0跳行
0002de c001 rjmp main0 ;1\3\5\7 通道为湿度
0002df c002 rjmp main1 ;0\2\4\6 通道为温度
0002e0 e100 main0: ldi r16,$10 ;湿度补偿10%
0002e1 0e70 add cnt2d,r16
0002e2 3090 main1: cpi r25,$0 ;setup键计数器为0
0002e3 f409 brne main2
0002e4 d0a3 rcall display ;调用显示子程序
0002e5 3017 main2: cpi r17,$07
0002e6 f439 brne addre1 ;不等于7则跳转
0002e7 2711 clr r17 ;等于7
0002e8 9938 sbic admux,0 ;内地址
0002e9 c002 rjmp addre2 ;如果admux=1则置0
0002ea 9a38 sbi admux,0 ;如果admux=0则置1
0002eb c003 rjmp addre3
0002ec 9838 addre2: cbi admux,0
0002ed c001 rjmp addre3
0002ee 9513 addre1: inc r17
0002ef 2f21 addre3: mov r18,r17
0002f0 7021 andi r18,$01
0002f1 3021 cpi r18,$01
0002f2 f411 brne addre4
0002f3 9adb sbi porta,3
0002f4 c001 rjmp addre5
0002f5 98db addre4: cbi porta,3
0002f6 2f21 addre5: mov r18,r17
0002f7 7022 andi r18,$02
0002f8 3022 cpi r18,$02
0002f9 f411 brne addre6
0002fa 9adc sbi porta,4
0002fb c001 rjmp addre7
0002fc 98dc addre6: cbi porta,4
0002fd 2f21 addre7: mov r18,r17
0002fe 7024 andi r18,$04
0002ff 3024 cpi r18,$04
000300 f411 brne addre8
000301 9add sbi porta,5
000302 c001 rjmp addre9
000303 98dd addre8: cbi porta,5
000304 e546 addre9: ldi r20,0X56 ;延时1秒
000305 d0b1 rcall Delay
000306 9a36 sbi adcsr,6 ;启动ADC
000307 cfce rjmp main ;
;********* 子程序区 *********
;**** ADC转换子程序
000308 9b34 ADC1: sbis adcsr,adif ;转换结束 ADC中断发生跳行否则等待
000309 cffe rjmp ADC1
00030a b024 in r2,adcl ;把转换结果送r2,r3
00030b b035 in r3,adch
00030c 99ca sbic pina,2 ;读开关量
00030d e020 ldi r18,$0 ;开关量关
00030e e021 ldi r18,$1 ;开关量开
00030f e0b1 ldi r27,$01 ;传数据到SRAM 0100 处
000310 2fa1 mov r26,r17
000311 932c st x,r18 ;传开关量到 0100
000312 9938 sbic admux,0
000313 c002 rjmp admux1
000314 9650 adiw r26,$10 ;传A0数据到SRAM 0110 处
000315 c001 rjmp chuan
000316 9690 admux1: adiw r26,$20 ;传A1数据到SRAM 0120 处
000317 922d chuan: st x+,r2 ;传低位数据
000318 923c st x,r3 ;传高位数据
000319 9508 ret
;**** 数据转换成温湿度
00031a 2c92 zhcwsd: mov mc16ul,r2 ;T=D*40/1023=D*50/11*10/3*4/31*2
00031b 2ca3 mov mc16uh,r3
00031c 24cc clr mp16uh
00031d e352 ldi mcnt16u,50
00031e 2eb5 mov mp16ul,mcnt16u
00031f d025 rcall mpy16u
000320 2cbb mov mp16ul,m16ua
000321 2ccc mov mp16uh,m16ub
000322 e05b ldi mcnt16u,11
000323 2e95 mov mc16ul,mcnt16u
000324 24aa clr mc16uh
000325 d02e rcall div16u
000326 2c9b mov mc16ul,m16ua
000327 2cac mov mc16uh,m16ub
000328 e05a ldi mcnt16u,10
000329 2eb5 mov mp16ul,mcnt16u
00032a 24cc clr mp16uh
00032b d019 rcall mpy16u
00032c 2cbb mov mp16ul,m16ua
00032d 2ccc mov mp16uh,m16ub
00032e e053 ldi mcnt16u,3
00032f 2e95 mov mc16ul,mcnt16u
000330 24aa clr mc16uh
000331 d022 rcall div16u
000332 2c9b mov mc16ul,m16ua
000333 2cac mov mc16uh,m16ub
000334 e054 ldi mcnt16u,4
000335 2eb5 mov mp16ul,mcnt16u
000336 24cc clr mp16uh
000337 d00d rcall mpy16u
000338 2cbb mov mp16ul,m16ua
000339 2ccc mov mp16uh,m16ub
00033a e15f ldi mcnt16u,31
00033b 2e95 mov mc16ul,mcnt16u
00033c 24aa clr mc16uh
00033d d016 rcall div16u
00033e 2c9b zhcsd: mov mc16ul,m16ua ;湿度10~90%,应多乘2
00033f 2cac mov mc16uh,m16ub
000340 e052 ldi mcnt16u,2
000341 2eb5 mov mp16ul,mcnt16u
000342 24cc clr mp16uh
000343 d001 rcall mpy16u
000344 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 ;循环计数
000345 24ee mpy16u: clr m16u3 ;清2.3
000346 24dd clr m16u2
000347 e150 ldi mcnt16u,16 ;
000348 94c6 lsr mp16uH
000349 94b7 ror mp16uL
00034a f410 m16u_1: brcc noad8 ;C清零转
00034b 0cd9 add m16u2,mc16uL ;加被乘数到2
00034c 1cea adc m16u3,mc16uH ;加被乘数到3
00034d 94e7 noad8: ror m16u3 ;带进位右循环
00034e 94d7 ror m16u2 ;带进位右循环
00034f 94c7 ror m16ub ;带进位右循环
000350 94b7 ror m16ua ;带进位右循环
000351 955a dec mcnt16u ;计数减1
000352 f7b9 brne m16u_1 ;不为零转
000353 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
000354 24dd div16u: clr drem16uL ;清除余数低位
000355 18ee sub drem16uH,drem16uH ;清除余数高位
000356 e151 ldi dcnt16u,17 ;循环计数
000357 1cbb d16u_1: rol dd16uL ;带进位左移
000358 1ccc rol dd16uH
000359 955a dec dcnt16u ;decrement counter
00035a f409 brne d16u_2 ;不为0转
00035b 9508 ret ;return
00035c 1cdd d16u_2: rol drem16uL ;shift dividend into remainder
00035d 1cee rol drem16uH
00035e 18d9 sub drem16uL,dv16uL ;remainder = remainder - divisor
00035f 08ea sbc drem16uH,dv16uH ;
000360 f420 brcc d16u_3 ;if result negative
000361 0cd9 add drem16uL,dv16uL ;restore remainder
000362 1cea adc drem16uH,dv16uH
000363 9488 clc ;clear carry to be shifted into result
000364 cff2 rjmp d16u_1 ;else
000365 9408 d16u_3: sec ;set carry to be shifted into result
000366 cff0 rjmp d16u_1
;**** 16进制转10进制子程序
000367 e130 htd3: ldi temp,16
000368 2e83 mov count,temp
000369 2733 clr temp
00036a 2466 clr cnt1d
00036b 2477 clr cnt2d
00036c 9488 clc
loopd:
00036d 1c44 rol res1
00036e 1c55 rol res2
00036f 1c66 rol cnt1d
000370 1c77 rol cnt2d
000371 948a dec count
000372 f409 brne c
000373 9508 ret
000374 d001 c: rcall adjn
000375 cff7 rjmp loopd
adjn:
000376 928f push count
000377 2c86 mov count,cnt1d
000378 d006 rcall adjd1
000379 2c68 mov cnt1d,count
00037a 2c87 mov count,cnt2d
00037b d003 rcall adjd1
00037c 2c78 mov cnt2d,count
00037d 908f pop count
00037e 9508 ret
adjd1:
00037f e033 ldi temp,3
000380 0d38 add temp,count
000381 fd33 sbrc temp,3
000382 2e83 mov count,temp
000383 e330 ldi temp,$30
000384 0d38 add temp,count
000385 fd37 sbrc temp,7
000386 2e83 mov count,temp
000387 9508 ret
;**** LED数显子程序
000388 9a95 display:sbi portd,5 ;初始化8279控制字
000389 9894 cbi portd,4
00038a 9a93 sbi portd,3
00038b e970 ldi r23,$90
00038c bb78 out portb,r23
00038d 0000 nop
00038e 9a94 sbi portd,4
00038f 9895 cbi portd,5
000390 e0f8 ldi zh,high(label*2) ;0~15通道号切换
000391 2fe1 mov zl,r17
000392 9938 sbic admux,0
000393 c001 rjmp dis1
000394 c001 rjmp dis0
000395 9638 dis1: adiw zl,$08
000396 95c8 dis0: lpm
000397 ba08 out portb,r0
000398 9894 cbi portd,4
000399 0000 nop
00039a 9a94 sbi portd,4
00039b 2d07 mov r16,cnt2d
00039c 9502 swap r16
00039d d010 rcall outpd
00039e e1e0 ldi zl,$10
00039f 2d07 mov r16,cnt2d
0003a0 700f andi r16,$0f
0003a1 0fe0 add zl,r16
0003a2 95c8 lpm
0003a3 ba08 out portb,r0
0003a4 9894 cbi portd,4
0003a5 0000 nop
0003a6 9a94 sbi portd,4
0003a7 2d06 mov r16,cnt1d
0003a8 9502 swap r16
0003a9 d004 rcall outpd
0003aa 2d06 mov r16,cnt1d
0003ab d002 rcall outpd
0003ac 9a95 sbi portd,5 ;向8279传送数据结束
0003ad 9508 ret
0003ae e0e0 outpd: ldi zl,low(label*2)
0003af 700f andi r16,$0f
0003b0 0fe0 add zl,r16
0003b1 95c8 lpm
0003b2 ba08 out portb,r0
0003b3 9894 cbi portd,4
0003b4 0000 nop
0003b5 9a94 sbi portd,4
0003b6 9508 ret
;**** 延时子程序
;delay: ret
0003b7 934f delay: push r20 ;2t
0003b8 934f l0: push r20 ;2t
0003b9 934f l1: push r20 ;2t
0003ba 934f l2: push r20 ;2t
0003bb 954a l3: dec r20 ;1t
0003bc f7f1 brne l3 ;1t/2t
0003bd 914f pop r20 ;2t
0003be 954a dec r20 ;1t
0003bf f7d1 brne l2 ;1t/2t
0003c0 914f pop r20 ;2t
0003c1 954a dec r20 ;1t
0003c2 f7b1 brne l1 ;1t/2t
0003c3 914f pop r20 ;2t
0003c4 954a dec r20 ;1t
0003c5 f791 brne l0 ;1T/2T
0003c6 914f pop r20 ;2t
0003c7 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 + -