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

📄 a1600.lst

📁 凌阳单片机对语音的处理和调用
💻 LST
📖 第 1 页 / 共 5 页
字号:
                     <      	.external _RES_A04_ENC_SA;
                     <      	.external _RES_A04_ENC_EA;
                     <      	.external _RES_A05_ENC_SA;
                     <      	.external _RES_A05_ENC_EA;
                     <      	.external _RES_A06_ENC_SA;
                     <      	.external _RES_A06_ENC_EA;
                     <      	.external _RES_A07_ENC_SA;
                     <      	.external _RES_A07_ENC_EA;
                     <      	.external _RES_A08_ENC_SA;
                     <      	.external _RES_A08_ENC_EA;
                     <      	.external _RES_A09_ENC_SA;
                     <      	.external _RES_A09_ENC_EA;
                     <      	
                     <      	// 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 _toteldata;
                            	//.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
                            	
0000996D                    	.CODE
                            	//.PUBLIC _FSpeech
                            	// _F_Speech: .proc_
                            	.public _InilSpeech
                            		_InilSpeech: .proc
                            			//PUSH BP to [sp];
0000996D A0 D8              			PUSH R1 ,R4 to [SP] 
0000996E 88 DA              	        PUSH BP to [SP]
0000996F 08 0B 01 00        			BP=sp+1;
00009971 07 92              			R1=[BP+7];
00009972 19 D3 78 01        	        [R_SongIndex] = R1;	       //歌曲索引为0        
00009974 08 92              	        R1=[BP+8];                //歌曲的音量
00009975 19 D3 79 01        	        [R_Volume]=R1;
                            	        
                            	        //---IO口设置
00009977 11 93 0A 70        	 		R1 = [P_IOC_Dir];
00009979 09 A3 40 00        	 		R1|=0x40;
0000997B 19 D3 0A 70        	        [P_IOC_Dir] = R1;           // IOC  OutPut Mode
                            	         
0000997D 11 93 08 70        	        R1=[P_IOC_Data];
0000997F 09 A3 40 00        	        R1|=0x40;
00009981 19 D3 08 70        			[P_IOC_Data]=R1;            //IOC  输出高电压
                            			 
                            			//---设置音量(0-15)共16级
00009983 11 93 79 01        			R1=[R_Volume];
00009985 40 F0 60 99        	        CALL F_SACM_DVR1600_Volume;
                            	        
                            	//?Go_play:	 	 	
00009987 40 92              	        R1 = 0;
00009988 19 D3 77 01        	        [DataFlag] = R1;           //数据标志为0
0000998A 02 25              	        R2 -= R2;            
0000998B 1A D5 76 01        		    [W_InterRAM_Ptr] = R2;
                            		     
                            		     //---取语音索引号
0000998D 11 93 78 01        		     R1=[R_SongIndex];
                            		     
0000998F 0D 9B 26 94        	  	     BP =offset T_SACM_A1600_Table;
00009991 01 0B              	         BP+ =R1;
00009992 C5 9A              	         BP=[BP];
                            	         
                            		     
                            		     //---For  manual mode,  fill the first 32 Data to HASC_FIFO
00009993 09 93 01 00        	          R1 = HASC_FIFO;
00009995 D5 94              	          R2 = [BP++];
00009996 C5 96              	          R3 = [bp]
00009997 5B 97              	          R3 = R3 LSL 4
00009998 5B 97              	          R3 = R3 LSL 4
00009999 4B 97              	          R3 = R3 LSL 2                         //左移10位
0000999A 1B D7 75 01        	          [SegDataRomAddr] = R3
                            	?_FillHASC_FIFO:
0000999C 0E BD FF 03        	          Sr &= 0x3FF			                //段寄存器  有程序段CS和数据段DS
0000999E 03 AD              	          SR |= R3
0000999F E2 98              	          R4 =DS: [R2];
000099A0 41 04              	          R2 +=1
000099A1 04 4E              	          JNZ		?L_Nover
000099A2 0B 07 00 04        	          R3 +=0x400
000099A4 1B D7 75 01        	          [SegDataRomAddr] = R3                //以上是放音频的基地址
                            	?L_Nover:
000099A6 40 F0 3C 9A        		  	 CALL  F_ChangeHighLowByte;           //将R4的高、低位互掉
000099A8 D1 D8              	          [R1++] = R4;         
000099A9 09 43 21 00        	          CMP R1,HASC_FIFO+32;
000099AB 50 4E              	          JNZ  ?_FillHASC_FIFO;//以上可能是从新放置音频信息吧?
000099AC 1A D5 74 01        	          [DataRomAddr] = R2;
                            	
                            	        
000099AE 09 93 FF FF        		  R1 = 0xFFFF;				// Voice Index , 0xFFFF means manual mode
000099B0 42 94              		  R2 = 2;				// Volume Index, 0 ~ 3 .
000099B1 40 F0 83 96        		  call F_SACM_DVR1600_Init;//这个初始化,好象.asm文件中有的
                            		  
000099B3 88 98              	        pop BP from[sp];
000099B4 A0 90              	        pop r1,r4 from[sp];
000099B5 90 9A              	    RETF;
                            	.endp
                            	
                            	
                            	//---------------------------------
                            	//    解码播放语音的主循环程序
                            	//---------------------------------
                            	?_play_loop:  
                            		 
                            	?_wait_music_end:
000099B6 40 F0 22 96        			CALL	F_SACM_DVR1600_ServiceLoop;   //03080  执行DVR1600解码或编码操作
000099B8 40 F0 07 9A        			CALL 	F_FillRingBuf;				// For manual mode, users must fill the HASC_DEC_FIFO
000099BA 40 F0 68 99        			CALL	F_SACM_DVR1600_Status;       //获取当前DVR1600录放音的状态
000099BC 41 C2              	    	test R1, 0x0001;       			       //Voice end ?
000099BD 48 4E              	    	JNZ ?_wait_music_end;
000099BE 42 C2              	    	test R1,0x0002;				       // Voice Pause
000099BF 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文件中有的
                            	//      // PUSH R1,R5 TO [SP]
                            	//        INT OFF;
                            	//	   R1 = 0x0081;
                            	//        [P_SystemClock] = R1;               //Set High Speed and (/1)
                            	//        R1 = 0x0080;
                            	//        //R1|=[P_SystemClock];
                            	//        [P_SystemClock] = R1;               //Set High Speed and (/1)
                            	//        	
                            	////        R1 = 0x04;
                            	////        [P_IntClr]= R1;
                            	//
                            	//        R1 = 0xD500;                            //Base 32768Hz
                            	//        [P_Tmr_Ctrl] = R1;
                            	//
                            	//        R1 = 0xFFFC;                       // 8.192k
                            	//        [P_TmrA_Data] = R1;                //Set play rate
                            	//        [P_TmrA_Load] = R1;
                            	//
                            	//        R1 = 0x0004;
                            	//        R1|=[P_Int];
                            	//        [P_Int] = R1;                      //Enabel TimerA INT
                            	//
                            	//        R1 = 0x0200;                            //From DACO pin
                            	////        R1|=[P_DtmfTone];
                            	//        [P_DtmfTone] = R1;
                            	//        
                            	//         r1= [0x7022] 
                            	//    r1 |= 0x0300  //OPEN 0x7022(P_DtmfTone_Def)REG  的  DACEN  和 Tone_DACO  两位
                            	//    [0x7022] =r1
                            	//
                            	//		
                            	//		r1= [0x7026]   
                            	//    	r1 |= 0x1   //U_AFECtrl->B.EN_DAC2 =1;
                            	//    	[0x7026] = r1
                            	//		
                            	//        INT IRQ;                                //IRQ ON;
                            	//	POP R1,R5 FROM [SP]	
                            	//	RETF;
                            	
                            	F_SACM_DVR1600_Init_:                    //这个初始化,好象.asm文件中有的
                            	
000099C0 40 F1              	        INT OFF;
                            	
000099C1 09 93 81 00        	        R1 = 0x0081;
000099C3 11 A3 15 70        	        R1|=[P_SystemClock];
000099C5 19 D3 15 70        	        [P_SystemClock] = R1;               //Set High Speed and (/1)
000099C7 09 93 80 00        	        R1=0x80;	
000099C9 19 D3 15 70        	        [P_SystemClock] = R1;               //Set High Speed and (/1)
                            	        	
000099CB 44 92              	        R1 = 0x04;
000099CC 19 D3 11 70        	        [P_IntClr]= R1;
                            	
000099CE 09 93 00 D5        	        R1 = 0xD500;                  

⌨️ 快捷键说明

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