📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -