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

📄 system.asm

📁 台湾凌阳十六位单片机简单的A_D D_A的程序
💻 ASM
字号:
.include hardware.inc

.CODE 
K_V: .DW 0x6D4B,0x694C,0x6465,0x5E9A,0x4A80,0x3FC4,0x331C,0x2462;
D_V: .DW 0xDEB1,0xDB9D,0xD84D,0xD4E4,0xCBF6,0xC882,0xC553,0xC2A4;
F_V: .DW 0x0035,0x0004,0x0005,0x0006,0x0014,0x0015,0x0016,0x0024,0x0025,0x0026,0x0035,0x0034,0x0036,0x0007,0x0017,0x0027;
.RAM
.VAR dtmf_count;
.VAR KF1,DF10,DF11,KF2,DF20,DF21;

.TEXT
.public _Init_System
_Init_System:
		PUSH R1 TO [SP]
		R1 = 0x0000;
		[dtmf_count] = R1;
		POP R1 FROM [SP]
		RETF
		 
.public _Open_Int
_Open_Int:
		PUSH BP TO [SP]
		BP = SP + 1
		PUSH R1 TO [SP]
		R1 = [BP+3]
		[P_INT_Ctrl] = R1
//		INT FIQ,IRQ
		POP R1 FROM [SP]
		POP BP FROM [SP]
		RETF
		
.public _Close_Int
_Close_Int:
		INT OFF
		RETF
		
.public _Init_IO
_Init_IO:
		PUSH BP TO [SP]
		BP = SP + 1
		PUSH R1,R2 TO [SP]
		R1 = [BP + 3]
		R2 = [BP + 4]
		[R1] = R2			//Io_dir
		R2 = [BP + 5]
		R1 += 1
		[R1] = R2			//Io_Attrib
		R2 = [BP + 6]
		R1 = R1 - 3
		[R1] = R2			//Io_Data
		POP R1,R2 FROM [SP]
		POP BP FROM [SP]
		RETF

.public _Send_7219
_Send_7219:
		PUSH BP TO [SP]
		BP = SP + 1
		PUSH R1 TO [SP]
		R1 = [BP + 3]
		PUSH R1 TO [SP]
		PUSH R1 TO [SP]
		R1 = [P_IOB_Data]
		R1 &= 0xFFFB
		[P_IOB_Data] = R1
		R1 = 0x00D9
		[P_SIO_Ctrl] = R1
		[P_SIO_Start] = R1
		
		POP R1 FROM [SP]
		R1 &= 0xFF00
		R1 = R1 LSR 4
		R1 = R1 LSR 4		
		CALL _S_Send
		
		POP R1 FROM [SP]
		R1 &= 0x00FF
		CALL _S_Send
		
		[P_SIO_Stop] = R1		
		R1 = [P_IOB_Data]
		R1 |= 0x0004
		[P_IOB_Data] = R1
		POP R1 FROM [SP]
		POP BP FROM [SP]
		RETF
				
.public _S_Send
_S_Send:
		[P_SIO_Data] = R1
	S_Busy:
		R1 = 0x0080
		TEST R1,[P_SIO_Start]
		JNZ S_Busy
		RETF
		
.public _WatchDog_Clear
_WatchDog_Clear:
		PUSH R1 TO [SP]
		R1 = 0x0001
		[P_Watchdog_Clear] = R1
		POP R1 FROM [SP]
		RETF
		
.public _SystemClock
_SystemClock:
		PUSH R1 TO [SP]
		R1 = 0x001B
		[P_SystemClock] = R1
		POP R1 FROM [SP]
		RETF

.public _Init_ADC
_Init_ADC:
		PUSH R1 TO [SP]
		R1 = 0x0000                  //选择通道LINE_IN为IOA0
		[P_ADC_MUX_Ctrl] = r1
    	R1 = 0x003D	                 //允许A/D转换
    	[P_ADC_Ctrl] = r1
    	POP R1 FROM [SP] 
    	RETF

.public _Init_DAC
_Init_DAC:
		PUSH R1 TO [SP]
    	R1 = 0x00A0	                 //允许A/D转换
    	[P_DAC_Ctrl] = r1
    	POP R1 FROM [SP] 
    	RETF
    	
.public _Set_Sample_Rate
_Set_Sample_Rate:
		PUSH BP to [SP]
		BP = SP+1
		PUSH R1 TO [SP]
		R1 = 0x0030				 // 时钟频率为CLKA的Fosc/2
		[P_TimerA_Ctrl] = R1	
		R1 = [BP+3]
		[P_TimerA_Data] = R1
		POP R1 FROM [SP]
		POP BP FROM [SP]
		RETF
		
.public	_DELAY
_DELAY:
		PUSH R2 TO [SP]
		R2 = 0x0001
	DELAY_LP:
		[P_Watchdog_Clear] = R2
		R1 -= 1
		CMP R1,0
		JNE DELAY_LP
		POP R2 FROM [SP]
		RETF

.public _Dial
_Dial:
		PUSH BP TO [SP]
		INT OFF
		BP = SP+1;
		PUSH R1,R2 TO [SP]
		R1 = [BP+3];
		R2 = F_V;
		R2 += R1;
		R1 = [R2];
		PUSH R1 TO [SP]
		R1 &= 0x00F0;
		R1 = R1 LSR 4;
		R2 = K_V;
		R2 = R2+R1;
		R2 = [R2];		
		[KF1] = R2;
		R2 = D_V;
		R2 = R2+R1;
		R2 = [R2];
		[DF10] = R2;
		R2 = 0x0000;
		[DF11] = R2;
		POP R1 FROM [SP]
		R1 &= 0x000F;
		R2 = K_V;
		R2 += R1;
		R2 = [R2];
		[KF2] = R2;
		R2 = D_V;
		R2 += R1;
		R2 = [R2];
		[DF20] = R2;
		R2 = 0x0000;
		[DF21] = R2;
		R1 = 1000;
		[dtmf_count] = R1;
		INT IRQ;
		
	Dial_LP:
		R1 = 0x0001;
		[P_Watchdog_Clear] = R1;
		R2 = 0x0000;
		CMP R2,[dtmf_count];
		JB Dial_LP
		
		POP R1,R2 FROM [SP]
		POP BP FROM [SP]
		RETF
		
.public _Init_UART
_Init_UART:
		PUSH BP TO [SP]
		BP = SP +1
		PUSH R1,R2 TO [SP]
		R1 = [BP + 3]
		R2 = R1
		R1 &= 0x00FF
		[P_UART_Command1] = R1
		R2 &= 0xFF00
		R2 = R2 LSR 4
		R2 = R2 LSR 4
		[P_UART_Command2] = R2
		R1 = [BP + 4]
		R2 = R1
		R1 &= 0x00FF
   		[P_UART_BaudScalarLow] = R1
   		R2 = R2 LSR 4
   		R2 = R2 LSR 4
   		[P_UART_BaudScalarHigh] = R2
   		POP R1,R2 FROM [SP]
   		POP BP FROM [SP]
   		RETF
   		
.public _Send_UART
_Send_UART:
		PUSH R2 TO [SP]
	_SU_LP:
		R2 = 0x0040					//Ready to send data
		TEST R2,[P_UART_Command2]
		JZ _SU_LP
   		[P_UART_Data] = R1 
   		R1 = 0x0100
   		CALL _DELAY
   		POP R2 FROM [SP] 	
   		RETF
		
.public _IRQ1
_IRQ1:
		PUSH R1,R5 TO [SP]
		R1 = 0x0001;
		[P_Watchdog_Clear] = R1;
		R1 = 0x1000
		[P_INT_Clear] = R1
		
		R2 = 0x0001;
	ADC_LP:
 		[P_Watchdog_Clear] = R2
 		R1 = [P_ADC_Ctrl]
 		TEST R1,0x8000
 		JZ ADC_LP
 		R1 = [0x7014]
		[P_DAC1] = R1;	
		POP R1,R5 FROM [SP]
		RETI

	

⌨️ 快捷键说明

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