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

📄 123.lst

📁 凌阳单片机对语音的处理和调用
💻 LST
📖 第 1 页 / 共 4 页
字号:
                     <      	// End Table
                            	
                            	.public  T_SACM_A1600_Table;
                            	.public  F_SACM_DVR1600_Init_;		// Hardware Setting
                            	.public _IRQ2;
                            	
                            	// Hasc_Kernel.asm reference Function
                            	.external F_SACM_DVR1600_Init;			   //这个初始化,好象.asm文件中有的
                            	.external F_SACM_DVR1600_IRQ_ServiceLoop;  //怎么没有看到啊?
                            	.external F_SACM_DVR1600_ServiceLoop;      //执行DVR1600解码或编码操作
                            	.external F_SACM_DVR1600_Volume;           //设定DVR1600的播放音量
                            	.external F_SACM_DVR1600_Status;           //获取当前DVR1600录放音的状态
                            	.external F_SACM_DVR1600_Pause;            //暂停播放
                            	.external F_SACM_DVR1600_Resume;           //继续播放
                            	
                            	.external HASC_FIFO;
                            	.external HascDEC_FIFO_PTR;
                            	.external _StatusData;
                            	//.external _aaaa;
                            	// Purpose:  DVR1600 Demo program for SPT6604
                            	//        :  It can control Volume and VoiceIndex by Key.
                            	
                            	
                            	//---------------------------
                            	//语音播放时用到的单元
00000174                    	.RAM
00000174 00 00              	DataRomAddr:       .DW     0;
00000175 00 00              	SegDataRomAddr:       .DW     0;
00000176 00 00              	W_InterRAM_Ptr:    .DW     0;
00000177 00 00              	DataFlag:	   .DW	   0;
                            	
                            	
                            	//-----------------------------
                            	//程序调用他时候给的2个值单元地址
00000178                    	.RAM
00000178 00 00              	R_SongIndex:    .DW     0;
00000179 00 00              	R_Volume:       .DW     0;
                            	
                            	
                            	
                            	
                            	//.PUBLIC 	F_SACM_DVR1600_SendDAC
                            	//F_SACM_DVR1600_SendDAC: .PROC
                            	
00009B05                    	.CODE
                            	//.PUBLIC _FSpeech
                            	// _F_Speech: .proc_
                            	.public _InilSpeech
                            		_InilSpeech: .proc
00009B05 88 DA              			PUSH BP to [sp];
00009B06 08 0B 01 00        			BP=sp+1;
00009B08 03 92              			R1=[BP+3];
00009B09 19 D3 78 01        	        [R_SongIndex] = R1;	       //歌曲索引为0        
00009B0B 04 92              	        R1=[BP+4];                //歌曲的音量
00009B0C 19 D3 79 01        	        [R_Volume]=R1;
                            	        
                            	        //---IO口设置
00009B0E 11 93 0A 70        	 		R1 = [P_IOC_Dir];
00009B10 09 A3 40 00        	 		R1|=0x40;
00009B12 19 D3 0A 70        	        [P_IOC_Dir] = R1;           // IOC  OutPut Mode
                            	         
00009B14 11 93 08 70        	        R1=[P_IOC_Data];
00009B16 09 A3 40 00        	        R1|=0x40;
00009B18 19 D3 08 70        			[P_IOC_Data]=R1;            //IOC  输出高电压
                            			 
                            			//---设置音量(0-3)共4级
00009B1A 11 93 79 01        			R1=[R_Volume];
00009B1C 40 F0 D9 99        	        CALL F_SACM_DVR1600_Volume;
                            	        
                            	//?Go_play:	 	 	
00009B1E 40 92              	        R1 = 0;
00009B1F 19 D3 77 01        	        [DataFlag] = R1;           //数据标志为0
00009B21 02 25              	        R2 -= R2;            
00009B22 1A D5 76 01        		    [W_InterRAM_Ptr] = R2;
                            		     
                            		     //---取语音索引号
00009B24 11 93 78 01        		     R1=[R_SongIndex];
                            		     
00009B26 0D 9B 9F 94        	  	     BP =offset T_SACM_A1600_Table;
00009B28 01 0B              	         BP+ =R1;
00009B29 C5 9A              	         BP=[BP];
                            	         
                            		     
                            		     //---For  manual mode,  fill the first 32 Data to HASC_FIFO
00009B2A 09 93 01 00        	          R1 = HASC_FIFO;
00009B2C D5 94              	          R2 = [BP++];
00009B2D C5 96              	          R3 = [bp]
00009B2E 5B 97              	          R3 = R3 LSL 4
00009B2F 5B 97              	          R3 = R3 LSL 4
00009B30 4B 97              	          R3 = R3 LSL 2                         //左移10位
00009B31 1B D7 75 01        	          [SegDataRomAddr] = R3
                            	?_FillHASC_FIFO:
00009B33 0E BD FF 03        	          Sr &= 0x3FF			                //段寄存器  有程序段CS和数据段DS
00009B35 03 AD              	          SR |= R3
00009B36 E2 98              	          R4 =DS: [R2];
00009B37 41 04              	          R2 +=1
00009B38 04 4E              	          JNZ		?L_Nover
00009B39 0B 07 00 04        	          R3 +=0x400
00009B3B 1B D7 75 01        	          [SegDataRomAddr] = R3                //以上是放音频的基地址
                            	?L_Nover:
00009B3D 40 F0 CE 9B        		  	 CALL  F_ChangeHighLowByte;           //将R4的高、低位互掉
00009B3F D1 D8              	          [R1++] = R4;         
00009B40 09 43 21 00        	          CMP R1,HASC_FIFO+32;
00009B42 50 4E              	          JNZ  ?_FillHASC_FIFO;//以上可能是从新放置音频信息吧?
00009B43 1A D5 74 01        	          [DataRomAddr] = R2;
                            	
                            	        
00009B45 09 93 FF FF        		  R1 = 0xFFFF;				// Voice Index , 0xFFFF means manual mode
00009B47 42 94              		  R2 = 2;				// Volume Index, 0 ~ 3 .
00009B48 40 F0 FC 96        		  call F_SACM_DVR1600_Init;//这个初始化,好象.asm文件中有的
                            		  
00009B4A 88 98              	        pop BP from[sp];
00009B4B 90 9A              	    RETF;
                            	.endp
                            	
                            	
                            	//---------------------------------
                            	//    解码播放语音的主循环程序
                            	//---------------------------------
                            	?_play_loop:  
                            	?_wait_music_end:
00009B4C 40 F0 9B 96        			CALL	F_SACM_DVR1600_ServiceLoop;   //03080  执行DVR1600解码或编码操作
00009B4E 40 F0 99 9B        			CALL 	F_FillRingBuf;				// For manual mode, users must fill the HASC_DEC_FIFO
00009B50 40 F0 E1 99        			CALL	F_SACM_DVR1600_Status;       //获取当前DVR1600录放音的状态
00009B52 41 C2              	    	test R1, 0x0001;       			       //Voice end ?
00009B53 48 4E              	    	JNZ ?_wait_music_end;
00009B54 42 C2              	    	test R1,0x0002;				       // Voice Pause
00009B55 4A 4E              	        JNZ  ?_wait_music_end;
                            	//        call F_Stop_Play;          		       //Stop playback DVR1600
                            	
                            	//----------------------------
                            	//定时器和ADC的设置
                            	//----------------------------
                            	//-----------------------------------------------------
                            	// Set Fosc , TimerA or TimerB , TimerData , P_DAC_Ctrl
                            	//-----------------------------------------------------
                            	F_SACM_DVR1600_Init_:                    //这个初始化,好象.asm文件中有的
                            	
00009B56 40 F1              	        INT OFF;
                            	
00009B57 09 93 81 00        	        R1 = 0x0081;
00009B59 11 A3 15 70        	        R1|=[P_SystemClock];
00009B5B 19 D3 15 70        	        [P_SystemClock] = R1;               //Set High Speed and (/1)
                            	        	
00009B5D 44 92              	        R1 = 0x04;
00009B5E 19 D3 11 70        	        [P_IntClr]= R1;
                            	
00009B60 09 93 00 D5        	        R1 = 0xD500;                            //Base 32768Hz
00009B62 19 D3 1A 70        	        [P_Tmr_Ctrl] = R1;
                            	
00009B64 09 93 FC FF        	        R1 = 0xFFFC;                       // 8.192k
00009B66 19 D3 1B 70        	        [P_TmrA_Data] = R1;                //Set play rate
00009B68 19 D3 1C 70        	        [P_TmrA_Load] = R1;
                            	
00009B6A 44 92              	        R1 = 0x0004;
00009B6B 11 A3 10 70        	        R1|=[P_Int];
00009B6D 19 D3 10 70        	        [P_Int] = R1;                      //Enabel TimerA INT
                            	
00009B6F 09 93 00 02        	        R1 = 0x0200;                            //From DACO pin
                            	//        R1|=[P_DtmfTone];
00009B71 19 D3 22 70        	        [P_DtmfTone] = R1;
                            	
00009B73 41 92              			R1 = 1
                            	//		R1|=[0x7026];
00009B74 19 D3 26 70        			[0x7026] = R1
00009B76 41 F1              	        INT IRQ;                                //IRQ ON;
                            			
00009B77 90 9A              		RETF;	
                            	
                            	
                            	//*************************************************************************************
                            	// Stop MIDI : Clear Flag, Disable TimerA and INT
                            	// 停止播放音乐时,清楚相应的标志位
                            	//*************************************************************************************
                            	.public _T_Stop_Play
                            	        _T_Stop_Play: .proc
00009B78 A8 DA              	        push R1,R5 to [sp];
00009B79 44 92              	        R1 = 0x4;
00009B7A 19 D3 11 70        	        [P_IntClr] = R1;
                            	
00009B7C 40 92              	        R1 = 0x0000;                            //Disable TimerA
00009B7D 19 D3 1A 70        	        [P_Tmr_Ctrl] = R1;
                            	
00009B7F 11 93 10 70        	        R1 = [P_Int];
00009B81 09 B3 FB FF        	        R1 &= 0xFFFF - 0x0004;
00009B83 19 D3 10 70        	        [P_Int] = R1;                           //Disable INT
                            	
00009B85 11 93 22 70        			r1= [0x7022] 
00009B87 09 B3 FF FC        	    	r1 &= 0xfcff  //关闭0x7022(P_DtmfTone_Def)REG  的  DACEN  和 Tone_DACO  两位
00009B89 19 D3 22 70        	    	[0x7022] =r1
                            	    	
00009B8B 11 93 26 70        	    	r1= [0x7026]   
00009B8D 09 B3 FE FF        	    	r1 &= 0xfffe   //U_AFECtrl->B.EN_DAC2 =0;
00009B8F 19 D3 26 70        	    	[0x7026] = r1
                            	    
00009B91 11 93 08 70        	    	r1= [P_IOC_Data]   
00009B93 09 B3 F7 FF        	    	r1 &=0xfff7    //话机 通过PD。3关闭功放POS机 PC。6
00009B95 19 D3 08 70        	    	[P_IOC_Data] = r1 
                            	    
00009B97 A8 90              			pop R1,R5 from [sp];
00009B98 90 9A              		retf
                            		.endp
                            	
                            	// ------------------------------------------------------------------------------------------------------------//
                            	// Purpose: In the manual mode, user must fill the ring buf after each F_SACM_DVR1600_ServiceLoop is over
                            	//	    HascDEC_FIFO_PTR will show the message that the next "Data Pointer"
                            	//	    And user must fill the HascDEC_FIFO according to HascDEC_FIFO_PTR
                            	//	    To make encode data is compatible with SPDC, the ending code is 0xFF,0xFF,0xFF 
                            	// ------------------------------------------------------------------------------------------------------------//
                            	F_FillRingBuf:       
                            	
                            	.public _FillRamBuf
                            		_FillRamBuf: .proc
00009B99 A8 DA              		push R1,R5 to [sp];

⌨️ 快捷键说明

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