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

📄 dvr.asm

📁 使用GPTC6604做的一个录放音DEMO
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		call	F_SACM_DVR1600_Stop
		R1 = 0
		[RW_Flag] = R1
		R1 = [RW_Long]
		[RW_Length] = R1
		GoTo		?l_PlayRecordLoop





////////////////////////////////////////////////
//         keyscand and play internal ROM loop
///////////////////////////////////////////////

?L_PlayInternalROM:
		R1 = 0
		[RW_Flag] = R1
		R1 = 0xF00
		[P_DtmfTone] = R1
		
		R4 = 0xFFFF-0x1c4  // 0x103  is 12k;  0x138 is 10k
								//0xc4 is 16k     ;0x186 is 8k  0x30d is 4k
							
				//clock 29MHz/8   Rosc = 68K
				//0x1c4 8k 0x192  9k 0x16a 10k  0x149 11k  0x12e 12k
				// b5  a4
				
		[P_TmrA_Data] = R4
		[P_TmrA_Load] = R4
		Call	F_Play_Initial		
		r1 = 15;
		call		F_SACM_DVR1600_Volume;			// set Volume ,15 max;
		r1 = 0;
		r2 = 3;
		R3 = 0
		call		F_SACM_DVR1600_Play;
		JMP		?PlayDVR1600ROMLoop



?l_PlayROMLoop:		

		R1 = 0
		[RW_Flag] = R1
		call	F_Play_Initial
		r1 = 15;
		call		F_SACM_DVR1600_Volume;			// set Volume ,15 max;
		r1 = 0;
		r2 = 3;
		R3 = 3
		call		F_SACM_DVR1600_Play;
?PlayDVR1600ROMLoop:
		r1 =	0x55aa
		[P_Watchdog_Clr] = r1						//Reset watchdog
        call    F_SACM_DVR1600_ServiceLoop;			//write data from ADC to SDARM;
		R1 = [RW_Flag]
		Test R1, C_EndAddrFlag
        JNZ		?AutoStopPlayROM
		call	F_KeyScand
		R1 = [RW_KeyCode]
		test    R1,0xFF
		JZ		?PlayDVR1600ROMLoop
?ExitPlayROMLoop:
		call	F_SACM_DVR1600_Stop
		GoTo		MainLoop
?AutoStopPlayROM:
		call	F_SACM_DVR1600_Stop
		R1 = 0
		[RW_Flag] = R1
		R1 = [RW_Long]
		[RW_Length] = R1
		
		GoTo		?l_PlayROMLoop





////////////////////////////////////////////////
//         keyscand and play S530 loop
///////////////////////////////////////////////

?L_PlayS530:
			nop
			nop
			nop
//   		INT OFF;
//   		R1	=	0;
//  		[SpeechIndex]	= R1
//		[SpeedIndex] 	= R1 //MaxSpeedHalf;   				
//  	    [R_SACM_S530_Play_Flag]	=	r1;
//  		R1		= 9;
//   		[VolumeIndex]  	= R1;	
//	    // R1		= Auto
//	     R1		= Manual;
//    	[Mode]			= R1;
//    	CMP  			R1,	Auto;
//    	JE             ?L_DealAutoMode;
//?L_DealManualMode:    	
////---------------------------------------;
//        call      F_System_Initial;
//		call      F_SACM_S530_Initial;
//		R1		=	0;
//    	call      F_USER_S530_SetStartAddr;                 // in sacm_user.asm 
//		
//	    r1		=-1;
//        r2      =1;
//        r3      =3
//		call      F_SACM_S530_Play;	//Manual_Mode_Index=-1
//     	Goto 	       ?PlayS530main_loop;	     
//     	   
//?L_DealAutoMode:       
////-----------------------------------------
//      	call      F_System_Initial;
//		call      F_SACM_S530_Initial;	
//// R1 = SpeechIndex
//// R2 = DAC
//// R3 = Ramp 	
//
//        r1		=0;
//        r2      =1;
//        r3      =3
//	
//		call      F_SACM_S530_Play;
//
////------------------------------------------       
//?PlayS530main_loop:              
//		r1 =	0x55aa
//		[P_Watchdog_Clr] = r1						//Reset watchdog
//        call        	F_SACM_S530_ServiceLoop;
//        Call        	F_System_ServiceLoop; // Service loop for Key Scanning
//		call	F_KeyScand
//		R1 = [RW_KeyCode]
//		test    R1,0xFF
//		JZ		?PlayS530main_loop
//
//		call	F_SACM_DVR1600_Stop
//?ExitPlayS530:
		goto 		MainLoop















//////////////////////////////////////////////////////////////////////////////////////////////////////////////	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
F_Record_Initial:
	    R1 =B_Enable32768+B_Strong32768+B_128Hz+B_8KHz
        [P_TimeBaseSet] = R1;                   		
		R4 = 0xFFFF-0x1c4   // 0x103  is 12k;  0x138 is 10k
							//0xc4 is 16k     ;0x186 is 8k  0x30d is 4k
					//clock 29MHz/8  Rosc = 68K
					//0x1c4 8k 0x192  9k 0x16a 10k  0x149 11k  0x12e 12k
		[P_TmrA_Data] = R4
		[P_TmrA_Load] = R4
        CALL    F_MassErase;
		R1 = 0x00
		[P_DtmfTone] = R1
		[RW_Length] = R1   		// user length, may not use
		[FlashAddrHi] = R1
		R2 = 0x12 //1倍			//0x01//1/2			//0x16//5倍			//可以根据需要调节放大倍数
		[P_AgcCtrl] = R2
		r2 = 0x80
        [P_AdcCtrl] = R2;
		SR &=0x3FF
		R1 = B_RecordBeginAddr+4    //DVR1600 length 0~3 byte
									//the start address of data will begin from fourth byte
		[RW_Address] = R1
//		r1 = [P_Int];
//		R1| = B_TmrAInt;
//		[P_Int]=R1;
		r1 = [P_Int];
		R1| = B_Irq4;
		[P_Int]=R1;

		RETF
//////////////////////////////////////////////////////////	
//////////////////////////////////////////////////////////
F_Play_Initial:
	    R1 =B_Enable32768+B_Strong32768+B_128Hz+B_16KHz
        [P_TimeBaseSet] = R1;                   		
		R4 = 0xFFFF-0x0c4   // 0x103  is 12k;  0x138 is 10k
							//0xc4 is 16k     ;0x186 is 8k  0x30d is 4k
							//clock 29MHz/8  Rosc = 68K
							//0x1c4 8k 0x192  9k 0x16a 10k  0x149 11k  0x12e 12k
		[P_TmrA_Data] = R4
		[P_TmrA_Load] = R4
		R1 = 0xF00
		[P_DtmfTone] = R1
		SR &=0x3FF 
		R1 = B_RecordBeginAddr
		[RW_Address] = R1
		r1 = [P_Int];
		R1| = B_Irq4;
//		R1| = B_Irq2;
		[P_Int]=R1;
		RETF
//
//--------------------------------------------
F_KeyScand:
		PUSH	R1,R5 TO [SP]
		R1 = [RW_DebounceReg]
		JZ	L_DetectKey
		JMP	L_ExitKeyScand
L_DetectKey:
		R1 = [P_IOA_Data]
		R1 = [P_IOA_Data]
		R1 = [P_IOA_Data]
		R1 &= 0xFF
		cmp	R1,0xFF
		jne	L_KeyPressIn
		JMP	L_ExitKeyScand
L_KeyPressIn:
		R2 = [RW_KeyBufOld]
		JNZ		L_AfterDebounceReg
		[RW_KeyBufOld] = R1
		R1 =15
		[RW_DebounceReg] = R1
		JMP		L_ExitKeyScand
L_AfterDebounceReg:
		R3 =50
		[RW_DebounceReg] = R3
		R3 = 0
		[RW_KeyBufOld] =R3
		R3 =R1 XOR 0xFF
		CMP R1,R2
		JE		L_HaveKeyScand
L_ExitKeyScand:
		R3 = 0
L_HaveKeyScand:
		[RW_KeyCode]=R3
		POP	R1,R5 FROM [SP]
		RETF	





//******	for IRQ
//
// ======================================================================================
.text	
_FIQ:
_IRQ1:
_IRQ3:
_IRQ5:
_IRQ7:
		PUSH	R1,R5 TO [SP]
		R1 = 0xFFFF
		[P_IntClr] = R1
		POP	R1,R5 FROM [SP]
		RETI
_IRQ2:        
	
		push R1,R5 to [SP];
		R1 = [P_IOB_Data]
		R1 ^=0x0F
		[P_IOB_Data] = R1
 //   	call F_ISR_Service_SACM_DVR1600_FG;  // use 8k samples
//		call F_ISR_Service_SACM_S530;
		R1 = B_TmrAInt;
		[P_IntClr] = R1;
		pop R1,R5 from [sp];
		RETI;         
_IRQ4:
		PUSH	R1,R5 TO [SP]
		R1 = B_Irq4
		[P_IntClr] = R1
    	call F_ISR_Service_SACM_DVR1600_FG;  // use 8k samples
		POP	R1,R5 FROM [SP]
		RETI
_IRQ6:
		PUSH	R1,R5 TO [SP]
		R1 = B_Irq6
		[P_IntClr] = R1
		R1 = [RW_DebounceReg]
		JZ	L_ExitDec
		R1-=1
		[RW_DebounceReg] = R1
L_ExitDec:
		POP	R1,R5 FROM [SP]
		RETI		

⌨️ 快捷键说明

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