📄 rd_useserialframe_proc.s
字号:
.module RD_UseSerialFrame_PROC.c
.area text(rom, con, rel)
.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseSerialFrame_PROC.c
.dbfunc e SFP_NULL_Output_Data_Function _SFP_NULL_Output_Data_Function fc
; p -> R10,R11
; cData -> y+2
.even
_SFP_NULL_Output_Data_Function::
st -y,r17
st -y,r16
st -y,R10
st -y,R11
.dbline -1
.dbline 94
; /***********************************************************
; * 函数库说明:串行通信数据帧处理函数函数库 *
; * 版本: v1.00 *
; * 作者: 王卓然 *
; * 创建日期: 2007年4月6日 *
; * -------------------------------------------------------- *
; * [支 持 库] *
; * 支持库名称:LIB_Config.h *
; * 需要版本: ----- *
; * 支持库说明:库函数配置声明库 *
; * *
; * 支持库名称:RD_MacroAndConst.h *
; * 需要版本: v0.01 &abv *
; * 支持库说明:系统常用宏定义库 *
; * *
; * 支持库名称:RD_UseSerialFrame_PROC.h *
; * 需要版本: ----- *
; * 支持库名称:串行通信数据帧处理函数声明库 *
; * -------------------------------------------------------- *
; * [版本更新] *
; * 修改: *
; * 修改日期: *
; * 版本: *
; * -------------------------------------------------------- *
; * [版本历史] *
; * -------------------------------------------------------- *
; * [使用说明] *
; ***********************************************************/
;
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "RD_ADT_QUEUE.h"
; # include "RD_ADT_MSGMap.h"
; # include "RD_UseSerialFrame_PROC.h"
; # include "RD_UseBits.h"
;
; /********************
; * 系 统 宏 定 义 *
; ********************/
;
; /*------------------*
; * 常 数 宏 定 义 *
; *------------------*/
;
; /*------------------*
; * 动 作 宏 定 义 *
; *------------------*/
; # define SFP_ACTION_FLAG SET_BIT8_FORMAT(cTempActionFlag)
; # define SFP_STOP_ALL_ACTION cTempActionFlag = NULL;
; # define SFP_WAIT_FOR_FRAME_HEAD SFP_ACTION_FLAG.BIT0
; # define SFP_WAIT_FOR_FRAME_SIZE SFP_ACTION_FLAG.BIT1
; # define SFP_WAIT_FOR_ALL_DATA SFP_ACTION_FLAG.BIT2
;
;
; /********************
; * 用户变量类型定义 *
; ********************/
;
; /********************
; * 结构体定义区 *
; ********************/
;
; /********************
; * 模块函数声明区 *
; ********************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
;
; /********************
; * 全局函数声明区 *
; ********************/
; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
; BOOL SFP_NULL_Output_Data_Function(uint8 cData);
; BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
; uint8 cCMD,uint8 *pMSG,uint8 Length);
; /********************
; * 模块变量声明区 *
; ********************/
;
; /********************
; * 全局变量声明区 *
; ********************/
;
; /***********************************************************
; * 函数说明:数据输出空函数 *
; * 输入: 数据 *
; * 输出: FALSE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SFP_NULL_Output_Data_Function(uint8 cData)
; {
.dbline 95
; uint8 *p = &cData;
movw R24,R28
adiw R24,2
movw R10,R24
.dbline 97
;
; return FALSE;
clr R16
.dbline -2
L1:
.dbline 0 ; func end
ld R11,y+
ld R10,y+
adiw R28,2
ret
.dbsym r p 10 pc
.dbsym l cData 2 c
.dbend
.dbfunc e SFP_NULL_Input_Data_Function _SFP_NULL_Input_Data_Function fc
; pData -> R16,R17
.even
_SFP_NULL_Input_Data_Function::
.dbline -1
.dbline 107
; }
;
; /***********************************************************
; * 函数说明:数据输入空函数 *
; * 输入: 指针 *
; * 输出: FALSE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
; {
.dbline 108
; (*pData) = NULL;
clr R2
movw R30,R16
std z+0,R2
.dbline 110
;
; return FALSE;
clr R16
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r pData 16 pc
.dbend
.dbfunc e SFP_NULL_Peek_Data_Function _SFP_NULL_Peek_Data_Function fc
; pData -> R16,R17
.even
_SFP_NULL_Peek_Data_Function::
.dbline -1
.dbline 120
; }
;
; /***********************************************************
; * 函数说明:数据察看空函数 *
; * 输入: 指针 *
; * 输出: FALSE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
; {
.dbline 121
; (*pData) = NULL;
clr R2
movw R30,R16
std z+0,R2
.dbline 123
;
; return FALSE;
clr R16
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r pData 16 pc
.dbend
.dbfunc e Serial_Frame_Process _Serial_Frame_Process fV
.dbstruct 0 18 AbstructDataTypeQueue
.dbfield 0 pBuffer pc
.dbfield 2 nSize i
.dbfield 4 nHead i
.dbfield 6 nTail i
.dbfield 8 nCount i
.dbfield 10 fnAddToBuffer pfc
.dbfield 12 fnGetFromBuffer pfc
.dbfield 14 fnCheckEmpty pfc
.dbfield 16 fnPeekFromBuffer pfc
.dbend
.dbstruct 0 3 MsgMapItem
.dbfield 0 cCMD c
.dbfield 1 pMsgFunc pfc
.dbend
.dbstruct 0 3 MsgMap
.dbfield 0 cItemCount c
.dbfield 1 pMsgItems pS[MsgMapItem]
.dbend
.dbstruct 0 4 MsgItem
.dbfield 0 cCMD c
.dbfield 1 cDataLength c
.dbfield 2 pData pc
.dbend
.dbstruct 0 37 SerialFrameProcess
.dbfield 0 FrameBuffer S[AbstructDataTypeQueue]
.dbfield 18 pMsgMap pS[MsgMap]
.dbfield 20 MsgItem S[MsgItem]
.dbfield 24 cHeadByte c
.dbfield 25 cEndByte c
.dbfield 26 cFixLength c
.dbfield 27 cAddress c
.dbfield 28 InputDataFunc pfc
.dbfield 30 OutputDataFunc pfc
.dbfield 32 PeekDataFunc pfc
.dbfield 34 cActionFlag c
.dbfield 35 cXORCheck c
.dbfield 36 cFrameSize c
.dbend
; cTempData -> y+1
; pQueue -> R22,R23
; cTempActionFlag -> y+0
; pSFP -> R20,R21
.even
_Serial_Frame_Process::
xcall push_xgsetF00C
movw R20,R16
sbiw R28,2
.dbline -1
.dbline 134
; }
;
;
; /***********************************************************
; * 函数说明:串行通讯数据帧处理函数 *
; * 输入: 要处理的数据帧结构指针 *
; * 输出: 无 *
; * 调用函数:SFP_Check_Frames() *
; ***********************************************************/
; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
; {
.dbline 135
; uint8 cTempActionFlag = pSFP->cActionFlag;
movw R30,R20
ldd R2,z+34
std y+0,R2
.dbline 136
; uint8 cTempData = 0;
clr R2
std y+1,R2
.dbline 137
; ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
movw R22,R30
.dbline 140
;
;
; if (!(*(pSFP->InputDataFunc))(&cTempData)) //利用函数指针调用函数
movw R16,R28
subi R16,255 ; offset = 1
sbci R17,255
ldd R26,z+28
ldd R27,z+29
movw R30,R26
xcall xicallx
tst R16
brne L5
X0:
.dbline 141
; {
.dbline 142
; return ;
xjmp L4
L5:
.dbline 145
; }
;
; if (cTempActionFlag == NULL)
ldd R2,y+0
tst R2
brne L7
X1:
.dbline 146
; {
.dbline 147
; pSFP->cXORCheck = 0;
clr R2
movw R30,R20
std z+35,R2
.dbline 148
; pSFP->cFrameSize = 0;
std z+36,R2
.dbline 149
; SFP_WAIT_FOR_FRAME_HEAD = TRUE;
ldd R24,y+0
ori R24,1
std y+0,R24
.dbline 150
; }
L7:
.dbline 152
;
; if (SFP_WAIT_FOR_FRAME_HEAD)
movw R30,R28
ldd R24,z+0
andi R24,1
brne X13
xjmp L9
X13:
X2:
.dbline 153
; {
.dbline 154
; if (cTempData == pSFP->cHeadByte)
movw R30,R20
ldd R2,z+24
ldd R3,y+1
cp R3,R2
breq X14
xjmp L4
X14:
X3:
.dbline 155
; {
.dbline 156
; ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
mov R18,R3
movw R16,R22
movw R24,R22
adiw R24,10
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
xcall xicallx
.dbline 159
;
;
; if (!(pSFP->cFixLength))
movw R30,R20
ldd R2,z+26
tst R2
brne L13
X4:
.dbline 160
; {
.dbline 162
; //变长数据帧
; SFP_WAIT_FOR_FRAME_SIZE = TRUE;
ldd R24,y+0
ori R24,2
std y+0,R24
.dbline 163
; }
xjmp L14
L13:
.dbline 165
; else
; {
.dbline 167
; //固定长度的数据帧
; SFP_WAIT_FOR_ALL_DATA = TRUE;
ldd R24,y+0
ori R24,4
std y+0,R24
.dbline 168
; pSFP->cFrameSize = pSFP->cFixLength;
movw R30,R20
ldd R2,z+26
std z+36,R2
.dbline 169
; }
L14:
.dbline 171
;
; SFP_WAIT_FOR_FRAME_HEAD = FALSE;
ldd R24,y+0
andi R24,254
std y+0,R24
.dbline 172
; pSFP->cActionFlag = cTempActionFlag;
mov R2,R24
movw R30,R20
std z+34,R2
.dbline 174
;
; }
.dbline 176
;
; return ;
xjmp L4
L9:
.dbline 179
; }
;
; if (SFP_WAIT_FOR_FRAME_SIZE)
movw R30,R28
ldd R24,z+0
lsr R24
andi R24,1
brne X15
xjmp L15
X15:
X5:
.dbline 180
; {
.dbline 182
;
; if (cTempData > (pQueue->nSize))
movw R30,R22
ldd R2,z+2
ldd R3,z+3
ldd R4,y+1
clr R5
cp R2,R4
cpc R3,R5
brsh L17
X6:
.dbline 183
; {
.dbline 186
; //错误的数据帧长度
;
; ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
.dbline 186
clr R2
clr R3
std z+5,R3
std z+4,R2
.dbline 186
std z+7,R3
std z+6,R2
.dbline 186
std z+9,R3
std z+8,R2
.dbline 186
.dbline 188
;
; SFP_STOP_ALL_ACTION
std y+0,R2
.dbline 189
; }
xjmp L18
L17:
.dbline 191
; else
; {
.dbline 193
; //有效的数据帧长度
; pSFP->cFrameSize = cTempData; //更新数据帧长度信息
ldd R2,y+1
movw R30,R20
std z+36,R2
.dbline 194
; pSFP->cXORCheck ^= cTempData;
movw R24,R30
adiw R24,35
movw R30,R24
ldd R3,z+0
eor R3,R2
std z+0,R3
.dbline 196
;
; 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 199
;
;
; SFP_WAIT_FOR_ALL_DATA = TRUE;
ldd R24,y+0
ori R24,4
std y+0,R24
.dbline 200
; SFP_WAIT_FOR_FRAME_SIZE = FALSE;
andi R24,253
std y+0,R24
.dbline 201
; }
L18:
.dbline 203
;
; pSFP->cActionFlag = cTempActionFlag;
ldd R2,y+0
movw R30,R20
std z+34,R2
.dbline 204
; return ;
xjmp L4
L15:
.dbline 207
; }
;
; if (SFP_WAIT_FOR_ALL_DATA)
movw R30,R28
ldd R24,z+0
lsr R24
lsr R24
andi R24,1
brne X16
xjmp L19
X16:
X7:
.dbline 208
; {
.dbline 209
; if ((pQueue->nCount) < (pSFP->cFrameSize))
movw R30,R20
ldd R2,z+36
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -