📄 rd_useserialframe_proc.lis
字号:
.module RD_UseSerialFrame_PROC.c
.area text(rom, con, rel)
0000 .dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseSerialFrame_PROC.c
0000 .dbfunc e SFP_NULL_Output_Data_Function _SFP_NULL_Output_Data_Function fc
0000 ; p -> R10,R11
0000 ; cData -> y+2
.even
0000 _SFP_NULL_Output_Data_Function::
0000 1A93 st -y,r17
0002 0A93 st -y,r16
0004 AA92 st -y,R10
0006 BA92 st -y,R11
0008 .dbline -1
0008 .dbline 94
0008 ; /***********************************************************
0008 ; * 函数库说明:串行通信数据帧处理函数函数库 *
0008 ; * 版本: v1.00 *
0008 ; * 作者: 王卓然 *
0008 ; * 创建日期: 2007年4月6日 *
0008 ; * -------------------------------------------------------- *
0008 ; * [支 持 库] *
0008 ; * 支持库名称:LIB_Config.h *
0008 ; * 需要版本: ----- *
0008 ; * 支持库说明:库函数配置声明库 *
0008 ; * *
0008 ; * 支持库名称:RD_MacroAndConst.h *
0008 ; * 需要版本: v0.01 &abv *
0008 ; * 支持库说明:系统常用宏定义库 *
0008 ; * *
0008 ; * 支持库名称:RD_UseSerialFrame_PROC.h *
0008 ; * 需要版本: ----- *
0008 ; * 支持库名称:串行通信数据帧处理函数声明库 *
0008 ; * -------------------------------------------------------- *
0008 ; * [版本更新] *
0008 ; * 修改: *
0008 ; * 修改日期: *
0008 ; * 版本: *
0008 ; * -------------------------------------------------------- *
0008 ; * [版本历史] *
0008 ; * -------------------------------------------------------- *
0008 ; * [使用说明] *
0008 ; ***********************************************************/
0008 ;
0008 ; /********************
0008 ; * 头 文 件 配 置 区 *
0008 ; ********************/
0008 ; # include "RD_MacroAndConst.h"
0008 ; # include "RD_ADT_QUEUE.h"
0008 ; # include "RD_ADT_MSGMap.h"
0008 ; # include "RD_UseSerialFrame_PROC.h"
0008 ; # include "RD_UseBits.h"
0008 ;
0008 ; /********************
0008 ; * 系 统 宏 定 义 *
0008 ; ********************/
0008 ;
0008 ; /*------------------*
0008 ; * 常 数 宏 定 义 *
0008 ; *------------------*/
0008 ;
0008 ; /*------------------*
0008 ; * 动 作 宏 定 义 *
0008 ; *------------------*/
0008 ; # define SFP_ACTION_FLAG SET_BIT8_FORMAT(cTempActionFlag)
0008 ; # define SFP_STOP_ALL_ACTION cTempActionFlag = NULL;
0008 ; # define SFP_WAIT_FOR_FRAME_HEAD SFP_ACTION_FLAG.BIT0
0008 ; # define SFP_WAIT_FOR_FRAME_SIZE SFP_ACTION_FLAG.BIT1
0008 ; # define SFP_WAIT_FOR_ALL_DATA SFP_ACTION_FLAG.BIT2
0008 ;
0008 ;
0008 ; /********************
0008 ; * 用户变量类型定义 *
0008 ; ********************/
0008 ;
0008 ; /********************
0008 ; * 结构体定义区 *
0008 ; ********************/
0008 ;
0008 ; /********************
0008 ; * 模块函数声明区 *
0008 ; ********************/
0008 ; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
0008 ;
0008 ; /********************
0008 ; * 全局函数声明区 *
0008 ; ********************/
0008 ; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
0008 ; BOOL SFP_NULL_Output_Data_Function(uint8 cData);
0008 ; BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
0008 ; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
0008 ; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
0008 ; uint8 cCMD,uint8 *pMSG,uint8 Length);
0008 ; /********************
0008 ; * 模块变量声明区 *
0008 ; ********************/
0008 ;
0008 ; /********************
0008 ; * 全局变量声明区 *
0008 ; ********************/
0008 ;
0008 ; /***********************************************************
0008 ; * 函数说明:数据输出空函数 *
0008 ; * 输入: 数据 *
0008 ; * 输出: FALSE *
0008 ; * 调用函数:无 *
0008 ; ***********************************************************/
0008 ; BOOL SFP_NULL_Output_Data_Function(uint8 cData)
0008 ; {
0008 .dbline 95
0008 ; uint8 *p = &cData;
0008 CE01 movw R24,R28
000A 0296 adiw R24,2
000C 5C01 movw R10,R24
000E .dbline 97
000E ;
000E ; return FALSE;
000E 0027 clr R16
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 B990 ld R11,y+
0012 A990 ld R10,y+
0014 2296 adiw R28,2
0016 0895 ret
0018 .dbsym r p 10 pc
0018 .dbsym l cData 2 c
0018 .dbend
0018 .dbfunc e SFP_NULL_Input_Data_Function _SFP_NULL_Input_Data_Function fc
0018 ; pData -> R16,R17
.even
0018 _SFP_NULL_Input_Data_Function::
0018 .dbline -1
0018 .dbline 107
0018 ; }
0018 ;
0018 ; /***********************************************************
0018 ; * 函数说明:数据输入空函数 *
0018 ; * 输入: 指针 *
0018 ; * 输出: FALSE *
0018 ; * 调用函数:无 *
0018 ; ***********************************************************/
0018 ; BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
0018 ; {
0018 .dbline 108
0018 ; (*pData) = NULL;
0018 2224 clr R2
001A F801 movw R30,R16
001C 2082 std z+0,R2
001E .dbline 110
001E ;
001E ; return FALSE;
001E 0027 clr R16
0020 .dbline -2
0020 L2:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r pData 16 pc
0022 .dbend
0022 .dbfunc e SFP_NULL_Peek_Data_Function _SFP_NULL_Peek_Data_Function fc
0022 ; pData -> R16,R17
.even
0022 _SFP_NULL_Peek_Data_Function::
0022 .dbline -1
0022 .dbline 120
0022 ; }
0022 ;
0022 ; /***********************************************************
0022 ; * 函数说明:数据察看空函数 *
0022 ; * 输入: 指针 *
0022 ; * 输出: FALSE *
0022 ; * 调用函数:无 *
0022 ; ***********************************************************/
0022 ; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
0022 ; {
0022 .dbline 121
0022 ; (*pData) = NULL;
0022 2224 clr R2
0024 F801 movw R30,R16
0026 2082 std z+0,R2
0028 .dbline 123
0028 ;
0028 ; return FALSE;
0028 0027 clr R16
002A .dbline -2
002A L3:
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r pData 16 pc
002C .dbend
002C .dbfunc e Serial_Frame_Process _Serial_Frame_Process fV
002C .dbstruct 0 18 AbstructDataTypeQueue
002C .dbfield 0 pBuffer pc
002C .dbfield 2 nSize i
002C .dbfield 4 nHead i
002C .dbfield 6 nTail i
002C .dbfield 8 nCount i
002C .dbfield 10 fnAddToBuffer pfc
002C .dbfield 12 fnGetFromBuffer pfc
002C .dbfield 14 fnCheckEmpty pfc
002C .dbfield 16 fnPeekFromBuffer pfc
002C .dbend
002C .dbstruct 0 3 MsgMapItem
002C .dbfield 0 cCMD c
002C .dbfield 1 pMsgFunc pfc
002C .dbend
002C .dbstruct 0 3 MsgMap
002C .dbfield 0 cItemCount c
002C .dbfield 1 pMsgItems pS[MsgMapItem]
002C .dbend
002C .dbstruct 0 4 MsgItem
002C .dbfield 0 cCMD c
002C .dbfield 1 cDataLength c
002C .dbfield 2 pData pc
002C .dbend
002C .dbstruct 0 37 SerialFrameProcess
002C .dbfield 0 FrameBuffer S[AbstructDataTypeQueue]
002C .dbfield 18 pMsgMap pS[MsgMap]
002C .dbfield 20 MsgItem S[MsgItem]
002C .dbfield 24 cHeadByte c
002C .dbfield 25 cEndByte c
002C .dbfield 26 cFixLength c
002C .dbfield 27 cAddress c
002C .dbfield 28 InputDataFunc pfc
002C .dbfield 30 OutputDataFunc pfc
002C .dbfield 32 PeekDataFunc pfc
002C .dbfield 34 cActionFlag c
002C .dbfield 35 cXORCheck c
002C .dbfield 36 cFrameSize c
002C .dbend
002C ; cTempData -> y+1
002C ; pQueue -> R22,R23
002C ; cTempActionFlag -> y+0
002C ; pSFP -> R20,R21
.even
002C _Serial_Frame_Process::
002C 0E940000 xcall push_xgsetF00C
0030 A801 movw R20,R16
0032 2297 sbiw R28,2
0034 .dbline -1
0034 .dbline 134
0034 ; }
0034 ;
0034 ;
0034 ; /***********************************************************
0034 ; * 函数说明:串行通讯数据帧处理函数 *
0034 ; * 输入: 要处理的数据帧结构指针 *
0034 ; * 输出: 无 *
0034 ; * 调用函数:SFP_Check_Frames() *
0034 ; ***********************************************************/
0034 ; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
0034 ; {
0034 .dbline 135
0034 ; uint8 cTempActionFlag = pSFP->cActionFlag;
0034 FA01 movw R30,R20
0036 22A0 ldd R2,z+34
0038 2882 std y+0,R2
003A .dbline 136
003A ; uint8 cTempData = 0;
003A 2224 clr R2
003C 2982 std y+1,R2
003E .dbline 137
003E ; ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
003E BF01 movw R22,R30
0040 .dbline 140
0040 ;
0040 ;
0040 ; if (!(*(pSFP->InputDataFunc))(&cTempData)) //利用函数指针调用函数
0040 8E01 movw R16,R28
0042 0F5F subi R16,255 ; offset = 1
0044 1F4F sbci R17,255
0046 A48D ldd R26,z+28
0048 B58D ldd R27,z+29
004A FD01 movw R30,R26
004C 0E940000 xcall xicallx
0050 0023 tst R16
0052 09F4 brne L5
0054 X0:
0054 .dbline 141
0054 ; {
0054 .dbline 142
0054 ; return ;
0054 C3C0 xjmp L4
0056 L5:
0056 .dbline 145
0056 ; }
0056 ;
0056 ; if (cTempActionFlag == NULL)
0056 2880 ldd R2,y+0
0058 2220 tst R2
005A 39F4 brne L7
005C X1:
005C .dbline 146
005C ; {
005C .dbline 147
005C ; pSFP->cXORCheck = 0;
005C 2224 clr R2
005E FA01 movw R30,R20
0060 23A2 std z+35,R2
0062 .dbline 148
0062 ; pSFP->cFrameSize = 0;
0062 24A2 std z+36,R2
0064 .dbline 149
0064 ; SFP_WAIT_FOR_FRAME_HEAD = TRUE;
0064 8881 ldd R24,y+0
0066 8160 ori R24,1
0068 8883 std y+0,R24
006A .dbline 150
006A ; }
006A L7:
006A .dbline 152
006A ;
006A ; if (SFP_WAIT_FOR_FRAME_HEAD)
006A FE01 movw R30,R28
006C 8081 ldd R24,z+0
006E 8170 andi R24,1
0070 09F4 brne X13
0072 25C0 xjmp L9
0074 X13:
0074 X2:
0074 .dbline 153
0074 ; {
0074 .dbline 154
0074 ; if (cTempData == pSFP->cHeadByte)
0074 FA01 movw R30,R20
0076 208C ldd R2,z+24
0078 3980 ldd R3,y+1
007A 3214 cp R3,R2
007C 09F0 breq X14
007E AEC0 xjmp L4
0080 X14:
0080 X3:
0080 .dbline 155
0080 ; {
0080 .dbline 156
0080 ; ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
0080 232D mov R18,R3
0082 8B01 movw R16,R22
0084 CB01 movw R24,R22
0086 0A96 adiw R24,10
0088 FC01 movw R30,R24
008A A081 ldd R26,z+0
008C B181 ldd R27,z+1
008E FD01 movw R30,R26
0090 0E940000 xcall xicallx
0094 .dbline 159
0094 ;
0094 ;
0094 ; if (!(pSFP->cFixLength))
0094 FA01 movw R30,R20
0096 228C ldd R2,z+26
0098 2220 tst R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -