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

📄 pni_driver.asm

📁 可以通过向电子指南针模组发送不同的命令字
💻 ASM
字号:
//======================================================
// 文件名称: PNI_Driver.asm
// 功能描述: PNI_11096底层驱动程序
// 维护记录: 2007-12-20 v1.0
// 注意事项: 
//======================================================
// IO port control registers
.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

.DEFINE	PORTA	0						// PortA PortB选择
.if PORTA
// redefine the I/O port for PNI_11096
.DEFINE D_Port_Data		P_IOA_Data		// 端口
.DEFINE D_Port_Buffer	P_IOA_Buffer
.DEFINE D_Port_Dir		P_IOA_Dir
.DEFINE D_Port_Attrib	P_IOA_Attrib
.else
.DEFINE D_Port_Data		P_IOB_Data
.DEFINE D_Port_Buffer	P_IOB_Buffer
.DEFINE D_Port_Dir		P_IOB_Dir
.DEFINE D_Port_Attrib	P_IOB_Attrib
.endif

.DEFINE		DRDY		0x0100
.DEFINE		RESET		0x0200
.DEFINE		SSNOT		0x0400
.DEFINE		MOSI		0x0800
.DEFINE		MISO		0x1000
.DEFINE		SCLK		0x2000

.CODE
M_Clr_IOPort: .macro
	r1 = [D_Port_Buffer]
	r1 &= 0x00ff
	[D_Port_Buffer] = r1
	.endm
M_Clr_RESET: .macro					
	r1 = [D_Port_Buffer]
	r1 &= ~RESET
	[D_Port_Buffer] = r1
	.endm
M_Set_RESET: .macro
	r1 = [D_Port_Buffer]
	r1 |= RESET
	[D_Port_Buffer] = r1
	.endm
M_Clr_SSNOT: .macro
	r1 = [D_Port_Buffer]
	r1 &= ~SSNOT
	[D_Port_Buffer] = r1
	.endm
M_Set_SSNOT: .macro
	r1 = [D_Port_Buffer]
	r1 |= SSNOT
	[D_Port_Buffer] = r1
	.endm
M_Clr_MOSI: .macro
	r1 = [D_Port_Buffer]
	r1 &= ~MOSI
	[D_Port_Buffer] = r1
	.endm
M_Set_MOSI: .macro
	r1 = [D_Port_Buffer]
	r1 |= MOSI
	[D_Port_Buffer] = r1
	.endm
M_Clr_SCLK: .macro
	r1 = [D_Port_Buffer]
	r1 &= ~SCLK
	[D_Port_Buffer] = r1
	.endm
M_Set_SCLK: .macro
	r1 = [D_Port_Buffer]
	r1 |= SCLK
	[D_Port_Buffer] = r1
	.endm

//======================================================
// 汇编格式:_F_PNI_11096_Init
// C   格式:void F_PNI_11096_Init(void);
// 实现功能:端口初始化
// 入口参数:无
// 出口参数:无
//======================================================
.PUBLIC _F_PNI_11096_Init
_F_PNI_11096_Init:
	r1 = [D_Port_Dir]
	r1 = r1 | (RESET + SSNOT + MOSI + SCLK)			// 用到的IO口设置为输出
	[D_Port_Dir] = r1

	r1 = [D_Port_Attrib]
	r1 = r1 | (RESET + SSNOT + MOSI + MISO + SCLK) 	// 用到的IO口设置为通向输出
	[D_Port_Attrib] = r1

	retf

//======================================================
// 汇编格式:_F_PNI_11096_Read
// C   格式:int F_PNI_11096_Read(unsigned int op);
// 实现功能:读x或y轴数据
// 入口参数:操作码
// 出口参数:x或y轴数据
//======================================================
.PUBLIC _F_PNI_11096_Read
_F_PNI_11096_Read:
	push bp to [sp]
	bp = sp + 4
	r3 = [bp]					// 得到函数参数
	r3 &= 0x00ff
	
	M_Clr_IOPort
	M_Clr_SSNOT
	M_Clr_RESET
	nop
	M_Set_RESET
	nop
	M_Clr_RESET					// 复位PNI11096
	
	r2 = 8
?SendCMD:
	test r3, 0x80
	jnz ?DataHigh
	M_Clr_MOSI
	jmp ?Next
?DataHigh:
	M_Set_MOSI
?Next:
	M_Set_SCLK
	nop
	M_Clr_SCLK
	r3 = r3 lsl 1
	r2 -= 1
	jnz ?SendCMD
	M_Clr_MOSI
	
?Wait:						// 等待指南针模块返回数据
	r2 = 0x0001
	[0x7012] = r2			// 清看门狗
	r2 = [D_Port_Data]
	test r2, DRDY
	jz ?Wait
	
	r2 = 16
	r4 = 0
?Read:						// 读取16位数据
	M_Set_SCLK
	r3 = [D_Port_Data]
	test r3, MISO
	jnz ?SetHigh
	jmp ?Save
?SetHigh:
	r4 |= 1
?Save:
	r4 = r4 lsl 1
	M_Clr_SCLK
	r2 -= 1	
	jnz ?Read	

	r1 = r4
	pop bp from [sp]
	retf

⌨️ 快捷键说明

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