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

📄 rd_useserialframe_proc.s

📁 LCD1602键盘显示模块实例
💻 S
📖 第 1 页 / 共 2 页
字号:
	clr R3
	movw R30,R22
	ldd R4,z+8
	ldd R5,z+9
	cp R4,R2
	cpc R5,R3
	brsh L21
X8:
	.dbline 210
;         {
	.dbline 211
;             pSFP->cXORCheck ^= cTempData;
	movw R24,R20
	adiw R24,35
	ldd R2,y+1
	movw R30,R24
	ldd R3,z+0
	eor R3,R2
	std z+0,R3
	.dbline 212
;             ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);     //将该信息添加到缓冲区
	mov R18,R2
	movw R16,R22
	movw R24,R22
	adiw R24,10
	movw R10,R24
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 214
;             
;         }
L21:
	.dbline 216
;         
;         if ((pQueue->nCount) == ((pSFP->cFrameSize) - 1))
	movw R30,R20
	ldd R24,z+36
	subi R24,1
	mov R2,R24
	clr R3
	movw R30,R22
	ldd R4,z+8
	ldd R5,z+9
	cp R4,R2
	cpc R5,R3
	brne L23
X9:
	.dbline 217
;         {
	.dbline 218
;             if (pSFP->cXORCheck)
	movw R30,R20
	ldd R2,z+35
	tst R2
	brne X17
	xjmp L4
X17:
X10:
	.dbline 219
;             {
	.dbline 222
;                 //XOR校验错误
;                 //错误的数据帧长度
;                 ADT_QUEUE_LET_EMPTY((*pQueue))              //清空队列
	.dbline 222
	clr R2
	movw R30,R22
	std z+5,R3
	std z+4,R2
	.dbline 222
	std z+7,R3
	std z+6,R2
	.dbline 222
	std z+9,R3
	std z+8,R2
	.dbline 222
	.dbline 224
;                 
;                 SFP_STOP_ALL_ACTION
	std y+0,R2
	.dbline 226
;                 
;                 pSFP->cActionFlag = cTempActionFlag;
	movw R30,R20
	std z+34,R2
	.dbline 228
;                 
;                 return ;
	xjmp L4
L23:
	.dbline 235
;             }
;             else
;             {
;                 //ReceiveData = cTempData;
;             }
;         }
;         else if ((pQueue->nCount) == (pSFP->cFrameSize))
	movw R30,R20
	ldd R2,z+36
	clr R3
	movw R30,R22
	ldd R4,z+8
	ldd R5,z+9
	cp R4,R2
	cpc R5,R3
	brne L4
X11:
	.dbline 236
;         {
	.dbline 238
;             //所有的数据都添加完成
;             if (cTempData == pSFP->cEndByte)
	movw R30,R20
	ldd R2,z+25
	ldd R3,y+1
	cp R3,R2
	brne L29
X12:
	.dbline 239
;             {
	.dbline 241
;                 //获得了所有的数据,并且数据帧正确
;                 SFP_Check_Frames(pSFP);                     //进行数据帧检测
	movw R16,R30
	xcall _SFP_Check_Frames
	.dbline 242
;             }                
L29:
	.dbline 244
;             
;             ADT_QUEUE_LET_EMPTY((*pQueue))                  //清空队列
	.dbline 244
	clr R2
	clr R3
	movw R30,R22
	std z+5,R3
	std z+4,R2
	.dbline 244
	std z+7,R3
	std z+6,R2
	.dbline 244
	std z+9,R3
	std z+8,R2
	.dbline 244
	.dbline 246
;             
;             SFP_STOP_ALL_ACTION
	std y+0,R2
	.dbline 247
;             pSFP->cActionFlag = cTempActionFlag;
	movw R30,R20
	std z+34,R2
	.dbline 249
;             
;             return ;
	.dbline 254
;         }
;         
;         
;         
;         return ;
L19:
	.dbline -2
L4:
	.dbline 0 ; func end
	adiw R28,2
	xjmp pop_xgsetF00C
	.dbsym l cTempData 1 c
	.dbsym r pQueue 22 pS[AbstructDataTypeQueue]
	.dbsym l cTempActionFlag 0 c
	.dbsym r pSFP 20 pS[SerialFrameProcess]
	.dbend
	.dbfunc s SFP_Check_Frames _SFP_Check_Frames fV
;       pMsgItem -> R22,R23
;         pQueue -> R10,R11
;              n -> y+0
;           pSFP -> R20,R21
	.even
_SFP_Check_Frames:
	xcall push_xgsetF03C
	movw R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 266
;     }
; 
; }
; 
; /***********************************************************
; *   函数说明:数据帧提取检测函数                           *
; *   输入:    串行数据帧检测结构指针                       *
; *   输出:    无                                           *
; *   调用函数:无                                           *
; ***********************************************************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
; {
	.dbline 267
;     uint8 n = 0;
	clr R2
	std y+0,R2
	.dbline 268
;     MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
	movw R22,R20
	subi R22,236  ; offset = 20
	sbci R23,255
	.dbline 269
;     ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
	movw R10,R20
	.dbline 272
;     
;     //将头部去除
;     ADT_GET_DATA_FROM_QUEUE((*pQueue),n);          
	movw R18,R28
	movw R16,R10
	movw R24,R10
	adiw R24,12
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 275
;     
;     //获取消息长度
;     if (!(pSFP->cFixLength))
	movw R30,R20
	ldd R2,z+26
	tst R2
	brne L32
X18:
	.dbline 276
;     {
	.dbline 277
;         ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cDataLength));
	movw R18,R22
	subi R18,255  ; offset = 1
	sbci R19,255
	movw R16,R30
	ldd R26,z+12
	ldd R27,z+13
	movw R30,R26
	xcall xicallx
	.dbline 279
;     
;         pMsgItem->cDataLength -= 5;
	movw R24,R22
	adiw R24,1
	movw R12,R24
	movw R30,R24
	ldd R24,z+0
	subi R24,5
	std z+0,R24
	.dbline 280
;     }
	xjmp L33
L32:
	.dbline 282
;     else
;     {
	.dbline 283
;         pMsgItem->cDataLength = pSFP->cFixLength - 4;
	movw R30,R20
	ldd R24,z+26
	subi R24,4
	movw R30,R22
	std z+1,R24
	.dbline 284
;     }
L33:
	.dbline 287
;     
;     //获取指令字
;     ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cCMD));   
	movw R18,R22
	movw R16,R10
	movw R24,R10
	adiw R24,12
	movw R12,R24
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 289
;     
;     for (n = 0;n < (pMsgItem->cDataLength);n++)
	clr R2
	std y+0,R2
	xjmp L37
L34:
	.dbline 290
;     {
	.dbline 292
;         //依次获取所有数据
;         ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
	movw R30,R22
	ldd R2,z+2
	ldd R3,z+3
	ldd R18,y+0
	clr R19
	add R18,R2
	adc R19,R3
	movw R16,R10
	movw R24,R10
	adiw R24,12
	movw R12,R24
	movw R30,R24
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 293
;     }
L35:
	.dbline 289
	ldd R24,y+0
	subi R24,255    ; addi 1
	std y+0,R24
L37:
	.dbline 289
	movw R30,R22
	ldd R2,z+1
	ldd R3,y+0
	cp R3,R2
	brlo L34
X19:
	.dbline 295
;     
;     if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
	movw R18,R30
	movw R30,R20
	ldd R16,z+18
	ldd R17,z+19
	xcall _MsgMapProcess
	mov R10,R16
	tst R16
	brne L38
X20:
	.dbline 296
;     {
	.dbline 299
;         //信息未被正确处理
;         //有待添加代码
;     }                       
L38:
	.dbline -2
L31:
	.dbline 0 ; func end
	adiw R28,1
	xjmp pop_xgsetF03C
	.dbsym r pMsgItem 22 pS[MsgItem]
	.dbsym r pQueue 10 pS[AbstructDataTypeQueue]
	.dbsym l n 0 c
	.dbsym r pSFP 20 pS[SerialFrameProcess]
	.dbend
	.dbfunc e SPF_Send_MSG _SPF_Send_MSG fc
;           Reg2 -> R20,R21
;           Reg8 -> R22,R23
;             n1 -> R12
;     cXORCheck0 -> R10
;         Length -> R14
;           pMSG -> y+14
;           cCMD -> R12
;           pSFP -> y+10
	.even
_SPF_Send_MSG::
	xcall push_arg4
	xcall push_xgsetF0FC
	mov R12,R18
	ldd R14,y+16
	.dbline -1
	.dbline 310
; }
; 
; /***********************************************************
; *   函数说明:消息发送函数                                 *
; *   输入:    串行数据帧检测结构指针,指令,消息,消息长度 *
; *   输出:    TRUE                                         *
; *   调用函数:无                                           *
; ***********************************************************/
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
;                   uint8 cCMD,uint8 *pMSG,uint8 Length)
; {
	.dbline 311
;     uint8 n = 0;
	.dbline 312
;     uint8 cXORCheck = 0;
	clr R10
	.dbline 314
;     
;     (*(pSFP->OutputDataFunc))(pSFP->cHeadByte);             //发送消息头部
	ldd R30,y+10
	ldd R31,y+11
	ldd R16,z+24
	movw R20,R30
	subi R20,226  ; offset = 30
	sbci R21,255
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 316
;     
;     if (!(pSFP->cFixLength))
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+26
	tst R2
	brne L41
X21:
	.dbline 317
;     {
	.dbline 318
;         (*(pSFP->OutputDataFunc))((Length+5));              //发送消息长度
	mov R16,R14
	subi R16,251    ; addi 5
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 319
;         cXORCheck ^= (Length + 5);
	mov R24,R14
	subi R24,251    ; addi 5
	eor R10,R24
	.dbline 320
;     }
L41:
	.dbline 322
;     
;     (*(pSFP->OutputDataFunc))(cCMD);                        //发送指令字节
	mov R16,R12
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 323
;     cXORCheck ^= cCMD;
	eor R10,R12
	.dbline 325
; 
;     for (n = 0;n < Length;n++)
	clr R12
	xjmp L46
L43:
	.dbline 326
;     {
	.dbline 327
;         (*(pSFP->OutputDataFunc))(pMSG[n]);                 //发送消息本体
	mov R22,R12
	clr R23
	ldd R0,y+14
	ldd R1,y+15
	add R22,R0
	adc R23,R1
	movw R30,R22
	ldd R16,z+0
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 328
;         cXORCheck ^= pMSG[n];
	movw R30,R22
	ldd R2,z+0
	eor R10,R2
	.dbline 329
;     }
L44:
	.dbline 325
	inc R12
L46:
	.dbline 325
	cp R12,R14
	brlo L43
X22:
	.dbline 331
;     
;     (*(pSFP->OutputDataFunc))(cXORCheck);                   //发送校验字节
	mov R16,R10
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 332
;     (*(pSFP->OutputDataFunc))(pSFP->cEndByte);              //发送消息头部
	ldd R30,y+10
	ldd R31,y+11
	ldd R16,z+25
	movw R30,R20
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	xcall xicallx
	.dbline 334
;     
;     return TRUE;
	ldi R16,1
	.dbline -2
L40:
	.dbline 0 ; func end
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r Reg2 20 pV
	.dbsym r Reg8 22 pV
	.dbsym r n1 12 c
	.dbsym r cXORCheck0 10 c
	.dbsym r Length 14 c
	.dbsym l pMSG 14 pc
	.dbsym r cCMD 12 c
	.dbsym l pSFP 10 pS[SerialFrameProcess]
	.dbend
; }
; 

⌨️ 快捷键说明

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