📄 ad977acn_driver.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 + -