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

📄 9851_asm.asm

📁 AD公司的DDS芯片AD9851的驱动
💻 ASM
字号:
.include hardware.inc
.define _9851_PORT P_IOA_Data

.ram
.var FQ_UD,W_CLK,_9851_RESET,INDATA; 
.var FQ_UD1,W_CLK1,_9851_RESET1,INDATA1;
.var FQ_UD2,W_CLK2,_9851_RESET2,INDATA2;
.code

.public _Reset9851
_Reset9851:.proc
	push r2,r3 to [sp];
//_9851_RESET_UP
	r2=[_9851_PORT];
	r2|=[_9851_RESET];
	[_9851_PORT]=r2;
//_9851_RESET_UP	
//_9851_RESET_DOWN
	r2=[_9851_PORT];
	r3=[_9851_RESET];
	r3^=0xffff;
	r2&=r3;
	[_9851_PORT]=r2;
//_9851_RESET_DOWN
	pop r2,r3 from [sp];
	retf;
.endp

.public _Reset9851_Dual
_Reset9851_Dual:.proc
	push r2,r4 to [sp];
	//_9851_RESET_UP
	r2=[_9851_PORT];
	r2|=[_9851_RESET1];
	r2|=[_9851_RESET2];
	[_9851_PORT]=r2;
//_9851_RESET_UP	
//_9851_RESET_DOWN
	r2=[_9851_PORT];
	r3=[_9851_RESET1];
	r4=[_9851_RESET2];
	r3^=0xffff;
	r4^=0xffff;
	r2&=r3;
	r2&=r4;
	[_9851_PORT]=r2;
	pop r2,r4 from [sp];
//_9851_RESET_DOWN
.endp	


.public _ini_AD9851_Serial
_ini_AD9851_Serial:.proc
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	r2=[bp+8];
	r3=[bp+9];
	r4=[bp+10];
	[_9851_RESET]=r1;
	[W_CLK]=r2;
	[FQ_UD]=r3;
	[INDATA]=r4;
	call _Reset9851;
	pop r1,r5 from [sp];
	retf;
.endp

.public _ini_AD9851_Serial_Dual
_ini_AD9851_Serial_Dual:.proc
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	r2=[bp+8];
	r3=[bp+9];
	r4=[bp+10];
	[_9851_RESET1]=r1;
	[W_CLK1]=r2;
	[FQ_UD1]=r3;
	[INDATA1]=r4;
	r1=[bp+11];
	r2=[bp+12];
	r3=[bp+13];
	r4=[bp+14];
	[_9851_RESET2]=r1;
	[W_CLK2]=r2;
	[FQ_UD2]=r3;
	[INDATA2]=r4;
	call _Reset9851_Dual;
	pop r1,r5 from [sp];
	retf;
.endp

.public _ini_AD9851_Parallel
_ini_AD9851_Parallel:.proc
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	r2=[bp+8];
	r3=[bp+9];
	r4=[bp+10];
	[_9851_RESET]=r1;
	[W_CLK]=r2;
	[FQ_UD]=r3;
	[INDATA]=r4;
	call _Reset9851
	pop r1,r5 from [sp];
	retf;
.endp


.public _AD9851_ParallelSend
_AD9851_ParallelSend:.proc
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	//FQ_UD_DOWN
	r2=[_9851_PORT];
	r3=[FQ_UD];
	r3^=0xffff;
	r2&=r3;
	[_9851_PORT]=r2;
	r4=0;
	//FQ_UD_DOWN	
send_data_loop:
	//W_CLK_DOWN
	r2=[_9851_PORT];
	r3=[W_CLK];
	r3^=0xffff;
	r2&=r3;
	[_9851_PORT]=r2;
	//W_CLK_DOWN
//senddata
	r2=[_9851_PORT];
	r2&=0xff00;
	r2|=[r1];
	[_9851_PORT]=r2;
//senddata
	//W_CLK_UP
	r2=[_9851_PORT];
	r2|=[W_CLK];
	[_9851_PORT]=r2;
	//W_CLK_UP		
	r4+=1;
	r1+=1;
	cmp r4,5;
	jne send_data_loop
	//FQ_UD_UP
	r2=[_9851_PORT];
	r2|=[FQ_UD];
	[_9851_PORT]=r2;
	//FQ_UD_UP	
	pop r1,r5 from [sp];
	retf;
.endp

.public _AD9851_SerialSenddata
_AD9851_SerialSenddata:.proc
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	r2=r1;
	r1+=5;
	call FQ_UD_DOWN;
Serial_senddata_loop1:	
//send_data
	r4=0x0001;
	cmp r1,r2;
	je Serial_senddata_end;
	r1-=1;
	r3=[r1];
Serial_senddata_loop2:
	test r3,r4;
	jz send_0;
send_1:
	call W_CLK_DOWN;
	call INDATA_UP;
	call W_CLK_UP;
	jmp one_bit_send_end;
send_0:
	call W_CLK_DOWN;
	call INDATA_DOWN;
	call W_CLK_UP;	
one_bit_send_end:
	r4=r4 lsl 1;
	cmp r4,0x0100;
	je Serial_senddata_loop1;
	jmp Serial_senddata_loop2;
//send_data_end
Serial_senddata_end:
	call FQ_UD_UP;
	pop r1,r5 from [sp];
	retf;
.endp


.public _AD9851_SerialSenddata_Dual
_AD9851_SerialSenddata_Dual:.proc
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	r2=r1;
	r2+=2;
	r1+=6;
	call FQ_UD_DOWN_DUAL;
Serial_senddata_loop1_DUAL:	
//send_data
	r4=0x0001;
	cmp r1,r2;
	je Serial_senddata_end_DUAL;
	r1-=1;
	r3=[r1];
Serial_senddata_loop2_DUAL:
	test r3,r4;
	jz send_0_DUAL;
send_1_DUAL:
	call W_CLK_DOWN_DUAL;
	call INDATA_UP_DUAL;
	call W_CLK_UP_DUAL;
	jmp one_bit_send_end_DUAL;
send_0_DUAL:
	call W_CLK_DOWN_DUAL;
	call INDATA_DOWN_DUAL;
	call W_CLK_UP_DUAL;	
one_bit_send_end_DUAL:
	r4=r4 lsl 1;
	cmp r4,0x0100;
	je Serial_senddata_loop1_DUAL;
	jmp Serial_senddata_loop2_DUAL;
//send_data_end
Serial_senddata_end_DUAL:
	r3=[bp+7];
	r4=r3+1;
	r1=[r3];
	r2=[r4];
	r4=0x0001;
Serial_senddata_loop3_DUAL:
	call W_CLK_DOWN_DUAL;
	r3=[_9851_PORT];
	test r1,r4;
	jz firstis0
firstis1:
	r3|=[INDATA1];
	test r2,r4;
	jz secendis0;
	r3|=[INDATA2];
	jmp Serial_senddata_loop3_DUAL_end;
firstis0:
	r5=[INDATA1];
	r5^=0xffff;
	r3&=r5;
	test r2,r4;
	jz secendis0;
	r3|=[INDATA2];
	jmp Serial_senddata_loop3_DUAL_end;	
secendis0:
	r5=[INDATA2];
	r5^=0xffff;
	r3&=r5;
Serial_senddata_loop3_DUAL_end:
	[_9851_PORT]=r3;
	nop;
	call W_CLK_UP_DUAL;
	r4=r4 lsl 1;
	cmp r4,0x0100;
	jne Serial_senddata_loop3_DUAL;
	call FQ_UD_UP_DUAL;
	pop r1,r5 from [sp];
	retf;
.endp

.PUBLIC _SetToSerialMode
_SetToSerialMode:.proc
	call W_CLK_DOWN;
	call W_CLK_UP;
	nop;
	call FQ_UD_DOWN;
	call FQ_UD_UP;
	retf;
.endp

.PUBLIC _SetToSerialMode_Dual
_SetToSerialMode_Dual:.proc
	call _Reset9851_Dual;
	call W_CLK_DOWN_DUAL;
	call W_CLK_UP_DUAL;
	nop;
	call FQ_UD_DOWN_DUAL;
	call FQ_UD_UP_DUAL;
	retf;
.endp

.public _add_array
_add_array:.proc 
	push r1,r5 to [sp];
	bp=sp+1;
	r1=[bp+7];
	r2=[bp+8];
	bp=r1;
	r3=[bp+2];
	r3=r3 lsl 4;
	r3=r3 lsl 4;
	r3+=[bp+3];
	r4=[bp];
	r4=r4 lsl 4;
	r4=r4 lsl 4;
	r4+=[bp+1];
	r3+=r2;
	r4+=0,carry;
	r1=r3;
	r1&=0x00ff;
	[bp+3]=r1;
	r3=r3 lsr 4;
	r3=r3 lsr 4;
	[bp+2]=r3;
	r1=r4;
	r1&=0x00ff;
	[bp+1]=r1;
	r4=r4 lsr 4;
	r4=r4 lsr 4;
	[bp]=r4;
	pop r1,r5 from [sp];
	retf;
.endp

.public _ini_system
_ini_system:.proc
	push r1,r5 to [sp];
	r1=0xffff;
	[P_IOA_Dir]=r1;
	[P_IOA_Attrib]=r1;
	r1=0x00ff;
	[P_IOA_Data]=r1;
//	r1=0xe0;
//	[P_SystemClock]=r1;
	pop r1,r5 from [sp];
	retf;
.endp

.public FQ_UD_DOWN
FQ_UD_DOWN:.proc
	push r2,r3 to [sp];
	//FQ_UD_DOWN
	r2=[_9851_PORT];
	r3=[FQ_UD];
	r3^=0xffff;
	r2&=r3;
	[_9851_PORT]=r2;
	//FQ_UD_DOWN
	pop r2,r3 from [sp];
	retf;
.endp

.public FQ_UD_UP	
FQ_UD_UP:.proc
	push r2 to [sp];
	//FQ_UD_UP
	r2=[_9851_PORT];
	r2|=[FQ_UD];
	[_9851_PORT]=r2;
	//FQ_UD_UP
	pop r2 from [sp];
	retf;
.endp

.public W_CLK_DOWN
W_CLK_DOWN:
	push r2,r3 to [sp];
	//W_CLK_DOWN
	r2=[_9851_PORT];
	r3=[W_CLK];
	r3^=0xffff;
	r2&=r3;
	[_9851_PORT]=r2;
	//W_CLK_DOWN
	pop r2,r3 from [sp];
	retf;
.endp

.public W_CLK_UP
W_CLK_UP:
	push r2 to [sp];
	//W_CLK_UP
	r2=[_9851_PORT];
	r2|=[W_CLK];
	[_9851_PORT]=r2;
	//W_CLK_UP	
	pop r2 from [sp];
	retf;
.endp

.public INDATA_DOWN
INDATA_DOWN:
	push r2,r3 to [sp];
	//INDATA_DOWN
	r2=[_9851_PORT];
	r3=[INDATA];
	r3^=0xffff;
	r2&=r3;
	[_9851_PORT]=r2;
	//INDATA_DOWN
	pop r2,r3 from [sp];
	retf;
.endp

.public INDATA_UP
INDATA_UP:
	push r2 to [sp];
	//INDATA_UP
	r2=[_9851_PORT];
	r2|=[INDATA];
	[_9851_PORT]=r2;
	//INDATA_UP	
	pop r2 from [sp];
	retf;
.endp


.public FQ_UD_DOWN_DUAL
FQ_UD_DOWN_DUAL:.proc
	push r2,r4 to [sp];
	//FQ_UD_DOWN
	r2=[_9851_PORT];
	r3=[FQ_UD1];
	r4=[FQ_UD2];
	r3^=0xffff;
	r4^=0xffff;
	r2&=r3;
	r2&=r4;
	[_9851_PORT]=r2;
	//FQ_UD_DOWN
	pop r2,r4 from [sp];
	retf;
.endp

.public FQ_UD_UP_DUAL	
FQ_UD_UP_DUAL:.proc
	push r2 to [sp];
	//FQ_UD_UP
	r2=[_9851_PORT];
	r2|=[FQ_UD1];
	r2|=[FQ_UD2];
	[_9851_PORT]=r2;
	//FQ_UD_UP
	pop r2 from [sp];
	retf;
.endp

.public W_CLK_DOWN_DUAL
W_CLK_DOWN_DUAL:
	push r2,r4 to [sp];
	//W_CLK_DOWN
	r2=[_9851_PORT];
	r3=[W_CLK1];
	r4=[W_CLK2];
	r3^=0xffff;
	r4^=0xffff;
	r2&=r3;
	r2&=r4;
	[_9851_PORT]=r2;
	//W_CLK_DOWN
	pop r2,r4 from [sp];
	retf;
.endp

.public W_CLK_UP_DUAL
W_CLK_UP_DUAL:
	push r2 to [sp];
	//W_CLK_UP
	r2=[_9851_PORT];
	r2|=[W_CLK1];
	r2|=[W_CLK2]
	[_9851_PORT]=r2;
	//W_CLK_UP	
	pop r2 from [sp];
	retf;
.endp

.public INDATA_DOWN_DUAL
INDATA_DOWN_DUAL:
	push r2,r4 to [sp];
	//INDATA_DOWN
	r2=[_9851_PORT];
	r3=[INDATA1];
	r4=[INDATA2];
	r3^=0xffff;
	r4^=0xffff;
	r2&=r3;
	r2&=r4;
	[_9851_PORT]=r2;
	//INDATA_DOWN
	pop r2,r4 from [sp];
	retf;
.endp

.public INDATA_UP_DUAL
INDATA_UP_DUAL:
	push r2 to [sp];
	//INDATA_UP
	r2=[_9851_PORT];
	r2|=[INDATA1];
	r2|=[INDATA2];
	[_9851_PORT]=r2;
	//INDATA_UP	
	pop r2 from [sp];
	retf;
.endp

⌨️ 快捷键说明

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