www.pudn.com > 图像识别模组源代码eagle_New.rar > master.asm
//================================================================== //名称:master.asm //来源:来源于程序EAGLE3项目中 //描述:主要完成以下内容 // InitialSet; 初始化SPCA563、SPCA561 // GetObjData; 获得数据内容和处理 // TimeDelay; 延时程序 // WriteOper; CPU向SPCA563写数据 // ReadOper; CPU向SPCA563读数据 //日期: // 2001.08.08 ;开始 // 2003.11.10 ;注释 //================================================================== .include hardware.inc; .include a2000.inc; //============================ 定义全局标号 ========================= .public R_AETarget; // AE 设置 .public R_SeekFlag; // 功能标志 .public R_Flag; // 标志 .public R_Offset; // 偏移量 .public R_AddrBuffer; // 读地址 .public R_WriteBuffer; // 写地址 .public R_ReadBuffer; // 读地址 .public R_WriteDataBuffer; // 写的内容 .public R_ReadDataBuffer; // 读的内容 .public R_ObjNum; // 物体数目 .public R_Shape; // 物体外形 .public R_Color; // 物体颜色 .public R_AreaL; // 物体距离低位 .public R_AreaH; // 物体距离高位 .public R_CenterX; // 中心水平距离 .public R_CenterY; // 中心垂直距离 .public R_CompX; // 物体空间水平尺寸 .public R_CompY; // 物体空间垂直尺寸 .public R_StaX; // 水平距离的起初值 .public R_StaY; // 垂直距离的起初值 .public R_EndX; // 水平距离的结束值 .public R_EndY; // 垂直距离的结束值 .public R_DelayTime; // 延时时间 .public R_WaitRDYTime; // 数据准备好的时间 .public R_CmpColor; // 分配的颜色 .public R_ColorIndex; // 颜色索引 .public R_PreColor; // 校正后的物体颜色 .public R_PreShape; // 校正后的物体外形 .public R_PrevArea; // 校正后的物体空间尺寸低位 .public R_PreAreaH; // 校正后的物体空间尺寸高位 .public R_PreCompX; // 校正后的物体的水平尺寸 .public R_PreCompY; // 校正后的物体的垂直尺寸 .public R_Temp; // 数组 .public R_Temp0; // 数组0 .public R_Temp1; // 数组1 .public R_Temp2; // 数组2 //===================== 定义全局标号结束 ======================================= //===================== 预定义段RAM开始 ======================================== .ram // 变量定义说明同上 .var R_AETarget; .var R_SeekFlag; .var R_Flag; .var R_Offset; .var R_AddrBuffer; .var R_ReadBuffer; .var R_WriteBuffer; .var R_WriteDataBuffer; .var R_ReadDataBuffer; .var R_ObjNum; .var R_Shape; .var R_Color; .var R_AreaL; .var R_AreaH; .var R_CenterX; .var R_CenterY; .var R_CompX; .var R_CompY; .var R_StaX; .var R_StaY; .var R_EndX; .var R_EndY; .var R_CmpColor; .var R_ColorIndex; .var R_DelayTime; .var R_WaitRDYTime; .var R_PrevArea; .var R_PreColor; .var R_PreShape; .var R_PreAreaH; .var R_PreCompX; .var R_PreCompY; .var R_Temp; .var R_Temp0; .var R_Temp1; .var R_Temp2; //===================== 预定义段RAM结束 ======================================== .code //======================= 初始化模式选择 ======================== //=================================================== //函数:IntialToEagle3 //语法:调用 //描述:用来初始化Eagle3 //参数:无 //返回:无 //=================================================== .public _IntialToEagle3; _IntialToEagle3: .proc r1 = 0x00; [R_Flag] = r1; [R_Temp] = r1; L_RestartInitial: call F_Delay10ms; call F_Set50Hz; // 设置光源为50HZ call F_SetAWBON; // 自动色彩调整功能 call F_SetClassDataMode; // 采集数据分类模式 call F_SetAEDefault; // 自动暴光的功能 r1 = [R_Temp]; // 初始化次数 r1 += 1; [R_Temp] = r1; cmp r1,0x03; je L_InitToEagle3End; r1 = [R_Flag]; r1 &= 0x0004; jnz L_RestartInitial; L_InitToEagle3End: retf; .endp //=================================================== //函数:Enable_1KHzAnd2HzInt //语法:调用 //描述:用来设定1KHZ、2HZ实时中断 //参数:无 //返回:无 //=================================================== .public _Enable_1KHzAnd2HzInt; .public F_Enable_1KHzAnd2HzInt; _Enable_1KHzAnd2HzInt: .proc F_Enable_1KHzAnd2HzInt: r1 = [R_InterruptStatus]; r1 |= C_IRQ4_1KHz; r1 |= C_IRQ5_2Hz; [R_InterruptStatus] = r1; [P_INT_Ctrl] = r1; // 设置中断方式 int FIQ,IRQ; // 开中断 retf; .endp //=================================================== //函数:Set_SDA_Input //语法:调用 //描述:用来设置数据传输是输入方式 //参数:无 //返回:无 //=================================================== .public _Set_SDA_Input; .public F_Set_SDA_Input; _Set_SDA_Input: .proc F_Set_SDA_Input: r1 = 0xf9f8; // 设置PA8、PA9、PA10 [P_IOA_Attrib] = r1; r1 = 0xf9f8; [P_IOA_Dir] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xff3f; [P_IOA_Buffer] = r1; retf; .ENDP //=================================================== //函数:Set_SDA_Output //语法:调用 //描述:用来设置数据传输是输出方式 //参数:无 //返回:无 //=================================================== .public _Set_SDA_Output; .public F_Set_SDA_Output; _Set_SDA_Output: .proc F_Set_SDA_Output: r1 = 0xfbf8; // 设置PA8、PA9、PA10 [P_IOA_Attrib] = r1; r1 = 0xfbf8; [P_IOA_Dir] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xff3f; [P_IOA_Buffer] = r1; retf; .ENDP //=================================================== //函数:SetAEDefault //语法:调用 //描述:用来设置默认的自动爆光设置 //参数:无 //返回:无 //=================================================== .public _SetAEDefault; .public F_SetAEDefault; _SetAEDefault: .proc F_SetAEDefault: call F_HighAddr70; r1 = 0x07; [R_AETarget] = r1; r1 = T_AETargetTable; r1 += [R_AETarget]; r1 = [r1]; [R_WriteDataBuffer] = r1; r1 = 0xe3; [R_AddrBuffer] = r1; call F_WriteOper; call F_FeatureEngine; retf; .endp T_AETargetTable: .dw 0x90 .dw 0xa0 .dw 0xb0 .dw 0xc0 .dw 0xd0 .dw 0xe0 .dw 0xf0 .dw 0x00 .dw 0x10 .dw 0x20 .dw 0x30 .dw 0x40 .dw 0x50 .dw 0x60 .dw 0x70 .dw 0x7f //=================================================== //函数:Set50Hz //语法:调用 //描述:光源选择是50HZ //参数:无 //返回:无 //=================================================== .public _Set50Hz; .public F_Set50Hz; _Set50Hz: .proc F_Set50Hz: call F_HighAddr70; // 使70单元高地址有效 r1 = 0xe1; // 读70E1单元 [R_AddrBuffer] = r1; r1 = 0x00; [R_ReadDataBuffer] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; r1 |= 0x08; [R_WriteDataBuffer] = r1; // 向70E1单元写内容 r1 = 0xe1; [R_AddrBuffer] = r1; call F_WriteOper; call F_FeatureEngine; retf; .endp //=================================================== //函数:SetAWBON //语法:调用 //描述:自动色彩调整使用 //参数:无 //返回:无 //=================================================== .public _SetAWBON; .public F_SetAWBON; _SetAWBON: .proc F_SetAWBON: call F_HighAddr70; r1 = 0xe2; [R_AddrBuffer] = r1; r1 = 0x00; [R_ReadDataBuffer] = r1; call F_ReadOper; // 读70E2中的内容 r1 = [R_ReadDataBuffer]; r1 |= 0x80; [R_WriteDataBuffer] = r1; r1 = 0xe2; [R_AddrBuffer] = r1; call F_WriteOper; // 向70E2中写内容 call F_FeatureEngine; retf; .endp //=================================================== //函数:F_SetAWBOFF //语法:调用 //描述:用来选择黑白增益匹配不使用 //参数:无 //返回:无 //=================================================== .public _SetAWBOFF; .public F_SetAWBOFF; _SetAWBOFF: .proc F_SetAWBOFF: call F_HighAddr70; r1 = 0xe2; [R_AddrBuffer] = r1; r1 = 0x00; [R_ReadDataBuffer] = r1; call F_ReadOper; // 读70E2内容 r1 = [R_ReadDataBuffer]; r1 &= 0x7f; [R_WriteDataBuffer] = r1; r1 = 0xe2; [R_AddrBuffer] = r1; call F_WriteOper; // 写内容到70E2 call F_FeatureEngine; retf; .endp //=================================================== //函数:SetClassDataMode //语法:调用 //描述:用来选择SPCA561模式选择:分类数据 //参数:无 //返回:无 //=================================================== .public _SetClassDataMode; .public F_SetClassDataMode; _SetClassDataMode: .proc F_SetClassDataMode: call F_HighAddr74; // 设置74地址有效 r1 = 0x03; [R_WriteDataBuffer] = r1; // 向7408中写03内容 r1 = 0x08; [R_AddrBuffer] = r1; call F_WriteOper; retf; .endp //=================================================== //函数:SetRawDataMode //语法:调用 //描述:用来选择SPCA561模式选择:未加工的数据 //参数:无 //返回:无 //=================================================== .public _SetRawDataMode; _SetRawDataMode: .proc call F_HighAddr74; // 设置74地址有效 r1 = 0x00; [R_WriteDataBuffer] = r1; r1 = 0x08; [R_AddrBuffer] = r1; call F_WriteOper; // 向7408中写00内容 retf; .endp //=================================================== //函数:ResetEagle3 //语法:调用 //描述:复位SPCE563A、SPCE561A //参数:无 //返回:无 //=================================================== .public _ResetEagle3; .public F_ResetEagle3; _ResetEagle3: .proc F_ResetEagle3: r1 = [P_IOA_Buffer]; // 置PA11为低25MS后再置高 r1 &= 0xf7ff; [P_IOA_Buffer] = r1; r1 = 0x00; [R_DelayTime] = r1; L_BeingDelay25ms: call F_Delay25ms; r1 = [R_Flag]; r1 &= 0x8000; jz L_BeingDelay25ms; r1 = [P_IOA_Buffer]; r1 |= 0x0800; [P_IOA_Buffer] = r1; retf; .endp //=================================================== //函数:F_ResetEagle3Again //语法:调用 //描述:复位SPCE563A、SPCE561A //参数:无 //返回:无 //=================================================== .public F_ResetEagle3Again; F_ResetEagle3Again: r1 = [P_IOA_Buffer]; r1 &= 0xf7ff; [P_IOA_Buffer] = r1; r1 = 0x00; [R_DelayTime] = r1; L_BeingDelay10msAgain: call F_Delay10ms; r1 = [R_Flag]; r1 &= 0x8000; jz L_BeingDelay10msAgain; r1 = [P_IOA_Buffer]; r1 |= 0x0800; [P_IOA_Buffer] = r1; r1 = [R_Flag]; r1 |= 0x0004; [R_Flag] = r1; retf; //============================== 初始化模式结束 ================================ //============================== 功能子函数开始 ================================ //=================================================== //函数:F_FeatureEngine //语法:汇编调用 //描述:允许特征寄存器使用 //参数:无 //返回:无 //=================================================== .public F_FeatureEngine; F_FeatureEngine: r1 = 0x0f; [R_AddrBuffer] = r1; r1 = 0x74; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; //=================================================== //函数:F_ShapeAnaly //语法:汇编调用 //描述:允许外型分解功能的使用 //参数:无 //返回:无 //=================================================== .public F_ShapeAnaly; F_ShapeAnaly: call F_HighAddr70; r1 = 0xE0; [R_AddrBuffer] = r1; r1 = 0x08; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; //=================================================== //函数:F_OperMode //语法:调用 //描述:允许中心控制寄存器使用 //参数:无 //返回:无 //=================================================== .public F_OperMode; F_OperMode: r1 = 0x0f; [R_AddrBuffer] = r1; r1 = 0x70; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; .public F_AssigneColor; F_AssigneColor: call F_HighAddr74; r1 = T_ColorTable; r1 += [R_CmpColor]; r1 = [r1]; [R_WriteDataBuffer] = r1; r1 = 0x05; [R_AddrBuffer] = r1; call F_WriteOper; retf; //=================================================== //函数:F_CheckAssigneColor //语法:调用 //描述:分解识别的颜色的选择 //参数:无 //返回:无 //=================================================== .public F_CheckAssigneColor; F_CheckAssigneColor: call F_HighAddr74; r1 = 0x00; [R_ReadDataBuffer] = r1; r1 = 0x05; [R_AddrBuffer] = r1; call F_ReadOper; r1 = T_ColorTable; r1 += [R_CmpColor]; r1 = [r1]; cmp r1,[R_ReadDataBuffer]; jne L_AssigneAgain; r1 = [R_Flag]; r1 &= 0xfe; [R_Flag] = r1; retf; L_AssigneAgain: r1 = [R_Flag]; r1 |= 0x01; [R_Flag] = r1; retf; T_ColorTable: .dw 0x00; .dw 0x01; .dw 0x02; .dw 0x04; .dw 0x08; .dw 0x10; .dw 0x40; //Yellow 2002.04.30 .dw 0x40; .dw 0x80; .dw 0x00; //=================================================== //函数:F_LookAssigneColor //语法:调用 //描述:分辨的颜色设置 //参数:无 //返回:无 //=================================================== .public F_LookAssigneColor; F_LookAssigneColor: call F_HighAddr74; r1 = [R_ColorIndex]; r1 += 1; [R_ColorIndex] = r1; r1 = [R_ColorIndex]; cmp r1,0x03; jb L_LookGetColor; r1 = 0x01; [R_ColorIndex] = r1; L_LookGetColor: r1 = T_LookColorTable; r1 += [R_ColorIndex]; r1 = [r1]; [R_WriteDataBuffer] = r1; r1 = 0x05; [R_AddrBuffer] = r1; call F_WriteOper; retf; T_LookColorTable: .dw 0x48; //Yellow 2002.04.30 .dw 0x03; .dw 0x48; //Yellow 2002.04.30 .dw 0x03; .dw 0x48; //Yellow 2002.04.30 //=================================================== //函数:F_Clear70E8 //语法:调用 //描述:用来初始化70E8为0 //参数:无 //返回:无 //=================================================== .public F_Clear70E8; F_Clear70E8: call F_HighAddr70; r1 = 0xe8; [R_AddrBuffer] = r1; r1 = 0x00; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; .public _NormalOperMode; .public F_NormalOperMode; _NormalOperMode: .proc F_NormalOperMode: call F_HighAddr75; r1 = 0x00; [R_AddrBuffer] = r1; r1 = 0x00; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; .endp //=================================================== //函数:F_HighAddr70 //语法:调用 //描述:允许中心控制寄存器使用 //参数:无 //返回:无 //=================================================== .public F_HighAddr70; F_HighAddr70: r1 = 0x0f; [R_AddrBuffer] = r1; r1 = 0x70; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; //=================================================== //函数:F_HighAddr74 //语法:调用 //描述:允许特征状态寄存器使用 //参数:无 //返回:无 //=================================================== .public F_HighAddr74; F_HighAddr74: r1 = 0x0f; [R_AddrBuffer] = r1; r1 = 0x74; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; //=================================================== //函数:F_HighAddr75 //语法:调用 //描述:允许辩识成熟出寄存器使用 //参数:无 //返回:无 //=================================================== .public F_HighAddr75; F_HighAddr75: r1 = 0x0f; [R_AddrBuffer] = r1; r1 = 0x75; [R_WriteDataBuffer] = r1; call F_WriteOper; retf; //======================== 功能子函数结束 ========================================= //======================== 获得数据程序开始 ================================ //=================================================== //函数:F_GetObjNum //语法:调用 //描述:获得物体的数目 //参数:无 //返回:无 //=================================================== .public F_GetObjNum; F_GetObjNum: call F_HighAddr74; r1 = 0x10; [R_AddrBuffer] = r1; r1 = 0x00; [R_ReadDataBuffer] = r1; [R_ObjNum] = r1; call F_ReadOper; //Get Obj Num r1 = [R_ReadDataBuffer]; r1 &= 0x0F; [R_ObjNum] = r1; r1 = [R_ObjNum]; r1 &= 0x08; jnz L_Bufferfull; //Num Buffer full r1 = [R_SeekFlag]; r1 &= 0x7f; [R_SeekFlag] = r1; retf; L_Bufferfull: r1 = [R_SeekFlag]; r1 |= 0x80; [R_SeekFlag] = r1; retf; //=================================================== //函数:F_GetObj1stData //语法:调用 //描述:获得数据21-27单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj1stData; F_GetObj1stData: call F_HighAddr74; r1 = 0x21; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0x22; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0x23; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0x24; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0x25; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0x26; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0x27; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetObj2ndData //语法:调用 //描述:获得第二数据41-47单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj2ndData; F_GetObj2ndData: call F_HighAddr74; r1 = 0x41; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0x42; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0x43; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0x44; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0x45; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0x46; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0x47; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetObj3rdData //语法:调用 //描述:获得第三数据61-67单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj3rdData; F_GetObj3rdData: call F_HighAddr74; r1 = 0x61; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0x62; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0x63; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0x64; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0x65; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0x66; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0x67; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetObj4thData //语法:调用 //描述:获得第四个数据81-87单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj4thData; F_GetObj4thData: call F_HighAddr74; r1 = 0x81; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0x82; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0x83; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0x84; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0x85; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0x86; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0x87; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetObj5thData //语法:调用 //描述:获得第五个数据A1-A7单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj5thData; F_GetObj5thData: call F_HighAddr74; r1 = 0xa1; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0xa2; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0xa3; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0xa4; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0xa5; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0xa6; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0xa7; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetObj6thData //语法:调用 //描述:获得第六个数据C1-C7单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj6thData; F_GetObj6thData: call F_HighAddr74; r1 = 0xc1; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0xc2; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0xc3; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0xc4; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0xc5; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0xc6; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0xc7; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetObj7thData //语法:调用 //描述:获得第七个数据E1-E7单元的内容 //参数:无 //返回:无 //=================================================== .public F_GetObj7thData; F_GetObj7thData: call F_HighAddr74; r1 = 0xe1; [R_AddrBuffer] = r1; call F_GetShapeAndColor; r1 = 0xe2; [R_AddrBuffer] = r1; call F_GetObjStaX; r1 = 0xe3; [R_AddrBuffer] =r1; call F_GetObjStaY; r1 = 0xe4; [R_AddrBuffer] =r1; call F_GetObjEndX; r1 = 0xe5; [R_AddrBuffer] =r1; call F_GetObjEndY; call F_GetObjACG; //StaX+End = CenterX; StaY+endY = CenterY; r1 = 0xe6; [R_AddrBuffer] =r1; call F_GetAreaL; r1 = 0xe7; [R_AddrBuffer] =r1; call F_GetAreaH; retf; //=================================================== //函数:F_GetShapeAndColor //语法:调用 //描述:获得颜色和外形的内容 //参数:无 //返回:无 //=================================================== .public F_GetShapeAndColor; F_GetShapeAndColor: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_Color] = r1; [R_Shape] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; r1 &= 0x07; cmp r1,0x07; jne L_NotYellow; r1 -= 1; L_NotYellow: [R_Color] = r1; r1 = [R_ReadDataBuffer]; r1 &= 0x70; r1 = r1 lsr 4; [R_Shape] = r1; retf; //=================================================== //函数:F_GetObjStaX //语法:调用 //描述:获得物体水平方向的近距离的内容 //参数:无 //返回:无 //=================================================== .public F_GetObjStaX; F_GetObjStaX: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_StaX] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; [R_StaX] = r1; retf; //=================================================== //函数:F_GetObjStaY //语法:调用 //描述:获得物体垂直方向的近距离的内容 //参数:无 //返回:无 //=================================================== .public F_GetObjStaY; F_GetObjStaY: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_StaY] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; [R_StaY] = r1; retf; //=================================================== //函数:F_GetObjEndX //语法:调用 //描述:获得物体水平方向的远距离的内容 //参数:无 //返回:无 //=================================================== .public F_GetObjEndX; F_GetObjEndX: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_EndX] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; [R_EndX] = r1; retf; //=================================================== //函数:F_GetObjEndY //语法:调用 //描述:获得物体垂直方向的远距离的内容 //参数:无 //返回:无 //=================================================== .public F_GetObjEndY; F_GetObjEndY: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_EndY] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; [R_EndY] = r1; retf; //=================================================== //函数:F_GetObjACG //语法:调用 //描述:获得物体垂直方向、水平方向的中心距离和水平、垂直方向物体的实际距离 //参数:无 //返回:无 //=================================================== .public F_GetObjACG; F_GetObjACG: r1 = [R_EndX]; r1 += [R_StaX]; r1 = r1 lsr 1; [R_CenterX] = r1; r1 = [R_EndY]; r1 += [R_StaY]; r1 = r1 lsr 1; [R_CenterY] = r1; r1 = [R_EndX]; r1 -= [R_StaX]; [R_CompX] = r1; r1 = [R_EndY]; r1 -= [R_StaY]; [R_CompY] = r1; retf; //=================================================== //函数:F_GetAreaL //语法:调用 //描述:获得在空间的近距离 //参数:无 //返回:无 //=================================================== .public F_GetAreaL; F_GetAreaL: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_AreaL] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; [R_AreaL] = r1; retf; //=================================================== //函数:F_GetAreaH //语法:调用 //描述:获得在空间的远距离 //参数:无 //返回:无 //=================================================== .public F_GetAreaH; F_GetAreaH: r1 = 0x00; [R_ReadDataBuffer] = r1; [R_AreaH] = r1; call F_ReadOper; r1 = [R_ReadDataBuffer]; [R_AreaH] = r1; retf; .public F_GetObjDataOne; F_GetObjDataOne: r1 = [R_SeekFlag]; r1 &= 0x01; jnz L_NonGetObjDataOneTemp; call F_GetObj1stData; // call F_CheckTheObj; L_NonGetObjDataOneTemp: retf; //========================== 读写程序开始 ============================ //=================================================== //函数:F_WriteOper //语法:调用 //描述:CPU向SPCA563的写数据 //参数:无 //返回:无 //=================================================== .public F_WriteOper; F_WriteOper: r1 = 0x00; [R_WaitRDYTime] = r1; call F_Set_SDA_Output; L_WriteStart: r1 = [P_IOA_Data]; r1 &= 0x0400; jnz L_WriteStartRDY; r1 = [R_WaitRDYTime]; cmp r1,11; jb L_WriteStart; call F_ResetEagle3Again; retf; L_WriteStartRDY: r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0200; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfdff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfdff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfdff; [P_IOA_Buffer] = r1; r1 = [R_AddrBuffer]; [R_WriteBuffer] = r1; call F_WriteOneByte; r1 = [R_WriteDataBuffer]; [R_WriteBuffer] = r1; call F_WriteOneByte; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0200; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = 0x00; [R_WaitRDYTime] = r1; L_WWaitISRInt: r1 = [P_IOA_Data]; r1 &= 0x0400; jnz L_NonWaitRDYAgain; r1 = [R_WaitRDYTime]; cmp r1,11; jb L_WWaitISRInt; call F_ResetEagle3Again; L_NonWaitRDYAgain: retf; //=================================================== //函数:F_ReadOper //语法:调用 //描述:CPU向SPCA563的读数据 //参数:无 //返回:无 //=================================================== .public F_ReadOper; F_ReadOper: r1 = 0x00; [R_WaitRDYTime] = r1; call F_Set_SDA_Output; L_ReadStart: r1 = [P_IOA_Data]; r1 &= 0x0400; jnz L_ReadStartRDY; r1 = [R_WaitRDYTime]; cmp r1,11; jb L_ReadStart; call F_ResetEagle3Again; retf; L_ReadStartRDY: r1 = [P_IOA_Buffer]; r1 |= 0x0200; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfdff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfdff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0200; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [R_AddrBuffer]; [R_WriteBuffer] = r1; call F_WriteOneByte; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = 0x00; [R_WaitRDYTime] = r1; L_ReadDataNow: r1 = [P_IOA_Data]; r1 &= 0x0400; jnz L_ReadDataNowRDY; r1 = [R_WaitRDYTime]; cmp r1,11; jb L_ReadDataNow; call F_ResetEagle3Again; retf; L_ReadDataNowRDY: call F_Set_SDA_Input; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; call F_ReadOneByte; r1 = [R_ReadBuffer]; [R_ReadDataBuffer] = r1; r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0200; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; retf; //=================================================== //函数:F_ReadOneByte //语法:调用 //描述:CPU向SPCA563的读一个字节的数据 //参数:无 //返回:无 //=================================================== F_ReadOneByte: r1 = 0x00; [R_ReadBuffer] = r1; r2 = 0x08; L_RWaitSCKHigh: r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r1 = [P_IOA_Data]; r1 &= 0x0200; jnz L_ReadSDAHigh; r1 = [R_ReadBuffer]; r1 = r1 lsl 1; r1 += 0x00; [R_ReadBuffer] = r1; r2 -= 0x01; jnz L_RWaitSCKHigh; retf; L_ReadSDAHigh: r1 = [R_ReadBuffer]; r1 = r1 lsl 1; r1 += 0x01; [R_ReadBuffer] = r1; r2 -= 0x01; jnz L_RWaitSCKHigh; retf; //=================================================== //函数:F_WriteOneByte //语法:调用 //描述:CPU向SPCA563的写一个字节的数据 //参数:无 //返回:无 //=================================================== F_WriteOneByte: r2 = 0x08; L_WWaitSCKLow: r1 = [P_IOA_Buffer]; r1 &= 0xfeff; [P_IOA_Buffer] = r1; r1 = [R_WriteBuffer]; r1 &= 0x80; jz L_Write_SDALow; r1 = [P_IOA_Buffer]; r1 |= 0x0200; [P_IOA_Buffer] = r1; jmp L_WriteTheBitOK; L_Write_SDALow: r1 = [P_IOA_Buffer]; r1 &= 0xfdff; [P_IOA_Buffer] = r1; L_WriteTheBitOK: r1 = [R_WriteBuffer]; r1 = r1 lsl 1; [R_WriteBuffer] = r1; r1 = [P_IOA_Buffer]; r1 |= 0x0100; [P_IOA_Buffer] = r1; r2 -= 0x01; jnz L_WWaitSCKLow; retf; //========================== 读写程序结束 ============================ //========================== 延时程序开始 ============================ //=================================================== //函数:F_Delay66ms //语法:调用 //描述:延时66毫秒 //参数:无 //返回:无 //=================================================== .public F_Delay66ms; F_Delay66ms: r1 = [R_DelayTime]; cmp r1,0x42; jb L_NonTo66ms; r1 = [R_Flag]; r1 |= 0x8000; //Delay66ms [R_Flag] = r1; retf; L_NonTo66ms: r1 = [R_Flag]; r1 &= 0x7fff; [R_Flag] = r1; retf; //=================================================== //函数:F_Delay55ms //语法:调用 //描述:延时55毫秒 //参数:无 //返回:无 //=================================================== .public F_Delay55ms; F_Delay55ms: r1 = [R_DelayTime]; cmp r1,0x37; jb L_NonTo55ms; r1 = [R_Flag]; r1 |= 0x8000; [R_Flag] = r1; retf; L_NonTo55ms: r1 = [R_Flag]; r1 &= 0x7fff; [R_Flag] = r1; retf; //=================================================== //函数:F_Delay25ms //语法:调用 //描述:延时25毫秒 //参数:无 //返回:无 //=================================================== .public F_Delay25ms; F_Delay25ms: r1 = [R_DelayTime]; cmp r1,0x19; jb L_NonTo25ms; r1 = [R_Flag]; r1 |= 0x8000; [R_Flag] = r1; retf; L_NonTo25ms: r1 = [R_Flag]; r1 &= 0x7fff; [R_Flag] = r1; retf; //=================================================== //函数:F_Delay10ms //语法:调用 //描述:延时10毫秒 //参数:无 //返回:无 //=================================================== .public F_Delay10ms; F_Delay10ms: r1 = [R_DelayTime]; cmp r1,0x0a; jb L_NonTo10ms; r1 = [R_Flag]; r1 |= 0x8000; [R_Flag] = r1; retf; L_NonTo10ms: r1 = [R_Flag]; r1 &= 0x7fff; [R_Flag] = r1; retf; //=================================================== //函数:F_Delay5ms //语法:调用 //描述:延时5毫秒 //参数:无 //返回:无 //=================================================== .public F_Delay5ms; F_Delay5ms: r1 = [R_DelayTime]; cmp r1,0x06; jb L_NonTo5ms; r1 = [R_Flag]; r1 |= 0x8000; [R_Flag] = r1; retf; L_NonTo5ms: r1 = [R_Flag]; r1 &= 0x7fff; [R_Flag] = r1; retf; //======================== 延时程序结束 ================================== //================================= 数据处理程序开始 ================================= //=================================================== //函数:F_LookGetObjData //语法:调用 //描述:获得颜色、外型、水平方向的数值、 // 垂直方向的数值、空间的远近的参数 //参数:无 //返回:无 //=================================================== .public F_LookGetObjData; F_LookGetObjData: r1 = [R_ObjNum]; r1 &= 0x07; [R_ObjNum] = r1; r1 = [R_ObjNum]; cmp r1,0x01; je F_LookGetOneObjData; cmp r1,0x02; je F_LookGetTwoObjData; cmp r1,0x03; je F_LookGetThrObjData; cmp r1,0x04; je F_LookGetFourObjData; cmp r1,0x05; je F_LookGetFiveObjData; cmp r1,0x06; je F_LookGetSixObjData; cmp r1,0x07; je F_LookGetSevenObjData; retf; //=================================================== //函数:F_LookGetOneObjData //语法:调用 //描述:获得一个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetOneObjData: call F_LookGetObj1stData; retf; //=================================================== //函数:F_LookGetTwoObjData //语法:调用 //描述:获得二个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetTwoObjData: call F_LookGetObj1stData; call F_LookGetObj2ndData; retf; //=================================================== //函数:F_LookGetThrObjData //语法:调用 //描述:获得三个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetThrObjData: call F_LookGetObj1stData; call F_LookGetObj2ndData; call F_LookGetObj3rdData; retf; //=================================================== //函数:F_LookGetFourObjData //语法:调用 //描述:获得四个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetFourObjData: call F_LookGetObj1stData; call F_LookGetObj2ndData; call F_LookGetObj3rdData; call F_LookGetObj4thData; retf; //=================================================== //函数:F_LookGetFiveObjData //语法:调用 //描述:获得五个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetFiveObjData: call F_LookGetObj1stData; call F_LookGetObj2ndData; call F_LookGetObj3rdData; call F_LookGetObj4thData; call F_LookGetObj5thData; retf; //=================================================== //函数:F_LookGetSixObjData //语法:调用 //描述:获得六个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetSixObjData: call F_LookGetObj1stData; call F_LookGetObj2ndData; call F_LookGetObj3rdData; call F_LookGetObj4thData; call F_LookGetObj5thData; call F_LookGetObj6thData; retf; //=================================================== //函数:F_LookGetSevenObjData //语法:调用 //描述:获得七个目标物体 //参数:无 //返回:无 //=================================================== F_LookGetSevenObjData: call F_LookGetObj1stData; call F_LookGetObj2ndData; call F_LookGetObj3rdData; call F_LookGetObj4thData; call F_LookGetObj5thData; call F_LookGetObj6thData; call F_LookGetObj7thData; retf; //=================================================== //函数:F_LookGetObj1stData //语法:调用 //描述:获得第一个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj1stData; F_LookGetObj1stData: call F_GetObj1stData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookGetObj2ndData //语法:调用 //描述:获得第二个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj2ndData; F_LookGetObj2ndData: call F_GetObj2ndData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookGetObj3rdData //语法:调用 //描述:获得第三个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj3rdData; F_LookGetObj3rdData: call F_GetObj3rdData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookGetObj4thData //语法:调用 //描述:获得第四个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj4thData; F_LookGetObj4thData: call F_GetObj4thData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookGetObj5thData //语法:调用 //描述:获得第五个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj5thData; F_LookGetObj5thData: call F_GetObj5thData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookGetObj6thData //语法:调用 //描述:获得第六个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj6thData; F_LookGetObj6thData: call F_GetObj6thData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookGetObj7thData //语法:调用 //描述:获得第七个目标物体的数据 //参数:无 //返回:无 //=================================================== .public F_LookGetObj7thData; F_LookGetObj7thData: call F_GetObj7thData; call F_LookCheckTheObj; retf; //=================================================== //函数:F_LookCheckTheObj //语法:调用 //描述:获得在合适的范围内的颜色、外型、远近的数值 //参数:无 //返回:无 //=================================================== .public F_LookCheckTheObj; F_LookCheckTheObj: // r1 = [R_CenterX]; // cmp r1,0x30; // jb L_LookNotRightShape; // r1 = [R_CenterX]; // cmp r1,0x70; // jae L_LookNotRightShape; // r1 = [R_CenterY]; // cmp r1,0x1d; // jb L_LookNotRightShape; // r1 = [R_CenterY]; // cmp r1,0x5a; // jae L_LookNotRightShape; r1 = [R_Shape]; cmp r1,0x00; je L_LookNotRightShape; r1 = [R_Shape]; cmp r1,0x05; jae L_LookNotRightShape; r1 = [R_AreaH]; cmp r1,0x01; jb L_LookNotRightShape; L_LookHaveFoundTheObj: r1 = [R_PreAreaH]; cmp r1,0x00; je L_Fund1stObj; r1 = [R_AreaH]; cmp r1,[R_PreAreaH]; jb L_LookNotRightShape; L_Fund1stObj: r1 = [R_Color]; [R_PreColor] = r1; r1 = [R_Shape] [R_PreShape] = r1; r1 = [R_AreaH]; [R_PreAreaH] = r1; r1 = [R_CompX]; [R_PreCompX] = r1; r1 = [R_CompY]; [R_PreCompY] = r1; r1 = [R_SeekFlag]; r1 |= 0x01; [R_SeekFlag] = r1; retf; L_LookNotRightShape: retf; //================================ Master.asm 结束 =============================