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

📄 ad977acn_driver.asm

📁 AD977acn的应用电路及源码
💻 ASM
字号:
//============================================================
//	文件名称:	AD977ACN_Driver.asm
//	功能描述:	AD977ACN底层驱动程序
//	维护记录:	2006-3-29	v1.0		Edit by 小丑 
//	Mz出品  时序经典
//============================================================
	.DEFINE		P_IOA_Data				0x7000
	.DEFINE		P_IOA_Buffer			0x7001
	.DEFINE		P_IOA_Dir				0x7002
	.DEFINE		P_IOA_Attrib			0x7003
	.DEFINE		P_IOA_Latch				0x7004

	.DEFINE		P_IOB_Data				0x7005
	.DEFINE		P_IOB_Buffer			0x7006
	.DEFINE		P_IOB_Dir				0x7007
	.DEFINE		P_IOB_Attrib			0x7008
//**********************************************************************************//
//定义用于与AD977ACN接口的端口是哪一组,便于修改端口
.DEFINE	Port_Data	P_IOB_Data
.DEFINE Port_Buffer	P_IOB_Buffer
.DEFINE Port_Dir	P_IOB_Dir
.DEFINE	Port_Attrib	P_IOB_Attrib
//定义各个与AD977ACN上的控制、数据端口连接的具体的SPCE061A口位
.DEFINE M_DATA		0x0001
.DEFINE	M_CLK		0x0002
.DEFINE M_BUSY		0x0004
.DEFINE M_CS		0x0008
.DEFINE	M_RC		0x0010
.DEFINE	M_SYNC		0x0020

.CODE
//========================================================
//	汇编格式:	_AD977ACN_Initial
//	C格式:		void AD977ACN_Initial(void)
//	实现功能:	初始化端口
//	入口参数:	无
//	出口参数:	无
//	破坏寄存器:r1
//========================================================
.PUBLIC _AD977ACN_Initial
_AD977ACN_Initial:
	r1 = [Port_Dir]
	r1 = r1|(M_CLK+M_CS+M_RC)			//CLK、CS、RC输出
	r1 = r1&(~(M_DATA+M_BUSY+M_SYNC))	//DATA、BUSY、SYNC输入
	[Port_Dir] = r1
	
	r1 = [Port_Attrib]					//
	r1 = r1|(M_CLK+M_CS+M_RC)			//
	r1 = r1&(~(M_DATA+M_BUSY+M_SYNC))	//
	[Port_Attrib] = r1
	
	r1 = [Port_Buffer]					//注意,本例中所有输出时全是操作Buffer寄存器
	r1 = r1|(M_RC+M_BUSY)				//RC初始输出高电平,BUSY初始上拉输入
	r1 = r1&(~(M_DATA+M_CLK+M_CS+M_SYNC))//DATA、SYNC下拉输入、CLK、CS输出低电平
	[Port_Buffer] = r1
	retf
//========================================================
//	汇编格式:	_AD977ACN_Read
//	C格式:		unsigned int AD977ACN_Read(void)
//	实现功能:	启动一次AD转换,并读取转换值
//	入口参数:	无
//	出口参数:	读取的AD转换值
//	破坏寄存器:r1
//========================================================
.PUBLIC _AD977ACN_Read
_AD977ACN_Read:
	push r2,r5 to [sp]
	r2 = [Port_Buffer]
	r2 = r2&(~M_RC)			
	[Port_Buffer] = r2					//RC置低,启动转换
AD977ACN_WaitBY_low:
	r3 = [Port_Data]	
	test r3,M_BUSY						//判断BUSY是否为低
	jnz AD977ACN_WaitBY_low				//如为高则跳转
	nop
	r2 = r2|M_RC						
	[Port_Buffer] = r2					//RC置高
AD977ACN_WaitBY_hight:
	r3 = [Port_Data]
	test r3,M_BUSY						//判断BUSY是否为高,即转换是否完成?
	jz AD977ACN_WaitBY_hight			//否则跳转
	r4 = 16								//R4置16,循环16次
	r3 = r2|M_CLK						//利用r3和r2中CLK值高低的不同,置给IO,产生CLK信号
AD977ACN_Loop:
	[Port_Buffer] = r3					//CLK置高
	r1 = r1 lsl 1						//抽个空先把r1左移一位
	[Port_Buffer] = r2					//CLK置低
	r5 = [Port_Data]					//读取DATA值(仅是一位)
	test r5,M_DATA						//判断DATA的当前位是否为0
	jz AD977ACN_DataLow					//为零则跳转
	r1 = r1|0x0001						//否则就将r1最低位置1
AD977ACN_DataLow:
	r4 = r4-1							
	jnz AD977ACN_Loop
	pop r2,r5 from [sp]
	retf

⌨️ 快捷键说明

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