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

📄 master.asm

📁 基于16位单片机的c编程
💻 ASM
📖 第 1 页 / 共 3 页
字号:
//===================================================
//函数: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的读数据
//参数:无
//返回:无
//===================================================			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -