⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus16.lis

📁 一个16位单片机modbus通信例程
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0264                   .dbsym r addr 20 c
 0264                   .dbsym r crcData 20 i
 0264                   .dbsym r byteCount 10 c
 0264                   .dbsym r tempAddr 12 c
 0264                   .dbsym l tempData 0 i
 0264                   .dbsym r i 22 i
 0264                   .dbend
 0264                   .dbfunc e forceSingleCoil _forceSingleCoil fV
 0264           ;       tempData -> R22,R23
 0264           ;       tempAddr -> R20
 0264           ;           addr -> R22
 0264           ;          onOff -> R10
 0264           ;              i -> R20
                        .even
 0264           _forceSingleCoil::
 0264 0E940000          xcall push_gset3
 0268                   .dbline -1
 0268                   .dbline 207
 0268           ; 
 0268           ; 
 0268           ; //强制单个线圈
 0268           ; void forceSingleCoil(void)
 0268           ; {
 0268                   .dbline 216
 0268           ;       uint8 addr;
 0268           ;       uint8 tempAddr;
 0268           ;       uint16 tempData;
 0268           ;       uint8  onOff;
 0268           ;       uint8 i;
 0268           ;       
 0268           ;       //addr = (receBuf[2]<<8) + receBuf[3];  
 0268           ;       //tempAddr = addr & 0xfff;
 0268           ;       addr = receBuf[3];
 0268 60910600          lds R22,_receBuf+3
 026C                   .dbline 217
 026C           ;       tempAddr = addr;
 026C 462F              mov R20,R22
 026E                   .dbline 220
 026E           ; 
 026E           ;       //onOff = (receBuf[4]<<8) + receBuf[5]; 
 026E           ;       onOff = receBuf[4];
 026E A0900700          lds R10,_receBuf+4
 0272                   .dbline 223
 0272           ;       
 0272           ;       //if(onOff == 0xff00)
 0272           ;       if(onOff == 0xff)
 0272 8A2D              mov R24,R10
 0274 8F3F              cpi R24,255
 0276 19F4              brne L39
 0278                   .dbline 224
 0278           ;       {       //设为ON
 0278                   .dbline 225
 0278           ;               tempData = 1;
 0278 61E0              ldi R22,1
 027A 70E0              ldi R23,0
 027C                   .dbline 226
 027C           ;       } 
 027C 04C0              xjmp L40
 027E           L39:
 027E                   .dbline 228
 027E           ;       //else if(onOff == 0x0000)
 027E           ;       else if(onOff == 0x00)
 027E AA20              tst R10
 0280 11F4              brne L41
 0282                   .dbline 229
 0282           ;       {       //设为OFF
 0282                   .dbline 230
 0282           ;               tempData = 0;
 0282 6627              clr R22
 0284 7727              clr R23
 0286                   .dbline 231
 0286           ;       }
 0286           L41:
 0286           L40:
 0286                   .dbline 233
 0286           ; 
 0286           ;       setCoilVal(tempAddr,tempData);  
 0286 9B01              movw R18,R22
 0288 042F              mov R16,R20
 028A 1127              clr R17
 028C 7FD1              xcall _setCoilVal
 028E                   .dbline 235
 028E           ;       
 028E           ;       for(i=0;i<receCount;i++)
 028E 4427              clr R20
 0290 0FC0              xjmp L46
 0292           L43:
 0292                   .dbline 236
 0292                   .dbline 237
 0292 80E0              ldi R24,<_receBuf
 0294 90E0              ldi R25,>_receBuf
 0296 E42F              mov R30,R20
 0298 FF27              clr R31
 029A E80F              add R30,R24
 029C F91F              adc R31,R25
 029E 2080              ldd R2,z+0
 02A0 80E0              ldi R24,<_sendBuf
 02A2 90E0              ldi R25,>_sendBuf
 02A4 E42F              mov R30,R20
 02A6 FF27              clr R31
 02A8 E80F              add R30,R24
 02AA F91F              adc R31,R25
 02AC 2082              std z+0,R2
 02AE                   .dbline 238
 02AE           L44:
 02AE                   .dbline 235
 02AE 4395              inc R20
 02B0           L46:
 02B0                   .dbline 235
 02B0 20904400          lds R2,_receCount
 02B4 4215              cp R20,R2
 02B6 68F3              brlo L43
 02B8                   .dbline 239
 02B8           ;       {
 02B8           ;               sendBuf[i] = receBuf[i];
 02B8           ;       }
 02B8           ;       sendCount = receCount;
 02B8 20924500          sts _sendCount,R2
 02BC                   .dbline 240
 02BC           ;       beginSend();    
 02BC E5DE              xcall _beginSend
 02BE                   .dbline -2
 02BE                   .dbline 241
 02BE           ; }//void forceSingleCoil(void)
 02BE           L36:
 02BE 0E940000          xcall pop_gset3
 02C2                   .dbline 0 ; func end
 02C2 0895              ret
 02C4                   .dbsym r tempData 22 i
 02C4                   .dbsym r tempAddr 20 c
 02C4                   .dbsym r addr 22 c
 02C4                   .dbsym r onOff 10 c
 02C4                   .dbsym r i 20 c
 02C4                   .dbend
 02C4                   .dbfunc e presetMultipleRegisters _presetMultipleRegisters fV
 02C4           ;          finsh -> <dead>
 02C4           ;      byteCount -> R22
 02C4           ;        crcData -> R22,R23
 02C4           ;           addr -> y+0
 02C4           ;       setCount -> R20
 02C4           ;       tempData -> R14,R15
 02C4           ;       tempAddr -> R10
 02C4           ;              i -> R12
                        .even
 02C4           _presetMultipleRegisters::
 02C4 0E940000          xcall push_gset5
 02C8 2197              sbiw R28,1
 02CA                   .dbline -1
 02CA                   .dbline 246
 02CA           ; 
 02CA           ; 
 02CA           ; //设置多个寄存器
 02CA           ; void presetMultipleRegisters(void)
 02CA           ; {
 02CA                   .dbline 258
 02CA           ;       uint8 addr;
 02CA           ;       uint8 tempAddr;
 02CA           ;       uint8 byteCount;
 02CA           ;       uint8 setCount;
 02CA           ;       uint16 crcData;
 02CA           ;       uint16 tempData;
 02CA           ;       uint8  finsh;   //为1时完成 为0时出错
 02CA           ;       uint8 i;
 02CA           ;       
 02CA           ;       //addr = (receBuf[2]<<8) + receBuf[3];
 02CA           ;       //tempAddr = addr & 0xfff;
 02CA           ;       addr = receBuf[3];
 02CA 20900600          lds R2,_receBuf+3
 02CE 2882              std y+0,R2
 02D0                   .dbline 259
 02D0           ;       tempAddr = addr;
 02D0 A22C              mov R10,R2
 02D2                   .dbline 262
 02D2           ; 
 02D2           ;       //setCount = (receBuf[4]<<8) + receBuf[5];
 02D2           ;       setCount = receBuf[5];
 02D2 40910800          lds R20,_receBuf+5
 02D6                   .dbline 263
 02D6           ;       byteCount = receBuf[6]; 
 02D6 60910900          lds R22,_receBuf+6
 02DA                   .dbline 265
 02DA           ;       
 02DA           ;       for(i=0;i<setCount;i++,tempAddr++)
 02DA CC24              clr R12
 02DC 16C0              xjmp L54
 02DE           L51:
 02DE                   .dbline 266
 02DE                   .dbline 267
 02DE 82E0              ldi R24,2
 02E0 8C9D              mul R24,R12
 02E2 80E0              ldi R24,<_receBuf+8
 02E4 90E0              ldi R25,>_receBuf+8
 02E6 F001              movw R30,R0
 02E8 E80F              add R30,R24
 02EA F91F              adc R31,R25
 02EC 2080              ldd R2,z+0
 02EE 80E0              ldi R24,<_receBuf+7
 02F0 90E0              ldi R25,>_receBuf+7
 02F2 F001              movw R30,R0
 02F4 E80F              add R30,R24
 02F6 F91F              adc R31,R25
 02F8 3080              ldd R3,z+0
 02FA E22C              mov R14,R2
 02FC F32C              mov R15,R3
 02FE                   .dbline 269
 02FE 9701              movw R18,R14
 0300 0A2D              mov R16,R10
 0302 1127              clr R17
 0304 8ED1              xcall _setRegisterVal
 0306                   .dbline 270
 0306           L52:
 0306                   .dbline 265
 0306 C394              inc R12
 0308 A394              inc R10
 030A           L54:
 030A                   .dbline 265
 030A C416              cp R12,R20
 030C 40F3              brlo L51
 030E                   .dbline 272
 030E           ;       {
 030E           ;               tempData = (receBuf[i*2+7]<<8) + receBuf[i*2+8];
 030E           ;       
 030E           ;               setRegisterVal(tempAddr,tempData);                      
 030E           ;       }
 030E           ;       
 030E           ;       sendBuf[0] = localAddr;
 030E 20900000          lds R2,_localAddr
 0312 20922300          sts _sendBuf,R2
 0316                   .dbline 273
 0316           ;       sendBuf[1] = 16;
 0316 80E1              ldi R24,16
 0318 80932400          sts _sendBuf+1,R24
 031C                   .dbline 274
 031C           ;       sendBuf[2] = addr >> 8;
 031C 2880              ldd R2,y+0
 031E 3324              clr R3
 0320 232C              mov R2,R3
 0322 3324              clr R3
 0324 27FC              sbrc R2,7
 0326 3094              com R3
 0328 20922500          sts _sendBuf+2,R2
 032C                   .dbline 275
 032C           ;       sendBuf[3] = addr & 0xff;
 032C 8881              ldd R24,y+0
 032E 8F7F              andi R24,255
 0330 80932600          sts _sendBuf+3,R24
 0334                   .dbline 276
 0334           ;       sendBuf[4] = setCount >> 8;
 0334 242E              mov R2,R20
 0336 3324              clr R3
 0338 232C              mov R2,R3
 033A 3324              clr R3
 033C 27FC              sbrc R2,7
 033E 3094              com R3
 0340 20922700          sts _sendBuf+4,R2
 0344                   .dbline 277
 0344           ;       sendBuf[5] = setCount & 0xff;
 0344 842F              mov R24,R20
 0346 8F7F              andi R24,255
 0348 80932800          sts _sendBuf+5,R24
 034C                   .dbline 278
 034C           ;       crcData = crc16(sendBuf,6);
 034C 26E0              ldi R18,6
 034E 30E0              ldi R19,0
 0350 00E0              ldi R16,<_sendBuf
 0352 10E0              ldi R17,>_sendBuf
 0354 55DE              xcall _crc16
 0356 B801              movw R22,R16
 0358                   .dbline 279
 0358           ;       sendBuf[6] = crcData >> 8;
 0358 1B01              movw R2,R22
 035A 232C              mov R2,R3
 035C 3324              clr R3
 035E 20922900          sts _sendBuf+6,R2
 0362                   .dbline 280
 0362           ;       sendBuf[7] = crcData & 0xff;
 0362 CB01              movw R24,R22
 0364 9070              andi R25,0
 0366 80932A00          sts _sendBuf+7,R24
 036A                   .dbline 281
 036A           ;       sendCount = 8;
 036A 88E0              ldi R24,8
 036C 80934500          sts _sendCount,R24
 0370                   .dbline 282
 0370           ;       beginSend();    
 0370 8BDE              xcall _beginSend
 0372                   .dbline -2
 0372                   .dbline 283
 0372           ; }//void presetMultipleRegisters(void)
 0372           L47:
 0372 2196              adiw R28,1
 0374 0E940000          xcall pop_gset5
 0378                   .dbline 0 ; func end
 0378 0895              ret
 037A                   .dbsym l finsh 1 c
 037A                   .dbsym r byteCount 22 c
 037A                   .dbsym r crcData 22 i
 037A                   .dbsym l addr 0 c
 037A                   .dbsym r setCount 20 c
 037A                   .dbsym r tempData 14 i
 037A                   .dbsym r tempAddr 10 c
 037A                   .dbsym r i 12 c
 037A                   .dbend
 037A                   .dbfunc e checkComm0Modbus _checkComm0Modbus fV
 037A           ;        crcData -> R20,R21
 037A           ;       tempData -> R22,R23
                        .even
 037A           _checkComm0Modbus::
 037A 0E940000          xcall push_gset2
 037E                   .dbline -1
 037E                   .dbline 289

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -