📄 ds18b20.lis
字号:
023A ; templ=B20_readB(); //读温度低字节
023A BCDF xcall _B20_readB
023C 402F mov R20,R16
023E .dbline 102
023E ; temph=B20_readB(); //读温度高字节
023E BADF xcall _B20_readB
0240 602F mov R22,R16
0242 .dbline 103
0242 ; temp=templ+temph*256;//将温度整理成16位变量
0242 262F mov R18,R22
0244 3327 clr R19
0246 00E0 ldi R16,256
0248 11E0 ldi R17,1
024A 0E940000 xcall empy16s
024E 242E mov R2,R20
0250 3324 clr R3
0252 200E add R2,R16
0254 311E adc R3,R17
0256 A101 movw R20,R2
0258 .dbline 104
0258 ; return temp; //返回16位变量
0258 022D mov R16,R2
025A 132D mov R17,R3
025C .dbline -2
025C L52:
025C 0E940000 xcall pop_gset2
0260 .dbline 0 ; func end
0260 0895 ret
0262 .dbsym r temp 20 i
0262 .dbsym r temph 22 c
0262 .dbsym r templ 20 c
0262 .dbend
0262 .dbfunc e Num_BCD _Num_BCD fpc
0262 ; rept -> R20,R21
0262 ; chr -> y+0
0262 ; i -> R22
0262 ; num -> R10,R11
.even
0262 _Num_BCD::
0262 0E940000 xcall push_gset3
0266 5801 movw R10,R16
0268 2397 sbiw R28,3
026A .dbline -1
026A .dbline 113
026A ; }
026A ; /*******************************************
026A ; 函数名称: Num_BCD
026A ; 功 能: 将一个字节的整数转换成三位BCD码
026A ; 参 数: num--需要转换的整数
026A ; 返回值 : chr--三位BCD码数组指针
026A ; /********************************************/
026A ; uchar* Num_BCD(uint num)
026A ; {
026A .dbline 116
026A ; uchar i,chr[3];
026A ; uchar *rept;
026A ; rept=&(chr[0]); //返回指针指向BCD码数组
026A AE01 movw R20,R28
026C .dbline 117
026C ; for(i=0;i<3;i++)
026C 6627 clr R22
026E 16C0 xjmp L57
0270 L54:
0270 .dbline 118
0270 .dbline 119
0270 262E mov R2,R22
0272 3324 clr R3
0274 E2E0 ldi R30,2
0276 F0E0 ldi R31,0
0278 E219 sub R30,R2
027A F309 sbc R31,R3
027C CE01 movw R24,R28
027E E80F add R30,R24
0280 F91F adc R31,R25
0282 2AE0 ldi R18,10
0284 30E0 ldi R19,0
0286 8501 movw R16,R10
0288 0E940000 xcall mod16u
028C 0083 std z+0,R16
028E .dbline 120
028E 2AE0 ldi R18,10
0290 30E0 ldi R19,0
0292 8501 movw R16,R10
0294 0E940000 xcall div16u
0298 5801 movw R10,R16
029A .dbline 121
029A L55:
029A .dbline 117
029A 6395 inc R22
029C L57:
029C .dbline 117
029C 6330 cpi R22,3
029E 40F3 brlo L54
02A0 .dbline 122
02A0 ; {
02A0 ; chr[2-i]=num%10; //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
02A0 ; num/=10; //除以10,为取出下一位做准备
02A0 ; }
02A0 ; return rept; //返回指针
02A0 042F mov R16,R20
02A2 152F mov R17,R21
02A4 .dbline -2
02A4 L53:
02A4 2396 adiw R28,3
02A6 0E940000 xcall pop_gset3
02AA .dbline 0 ; func end
02AA 0895 ret
02AC .dbsym r rept 20 pc
02AC .dbsym l chr 0 A[3:3]c
02AC .dbsym r i 22 c
02AC .dbsym r num 10 i
02AC .dbend
02AC .dbfunc e main _main fV
02AC ; t -> R22,R23
02AC ; temppt -> R10,R11
02AC ; temp -> y+0
02AC ; i -> R20
.even
02AC _main::
02AC 2797 sbiw R28,7
02AE .dbline -1
02AE .dbline 131
02AE ; }
02AE ; /*******************************************
02AE ; 函数名称: main
02AE ; 功 能: 完成温度的读取与显示
02AE ; 参 数: 无
02AE ; 返回值 : 无
02AE ; /********************************************/
02AE ; void main(void)
02AE ; {
02AE .dbline 135
02AE ; uint t;
02AE ; uchar *temppt;
02AE ; uchar i,temp[3];
02AE ; Board_init( ); //初始化开发板
02AE D6DE xcall _Board_init
02B0 8DC0 xjmp L60
02B2 L59:
02B2 .dbline 137
02B2 ; while(1)
02B2 ; {
02B2 .dbline 138
02B2 ; t=Read_temp(); //读取温度值
02B2 B7DF xcall _Read_temp
02B4 B801 movw R22,R16
02B6 .dbline 139
02B6 ; t*=0.625; //转换成实际温度的10倍
02B6 00E0 ldi R16,<L64
02B8 10E0 ldi R17,>L64
02BA 0E940000 xcall lpm32
02BE 3A93 st -y,R19
02C0 2A93 st -y,R18
02C2 1A93 st -y,R17
02C4 0A93 st -y,R16
02C6 00E0 ldi R16,<L65
02C8 10E0 ldi R17,>L65
02CA 0E940000 xcall lpm32
02CE 3A93 st -y,R19
02D0 2A93 st -y,R18
02D2 1A93 st -y,R17
02D4 0A93 st -y,R16
02D6 8B01 movw R16,R22
02D8 1695 lsr R17
02DA 0795 ror R16
02DC 0E940000 xcall int2fp
02E0 3A93 st -y,R19
02E2 2A93 st -y,R18
02E4 1A93 st -y,R17
02E6 0A93 st -y,R16
02E8 0E940000 xcall empy32fs
02EC 8B01 movw R16,R22
02EE 0170 andi R16,1
02F0 1070 andi R17,0
02F2 0E940000 xcall int2fp
02F6 3A93 st -y,R19
02F8 2A93 st -y,R18
02FA 1A93 st -y,R17
02FC 0A93 st -y,R16
02FE 0E940000 xcall add32fs
0302 0E940000 xcall empy32f
0306 FE01 movw R30,R28
0308 0383 std z+3,R16
030A 1483 std z+4,R17
030C 2583 std z+5,R18
030E 3683 std z+6,R19
0310 2380 ldd R2,z+3
0312 3480 ldd R3,z+4
0314 4580 ldd R4,z+5
0316 5680 ldd R5,z+6
0318 5A92 st -y,R5
031A 4A92 st -y,R4
031C 3A92 st -y,R3
031E 2A92 st -y,R2
0320 00E0 ldi R16,<L66
0322 10E0 ldi R17,>L66
0324 0E940000 xcall lpm32
0328 3A93 st -y,R19
032A 2A93 st -y,R18
032C 1A93 st -y,R17
032E 0A93 st -y,R16
0330 0E940000 xcall cmp32f
0334 CCF0 brlt L62
0336 FE01 movw R30,R28
0338 2380 ldd R2,z+3
033A 3480 ldd R3,z+4
033C 4580 ldd R4,z+5
033E 5680 ldd R5,z+6
0340 5A92 st -y,R5
0342 4A92 st -y,R4
0344 3A92 st -y,R3
0346 2A92 st -y,R2
0348 00E0 ldi R16,<L66
034A 10E0 ldi R17,>L66
034C 0E940000 xcall lpm32
0350 3A93 st -y,R19
0352 2A93 st -y,R18
0354 1A93 st -y,R17
0356 0A93 st -y,R16
0358 0E940000 xcall sub32f
035C 0E940000 xcall fp2int
0360 A801 movw R20,R16
0362 4050 subi R20,0 ; offset = 32768
0364 5048 sbci R21,128
0366 08C0 xjmp L63
0368 L62:
0368 FE01 movw R30,R28
036A 0381 ldd R16,z+3
036C 1481 ldd R17,z+4
036E 2581 ldd R18,z+5
0370 3681 ldd R19,z+6
0372 0E940000 xcall fp2int
0376 A801 movw R20,R16
0378 L63:
0378 BA01 movw R22,R20
037A .dbline 140
037A ; temppt=Num_BCD(t);//将实际温度的10倍转换成BCD码
037A 8B01 movw R16,R22
037C 72DF xcall _Num_BCD
037E 5801 movw R10,R16
0380 .dbline 141
0380 ; for(i=0;i<3;i++) //将转换后的BCD码存入显示数组
0380 4427 clr R20
0382 0CC0 xjmp L70
0384 L67:
0384 .dbline 142
0384 .dbline 143
0384 E42F mov R30,R20
0386 FF27 clr R31
0388 EA0D add R30,R10
038A FB1D adc R31,R11
038C 2080 ldd R2,z+0
038E CE01 movw R24,R28
0390 E42F mov R30,R20
0392 FF27 clr R31
0394 E80F add R30,R24
0396 F91F adc R31,R25
0398 2082 std z+0,R2
039A .dbline 144
039A L68:
039A .dbline 141
039A 4395 inc R20
039C L70:
039C .dbline 141
039C 4330 cpi R20,3
039E 90F3 brlo L67
03A0 .dbline 145
03A0 ; {
03A0 ; temp[i]=*(temppt+i);
03A0 ; }
03A0 ; for(i=0;i<3;i++) //显示温度
03A0 4427 clr R20
03A2 12C0 xjmp L74
03A4 L71:
03A4 .dbline 146
03A4 ; {
03A4 .dbline 147
03A4 ; if(i==1)
03A4 4130 cpi R20,1
03A6 19F4 brne L75
03A8 .dbline 148
03A8 ; {
03A8 .dbline 149
03A8 ; temp[1]+=16; //如果是各位,则加上小数点(数码管的译码数组有所改变,读者可以看10_DS18B20文件夹下的SMG.C文件)
03A8 8981 ldd R24,y+1
03AA 805F subi R24,240 ; addi 16
03AC 8983 std y+1,R24
03AE .dbline 150
03AE ; }
03AE L75:
03AE .dbline 151
03AE 242F mov R18,R20
03B0 2F5F subi R18,255 ; addi 1
03B2 CE01 movw R24,R28
03B4 E42F mov R30,R20
03B6 FF27 clr R31
03B8 E80F add R30,R24
03BA F91F adc R31,R25
03BC 0081 ldd R16,z+0
03BE 74DE xcall _One_smg_display
03C0 .dbline 152
03C0 05E0 ldi R16,5
03C2 10E0 ldi R17,0
03C4 35DE xcall _Delayms
03C6 .dbline 153
03C6 L72:
03C6 .dbline 145
03C6 4395 inc R20
03C8 L74:
03C8 .dbline 145
03C8 4330 cpi R20,3
03CA 60F3 brlo L71
03CC .dbline 154
03CC L60:
03CC .dbline 136
03CC 72CF xjmp L59
03CE X0:
03CE .dbline -2
03CE .dbline 155
03CE ; One_smg_display(temp[i],i+1);
03CE ; Delayms(5);
03CE ; }
03CE ; }
03CE ; }
03CE L58:
03CE 2796 adiw R28,7
03D0 .dbline 0 ; func end
03D0 0895 ret
03D2 .dbsym r t 22 i
03D2 .dbsym r temppt 10 pc
03D2 .dbsym l temp 0 A[3:3]c
03D2 .dbsym r i 20 c
03D2 .dbend
.area lit(rom, con, rel)
0034 L66:
0034 00000047 .word 0x0,0x4700
0038 L65:
0038 00000040 .word 0x0,0x4000
003C L64:
003C 0000203F .word 0x0,0x3f20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -