📄 ds18b20.lis
字号:
0238 84E0 ldi R24,4
023A 80938100 sts 129,R24
023E .dbline 153
023E ; /*通信口初始化*/
023E ; UartInit();
023E .dbline -2
023E L29:
023E .dbline 0 ; func end
023E CFC0 rjmp _UartInit
0240 .dbend
0240 .dbfunc e convert _convert fV
.even
0240 _convert::
0240 .dbline -1
0240 .dbline 157
0240 ; }
0240 ; /*数据转换函数*/
0240 ; void convert(void)
0240 ; {timeb1=time1/100;
0240 .dbline 157
0240 14E6 ldi R17,100
0242 00910C00 lds R16,_time1
0246 00D0 rcall div8u
0248 00930A00 sts _timeb1,R16
024C .dbline 158
024C ; timeb2=time1%100/10;
024C 14E6 ldi R17,100
024E 00910C00 lds R16,_time1
0252 00D0 rcall mod8u
0254 1AE0 ldi R17,10
0256 00D0 rcall div8u
0258 00930900 sts _timeb2,R16
025C .dbline 159
025C ; timeb3=time1%10;
025C 1AE0 ldi R17,10
025E 00910C00 lds R16,_time1
0262 00D0 rcall mod8u
0264 00930800 sts _timeb3,R16
0268 .dbline 160
0268 ; timeb4=time2/100;
0268 14E6 ldi R17,100
026A 00910B00 lds R16,_time2
026E 00D0 rcall div8u
0270 00930700 sts _timeb4,R16
0274 .dbline 161
0274 ; timeb5=time2%100/10;
0274 14E6 ldi R17,100
0276 00910B00 lds R16,_time2
027A 00D0 rcall mod8u
027C 1AE0 ldi R17,10
027E 00D0 rcall div8u
0280 00930600 sts _timeb5,R16
0284 .dbline 162
0284 ; timeb6=time2%10;
0284 1AE0 ldi R17,10
0286 00910B00 lds R16,_time2
028A 00D0 rcall mod8u
028C 00930500 sts _timeb6,R16
0290 .dbline -2
0290 L30:
0290 .dbline 0 ; func end
0290 0895 ret
0292 .dbend
0292 .dbfunc e Init_1wire _Init_1wire fV
.even
0292 _Init_1wire::
0292 .dbline -1
0292 .dbline 167
0292 ; }
0292 ; /*****************单总线时序**************/
0292 ; /*初始化*/
0292 ; void Init_1wire(void)
0292 ; {flag = SREG; /*中断保护*/
0292 .dbline 167
0292 2FB6 in R2,0x3f
0294 20920D00 sts _flag,R2
0298 .dbline 168
0298 ; CLI();
0298 F894 cli
029A .dbline 170
029A ; /*关中断*/
029A ; DRC(1); //Out
029A 389A sbi 0x7,0
029C .dbline 171
029C ; DQ(1);
029C 409A sbi 0x8,0
029E .dbline 172
029E ; NOP(); //DQ拉低480-960US,接着将数据线拉高15-60US
029E 0000 nop
02A0 .dbline 173
02A0 ; DQ(0);
02A0 88B1 in R24,0x8
02A2 8E7F andi R24,254
02A4 88B9 out 0x8,R24
02A6 .dbline 174
02A6 ; delay_10us(56);
02A6 08E3 ldi R16,56
02A8 5BD0 rcall _delay_10us
02AA .dbline 175
02AA ; DQ(1);
02AA 409A sbi 0x8,0
02AC .dbline 176
02AC ; DRC(0); //In 释放总线 此时上拉电阻使能
02AC 87B1 in R24,0x7
02AE 8E7F andi R24,254
02B0 87B9 out 0x7,R24
02B2 .dbline 177
02B2 ; delay_10us(7);
02B2 07E0 ldi R16,7
02B4 55D0 rcall _delay_10us
02B6 L32:
02B6 .dbline 178
02B6 ; while(PINC & 0x01);
02B6 L33:
02B6 .dbline 178
02B6 3099 sbic 0x6,0
02B8 FECF rjmp L32
02BA X16:
02BA .dbline 179
02BA ; delay_10us(50); //presence pulse 60-240us 480us min
02BA 02E3 ldi R16,50
02BC 51D0 rcall _delay_10us
02BE .dbline 181
02BE ;
02BE ; if (flag & 0x80)
02BE 20900D00 lds R2,_flag
02C2 27FE sbrs R2,7
02C4 01C0 rjmp L35
02C6 X17:
02C6 .dbline 182
02C6 ; {SEI(); /*恢复中断状态*/
02C6 .dbline 182
02C6 7894 sei
02C8 .dbline 183
02C8 ; }
02C8 L35:
02C8 .dbline -2
02C8 L31:
02C8 .dbline 0 ; func end
02C8 0895 ret
02CA .dbend
02CA .dbfunc e WriteByte_1wire _WriteByte_1wire fV
02CA ; temp -> R10
02CA ; i -> R20
02CA ; data -> R12
.even
02CA _WriteByte_1wire::
02CA 00D0 rcall push_xgset303C
02CC C02E mov R12,R16
02CE .dbline -1
02CE .dbline 187
02CE ; }
02CE ; /*写字节*/
02CE ; void WriteByte_1wire(uchar data)
02CE ; {uchar i,temp;
02CE .dbline 188
02CE ; temp=data;
02CE AC2C mov R10,R12
02D0 .dbline 190
02D0 ;
02D0 ; flag = SREG; /*中断保护*/
02D0 2FB6 in R2,0x3f
02D2 20920D00 sts _flag,R2
02D6 .dbline 191
02D6 ; CLI();
02D6 F894 cli
02D8 .dbline 193
02D8 ;
02D8 ; DRC(1);
02D8 389A sbi 0x7,0
02DA .dbline 194
02DA ; for(i=0;i<8;i++)
02DA 4427 clr R20
02DC 0EC0 rjmp L41
02DE L38:
02DE .dbline 195
02DE ; {DQ(1);
02DE .dbline 195
02DE 409A sbi 0x8,0
02E0 .dbline 196
02E0 ; NOP();
02E0 0000 nop
02E2 .dbline 197
02E2 ; DQ(0); //写时间隙开始
02E2 88B1 in R24,0x8
02E4 8E7F andi R24,254
02E6 88B9 out 0x8,R24
02E8 .dbline 198
02E8 ; delay_10us(1);
02E8 01E0 ldi R16,1
02EA 3AD0 rcall _delay_10us
02EC .dbline 199
02EC ; if(temp&0x01)DQ(1);
02EC A0FE sbrs R10,0
02EE 01C0 rjmp L42
02F0 X18:
02F0 .dbline 199
02F0 409A sbi 0x8,0
02F2 L42:
02F2 .dbline 201
02F2 ; //else DQ(0);
02F2 ; temp>>=1; //LSB First
02F2 A694 lsr R10
02F4 .dbline 202
02F4 ; delay_10us(7);
02F4 07E0 ldi R16,7
02F6 34D0 rcall _delay_10us
02F8 .dbline 203
02F8 ; }
02F8 L39:
02F8 .dbline 194
02F8 4395 inc R20
02FA L41:
02FA .dbline 194
02FA 4830 cpi R20,8
02FC 80F3 brlo L38
02FE X19:
02FE .dbline 204
02FE ; DQ(1);
02FE 409A sbi 0x8,0
0300 .dbline 206
0300 ;
0300 ; if (flag & 0x80)
0300 20900D00 lds R2,_flag
0304 27FE sbrs R2,7
0306 01C0 rjmp L44
0308 X20:
0308 .dbline 207
0308 ; {SEI(); /*恢复中断状态*/
0308 .dbline 207
0308 7894 sei
030A .dbline 208
030A ; }
030A L44:
030A .dbline -2
030A L37:
030A .dbline 0 ; func end
030A 00C0 rjmp pop_xgset303C
030C .dbsym r temp 10 c
030C .dbsym r i 20 c
030C .dbsym r data 12 c
030C .dbend
030C .dbfunc e ReadByte_1wire _ReadByte_1wire fc
030C ; data -> R20
030C ; i -> R22
.even
030C _ReadByte_1wire::
030C 4A93 st -y,R20
030E 6A93 st -y,R22
0310 .dbline -1
0310 .dbline 212
0310 ; }
0310 ; /*读字节*/
0310 ; uchar ReadByte_1wire(void)
0310 ; {uchar i,data=0;
0310 .dbline 212
0310 4427 clr R20
0312 .dbline 214
0312 ;
0312 ; flag = SREG; /*中断保护*/
0312 2FB6 in R2,0x3f
0314 20920D00 sts _flag,R2
0318 .dbline 215
0318 ; CLI();
0318 F894 cli
031A .dbline 217
031A ;
031A ; for(i=0;i<8;i++)
031A 6627 clr R22
031C 14C0 rjmp L50
031E L47:
031E .dbline 218
031E ; {data>>=1; //处理方法:先右移 后将最高位与 0x80相或 !!!
031E .dbline 218
031E 4695 lsr R20
0320 .dbline 219
0320 ; DRC(1);
0320 389A sbi 0x7,0
0322 .dbline 220
0322 ; DQ(1);
0322 409A sbi 0x8,0
0324 .dbline 221
0324 ; NOP();
0324 0000 nop
0326 .dbline 222
0326 ; DQ(0);
0326 88B1 in R24,0x8
0328 8E7F andi R24,254
032A 88B9 out 0x8,R24
032C .dbline 223
032C ; delay_1us(); //delay 3us
032C 28D0 rcall _delay_1us
032E .dbline 224
032E ; delay_1us();
032E 27D0 rcall _delay_1us
0330 .dbline 226
0330 ; //DQ(1);
0330 ; DRC(0);
0330 87B1 in R24,0x7
0332 8E7F andi R24,254
0334 87B9 out 0x7,R24
0336 .dbline 227
0336 ; delay_10us(1);
0336 01E0 ldi R16,1
0338 13D0 rcall _delay_10us
033A .dbline 228
033A ; if(PINC&0x01)data|=0x80;
033A 309B sbis 0x6,0
033C 01C0 rjmp L51
033E X21:
033E .dbline 228
033E 4068 ori R20,128
0340 L51:
0340 .dbline 229
0340 ; delay_10us(6);
0340 06E0 ldi R16,6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -