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 + -
显示快捷键?