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

📄 master.asm

📁 用C编写基于凌阳SPCE061A芯片的图象识别模块可实现(1)获得数据并处理。(2)控制按扭KEY1
💻 ASM
📖 第 1 页 / 共 3 页
字号:
//==================================================================
//名称: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 + -