can18b20.lis
来自「基于CAN总线的 温度采集方法。选用DS18B20温度传感器。」· LIS 代码 · 共 1,548 行 · 第 1/5 页
LIS
1,548 行
015C ; {
015C .dbline 182
015C ; unsigned char bit0,cbit,r,temp,i,j,byte;
015C ; temp = 0;
015C 6627 clr R22
015E .dbline 183
015E ; for(j = 0; j < len; j++)
015E 4427 clr R20
0160 20C0 rjmp L56
0162 L53:
0162 .dbline 184
0162 ; {
0162 .dbline 185
0162 ; byte = p[j];
0162 E42F mov R30,R20
0164 FF27 clr R31
0166 E40D add R30,R4
0168 F51D adc R31,R5
016A A080 ldd R10,z+0
016C .dbline 186
016C ; for(i = 0; i < 8; i++)
016C CC24 clr R12
016E 15C0 rjmp L60
0170 L57:
0170 .dbline 187
0170 ; {
0170 .dbline 188
0170 ; cbit = temp & 0x01;
0170 862F mov R24,R22
0172 8170 andi R24,1
0174 8883 std y+0,R24
0176 .dbline 189
0176 ; bit0 = byte&0x01;
0176 8A2D mov R24,R10
0178 8170 andi R24,1
017A 882E mov R8,R24
017C .dbline 190
017C ; temp >>= 1;
017C 6695 lsr R22
017E .dbline 191
017E ; r = cbit ^ bit0;
017E E880 ldd R14,y+0
0180 E826 eor R14,R24
0182 .dbline 192
0182 ; if(r == 1)
0182 8E2D mov R24,R14
0184 8130 cpi R24,1
0186 39F4 brne L61
0188 .dbline 193
0188 ; temp ^= 0x8c;
0188 8CE8 ldi R24,140
018A 90E0 ldi R25,0
018C 262E mov R2,R22
018E 3324 clr R3
0190 2826 eor R2,R24
0192 3926 eor R3,R25
0194 622D mov R22,R2
0196 L61:
0196 .dbline 194
0196 A694 lsr R10
0198 .dbline 195
0198 L58:
0198 .dbline 186
0198 C394 inc R12
019A L60:
019A .dbline 186
019A 8C2D mov R24,R12
019C 8830 cpi R24,8
019E 40F3 brlo L57
01A0 .dbline 196
01A0 L54:
01A0 .dbline 183
01A0 4395 inc R20
01A2 L56:
01A2 .dbline 183
01A2 4615 cp R20,R6
01A4 F0F2 brlo L53
01A6 .dbline 197
01A6 ; byte >>= 1;
01A6 ; }
01A6 ; }
01A6 ; return temp;
01A6 062F mov R16,R22
01A8 .dbline -2
01A8 L52:
01A8 2196 adiw R28,1
01AA 00D0 rcall pop_gset5
01AC .dbline 0 ; func end
01AC 0895 ret
01AE .dbsym r j 20 c
01AE .dbsym r r 14 c
01AE .dbsym l cbit 0 c
01AE .dbsym r bit0 8 c
01AE .dbsym r byte 10 c
01AE .dbsym r i 12 c
01AE .dbsym r temp 22 c
01AE .dbsym r len 6 c
01AE .dbsym r p 4 pc
01AE .dbend
01AE .dbfunc e delay_us _delay_us fV
01AE ; time -> R16,R17
.even
01AE _delay_us::
01AE .dbline -1
01AE .dbline 207
01AE ; }
01AE ;
01AE ; /*===================================================================
01AE ; // 函数功能: us延时函数
01AE ; // 形参: void
01AE ; // 返回: void
01AE ; // 编写: 2004/8/25
01AE ; ===================================================================*/
01AE ; void delay_us(unsigned int time)
01AE ; {
01AE L64:
01AE .dbline 209
01AE ; do
01AE ; { //delay_1us();
01AE .dbline 210
01AE ; time--;
01AE 0150 subi R16,1
01B0 1040 sbci R17,0
01B2 .dbline 211
01B2 ; }
01B2 L65:
01B2 .dbline 212
01B2 ; while (time>1);
01B2 81E0 ldi R24,1
01B4 90E0 ldi R25,0
01B6 8017 cp R24,R16
01B8 9107 cpc R25,R17
01BA C8F3 brlo L64
01BC .dbline -2
01BC L63:
01BC .dbline 0 ; func end
01BC 0895 ret
01BE .dbsym r time 16 i
01BE .dbend
01BE .dbfunc e ds1820_ack _ds1820_ack fc
01BE ; ack -> R20
.even
01BE _ds1820_ack::
01BE 00D0 rcall push_gset1
01C0 .dbline -1
01C0 .dbline 222
01C0 ; }
01C0 ;
01C0 ; /*===================================================================
01C0 ; // 函数功能: 判断总线应答
01C0 ; // 形参: void
01C0 ; // 返回: unsigned char true为应答
01C0 ; // 编写: 2004/8/25
01C0 ; ===================================================================*/
01C0 ; unsigned char ds1820_ack(void)
01C0 ; {
01C0 .dbline 224
01C0 ; unsigned char ack;
01C0 ; DDRC |= DQ;
01C0 A59A sbi 0x14,5
01C2 .dbline 225
01C2 ; PORTC &= ~DQ;
01C2 AD98 cbi 0x15,5
01C4 .dbline 226
01C4 ; delay_us(450); // reset
01C4 02EC ldi R16,450
01C6 11E0 ldi R17,1
01C8 F2DF rcall _delay_us
01CA .dbline 227
01CA ; PORTC |= DQ;
01CA AD9A sbi 0x15,5
01CC .dbline 228
01CC ; DDRC &= ~DQ;
01CC A598 cbi 0x14,5
01CE .dbline 229
01CE ; delay_us(45);
01CE 0DE2 ldi R16,45
01D0 10E0 ldi R17,0
01D2 EDDF rcall _delay_us
01D4 .dbline 230
01D4 ; ack = DQ & PIND;
01D4 40B3 in R20,0x10
01D6 4072 andi R20,32
01D8 .dbline 231
01D8 ; delay_us(450); // host receive
01D8 02EC ldi R16,450
01DA 11E0 ldi R17,1
01DC E8DF rcall _delay_us
01DE .dbline 232
01DE ; if(ack)
01DE 4423 tst R20
01E0 11F0 breq L68
01E2 .dbline 233
01E2 ; return 1;
01E2 01E0 ldi R16,1
01E4 01C0 rjmp L67
01E6 L68:
01E6 .dbline 235
01E6 ; else
01E6 ; return 0;
01E6 0027 clr R16
01E8 .dbline -2
01E8 L67:
01E8 00D0 rcall pop_gset1
01EA .dbline 0 ; func end
01EA 0895 ret
01EC .dbsym r ack 20 c
01EC .dbend
01EC .dbfunc e read_byte _read_byte fc
01EC ; value -> R20
01EC ; i -> R22
.even
01EC _read_byte::
01EC 00D0 rcall push_gset2
01EE .dbline -1
01EE .dbline 245
01EE ; }
01EE ;
01EE ; /*===================================================================
01EE ; // 函数功能: 从 1-wire 总线上读取一个字节
01EE ; // 形参: void
01EE ; // 返回: unsigned char 读到的值
01EE ; // 编写: 2004/8/25
01EE ; ===================================================================*/
01EE ; unsigned char read_byte(void)
01EE ; {
01EE .dbline 247
01EE ; unsigned char i;
01EE ; unsigned char value = 0;
01EE 4427 clr R20
01F0 .dbline 248
01F0 ; for(i = 8; i > 0; i--)
01F0 68E0 ldi R22,8
01F2 16C0 rjmp L74
01F4 L71:
01F4 .dbline 249
01F4 ; {
01F4 .dbline 250
01F4 ; value >>= 1; // low bit first
01F4 4695 lsr R20
01F6 .dbline 251
01F6 ; DDRC |= DQ;
01F6 A59A sbi 0x14,5
01F8 .dbline 252
01F8 ; PORTC &= ~DQ; // pull DQ low to start timeslot
01F8 AD98 cbi 0x15,5
01FA .dbline 253
01FA ; delay_us(3);
01FA 03E0 ldi R16,3
01FC 10E0 ldi R17,0
01FE D7DF rcall _delay_us
0200 .dbline 254
0200 ; PORTC |= DQ;
0200 AD9A sbi 0x15,5
0202 .dbline 255
0202 ; DDRC &= ~DQ; // release bus
0202 A598 cbi 0x14,5
0204 .dbline 256
0204 ; delay_us(10);
0204 0AE0 ldi R16,10
0206 10E0 ldi R17,0
0208 D2DF rcall _delay_us
020A .dbline 257
020A ; if(DQ & PINC)
020A 9D9B sbis 0x13,5
020C 01C0 rjmp L75
020E .dbline 258
020E ; value|=0x80;
020E 4068 ori R20,128
0210 L75:
0210 .dbline 259
0210 04E6 ldi R16,100
0212 10E0 ldi R17,0
0214 CCDF rcall _delay_us
0216 .dbline 260
0216 A59A sbi 0x14,5
0218 .dbline 261
0218 05E0 ldi R16,5
021A 10E0 ldi R17,0
021C C8DF rcall _delay_us
021E .dbline 262
021E L72:
021E .dbline 248
021E 6A95 dec R22
0220 L74:
0220 .dbline 248
0220 2224 clr R2
0222 2616 cp R2,R22
0224 38F3 brlo L71
0226 .dbline 263
0226 ; delay_us(100);
0226 ; DDRC |= DQ;
0226 ; delay_us(5); // time interval
0226 ; }
0226 ; return(value);
0226 042F mov R16,R20
0228 .dbline -2
0228 L70:
0228 00D0 rcall pop_gset2
022A .dbline 0 ; func end
022A 0895 ret
022C .dbsym r value 20 c
022C .dbsym r i 22 c
022C .dbend
022C .dbfunc e write_byte _write_byte fV
022C ; i -> R20
022C ; value -> R22
.even
022C _write_byte::
022C 00D0 rcall push_gset2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?