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

📄 mainsrc.asm

📁 DTMF信号产生原程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
		MAR			* , AR2  
		MAR			*- , AR3  
ROW_RELPEAK_CHECK_0:
		BANZ		ROW_RELPEAK_CHECK , *- , AR1  
		
		;如果两个数据以上的超过最大值,则不正确,有一个超过,是因为自身的数据没有设为0  		
		MAR			* , AR2
		BANZ		NO_DTMF_SEND ,* ,AR1  

;检测列
        LAR			AR3 , #3H
        LAR			AR1 , #(GOERTZEL_EN+0FH)
        LAR			AR2 , #1H        
        
		LT			DEC_COL_MAX_EN     ;DEC_COL_MAX_EN*#2ABH
		MPY			#2ABH		
COL_RELPEAK_CHECK:
		MAR			*- , AR1     ;其他能量值*
		LACC		*- ,11 , AR3
		SPAC
		BCND		COL_RELPEAK_CHECK_0 , LT 		
		
		MAR			* , AR2  
		MAR			*- , AR3  
COL_RELPEAK_CHECK_0:
		BANZ		COL_RELPEAK_CHECK , *- , AR1  
		
		;如果两个数据以上的超过最大值,则不正确,有一个超过,是因为自身的数据没有设为0  		
		MAR			* , AR2
		BANZ		NO_DTMF_SEND ,* ,AR1  		
		
		
;第一个音频的二次滤波 
;*****************************************************************    
GOERTZEL_2:
		MAR			* , AR3
		
		LACC		#COSF_PARA+8H , 0
		ADD			DEC_ROW_INDEX
		SACL		MAIN_TEMP_0 		
		LAR			AR3 , MAIN_TEMP_0
		LAR			AR7 , #(VAL_SLOTBUF_LONG-1)
		LAR			AR1 , #(GOERTZEL_EN+13H)
		LAR			AR2 , GOERTZEL_DEC_DATA_PTR   
		
		LT			* , AR2 
		LACC		DIV_VALUE_VAR   
		BCND        GOERTZEL_2_ROW_ADD1 , NEQ
				 
GOERTZEL_2_ROW_ADD:		
		LACC		*+ , VAL_VALUE_DIV , AR1    		
		SUB			*- , 16
		MPY			*
		LTD			* , AR3
		LTA			* , AR1
		APAC
		APAC
		SACH		*+ , 0 , AR7
		BCND		GOERTZEL_2_ROW_COMPUTE_EN , OV     ;如果溢出则开始计算能量值
		BANZ		GOERTZEL_2_ROW_ADD , *- , AR2 
		B           GOERTZEL_2_ROW_COMPUTE_EN
		
GOERTZEL_2_ROW_ADD1:  
		LACC		*+ , VAL_VALUE_DIV1 , AR1    		
		SUB			*- , 16
		MPY			*
		LTD			* , AR3
		LTA			* , AR1
		APAC
		APAC
		SACH		*+ , 0 , AR7
		BCND		GOERTZEL_2_ROW_COMPUTE_EN , OV     ;如果溢出则开始计算能量值
		BANZ		GOERTZEL_2_ROW_ADD1 , *- , AR2 
		
GOERTZEL_2_ROW_COMPUTE_EN:
		LAR			AR2 , MAIN_TEMP_0
		LAR			AR1 , #(GOERTZEL_EN+13H)
		
		CALL        FUN_GOERTZEL_EN , * , AR2
		
		LT			DEC_ROW_MAX_EN  
		MPY			#0C00H  
		;MPY			#0600H     
		SPAC		
		SPAC
		BCND		CHANGE_DECT_SEC , GEQ
		
		;第二个音频的二次滤波
		;**********************************************************
		MAR			* , AR3 		
		LACC		#COSF_PARA+0CH , 0
		ADD			DEC_COL_INDEX
		SACL		MAIN_TEMP_0 		
		LAR			AR3 , MAIN_TEMP_0
		LAR			AR7 , #(VAL_SLOTBUF_LONG-1)
		LAR			AR1 , #(GOERTZEL_EN+11H)
		LAR			AR2 , GOERTZEL_DEC_DATA_PTR     
		
		LT			* , AR2 
		
		LACC		DIV_VALUE_VAR   
		BCND        GOERTZEL_2_COL_ADD1 , NEQ
		 		    		 
GOERTZEL_2_COL_ADD:		
		LACC		*+ , VAL_VALUE_DIV , AR1
		SUB			*- , 16
		MPY			*
		LTD			* , AR3
		LTA			* , AR1
		APAC
		APAC
		SACH		*+ , 0 , AR7
		BCND		GOERTZEL_2_COL_COMPUTE_EN , OV     ;如果溢出则开始计算能量值
		BANZ		GOERTZEL_2_COL_ADD , *- , AR2 
		
		B           GOERTZEL_2_COL_COMPUTE_EN 
		 
GOERTZEL_2_COL_ADD1: 	  
		LACC		*+ , VAL_VALUE_DIV1 , AR1  

		SUB			*- , 16
		MPY			*
		LTD			* , AR3
		LTA			* , AR1
		APAC
		APAC
		SACH		*+ , 0 , AR7
		BCND		GOERTZEL_2_COL_COMPUTE_EN , OV     ;如果溢出则开始计算能量值
		BANZ		GOERTZEL_2_COL_ADD1 , *- , AR2 		

	
GOERTZEL_2_COL_COMPUTE_EN:
		LAR			AR2 , MAIN_TEMP_0
		LAR			AR1 , #(GOERTZEL_EN+11H)
		
		CALL        FUN_GOERTZEL_EN , * , AR2
		
		LT			DEC_COL_MAX_EN  
		MPY			#0C00H    
		;MPY			#0600H 
		SPAC		
		SPAC  
		BCND		CHANGE_DECT_SEC , GEQ
      	
       	;确认的确检测到数据,则取出数据进行处理 
       	;***************************************************
       	CALL        FUN_CHECK_NUM , *       	
       	B           NEXT_TIMESLOT_DEC  
       	
CHANGE_DECT_SEC: ;二次滤波不成工进行第二次计算  
		LACC        DIV_VALUE_VAR
		BCND		NO_DTMF_SEND , NEQ
		
		SPLK        #1, DIV_VALUE_VAR    
		B           FUN_DEC_DTMF
       	
       	
NO_DTMF_SEND:  
		;没有检测到数据进行的处理
		CALL		 FUN_NO_DTMF_PRO, * 
		
NEXT_TIMESLOT_DEC:       
        LACC		DEC_TIMESLOT_INDEX
        ADD			#1H 
        SACL		DEC_TIMESLOT_INDEX
        LT			DEC_TIMESLOT_INDEX
        MPY			#VAL_SLOTBUF_LONG
        PAC			
        ADD			#0B21H , 0   
        SACL		GOERTZEL_DEC_DATA_PTR  ;初始化下一检测时隙指针  
        SPLK        #0 , DIV_VALUE_VAR
        LACC		DEC_TIMESLOT_INDEX  ;1F,指示当前检测时隙指针
        SUB			#20H
        BCND		FUN_DEC_DTMF ,NEQ   

		;所有缓冲区数据检测完成  ,初始化重新开始获取数据
		;***********************************************  
		SPLK        #0H , DIV_VALUE_VAR    
        SPLK 		#0FFFFH , REC_DEC_STATE
        SPLK 		#RECDATA_BUF , GOERTZEL_DEC_DATA_PTR
        SPLK 		#0H , DEC_TIMESLOT_INDEX  
        SPLK 		#VAL_SLOTBUF_LONG , REC_PCMDATA_COUNT
        SPLK 		#RECDATA_BUF , REC_FTS_PCMDATA_PTR 
        SPLK 		#0H , BEGIN_REC_PCMDATA_FLAG  
             
        B			MAIN_LOOP 
       	RET    
  

 ;异步串口处理函数       	
FUN_ASP_PRO:   ;02CD
	    IN 			MAIN_TEMP_0 , IOSR
	    LACC		MAIN_TEMP_0
	    AND			#800H , 0    ;如果发送为空 	    
	    BCND        _ASP_PRO_END , EQ

_ASP_PRO_0:		
		;!DEBUG  
		;SPLK        #55H , MAIN_TEMP_0
		;OUT         MAIN_TEMP_0  ,ADTR 
		;RET
		
		LACC    	ASP_SEND_W_PTR
		SUB			ASP_SEND_R_PTR  
		BCND		_ASP_SEND , NEQ   ;发送缓冲区为空 
		RET      
		
_ASP_SEND:		
		LACC        ASP_SEND_R_PTR  
		ADD			#ASP_SEND_BUF
		SACL		ASP_POINTER
		LAR			AR1 ,  ASP_POINTER   ;读出一个字写入串口中
		OUT			* , ADTR
		
		LACC        ASP_SEND_R_PTR
		ADD			#1H
		AND			#3FH
		SACL		ASP_SEND_R_PTR	   	
_ASP_PRO_END:
		RET   
**********************************************************   
***FUN_CHECK_NUM:  
***根据输入,检测出当前发送的DTMF数据,并将该数据写入指定的时隙中
***输入变量DEC_ROW_INDEX ,DEC_COL_INDEX  
***高时隙在低位,低时隙为高位
**********************************************************		
FUN_CHECK_NUM:   
		MAR 		* , AR1 
		
		;查询找出DTMF数据   
		;*************************************************
		LT			DEC_ROW_INDEX
		MPY			#4H
		PAC			
		ADD			DEC_COL_INDEX 
		ADD			#GET_DTMF_TBL  		
		TBLR		MAIN_TEMP_0   
		
		;取出当前检测的时隙数字    
		;*************************************************
		LACC		DEC_TIMESLOT_INDEX
		ADD			#TIME_SLOT_TBL , 0 
		TBLR		MAIN_TEMP_1 		
		
		LACC		MAIN_TEMP_1 
		ADD			#RECIEVE_DTMF_BUF 
		SACL		MAIN_TEMP_2
		LAR			AR1 , MAIN_TEMP_2  
		
		;查询是否已经收到过同样的DTMF
		LACC		* 
		AND			#0FFH
		SUB			MAIN_TEMP_0	
		BCND		_CHECK_NUM_SEC , EQ   
		
		;第一次检测到DTMF保存DTMF
		LACC		MAIN_TEMP_0
		SACL		*  
		B           _CHECK_NUM_END 
		 
		
_CHECK_NUM_SEC:	
		;已经收到过数据了,最高位为1则表示已经收到数据 并正在发送改数据
		BIT			* , 0
		BCND		_CHECK_NUM_END , TC 
		
		LACC		MAIN_TEMP_0   
		SACL		MAIN_TEMP_3
		OR 			#8000H
		SACL		*  
				
		;发送DTMF到交换矩阵
		;************************************************* 		
		LACC		MAIN_TEMP_0 , 4
		AND 		#0F0H
		OR 			#08H
		SACL		MAIN_TEMP_0	
		
		LACC		MAIN_TEMP_1
		SFR
		ADD			#SEND_DTMF_BUF
		SACL		MAIN_TEMP_2
		
		LAR			AR1 ,  MAIN_TEMP_2 
		LACC		*     	  
		
		;低时隙,高8位,高时隙低8位       
		BIT		    MAIN_TEMP_1 , 15
		BCND		DTMF_IN_HIGH , TC 
				
		AND			#0FFH
		SACL		MAIN_TEMP_2  
		LACC		MAIN_TEMP_0 , 8
		ADD         MAIN_TEMP_2  		
		SACL		*    
		B           _CHECK_NUM_CLR_DTMF
		
DTMF_IN_HIGH:  		
		AND			#0FF00H
		OR			MAIN_TEMP_0
		SACL		*  		
		
_CHECK_NUM_CLR_DTMF:
		;将NO_DTMF_COUNT计数清零
		LACC		MAIN_TEMP_1   
		ADD			#NO_DTMF_COUNT
		SACL		MAIN_TEMP_2
		LAR			AR1 , MAIN_TEMP_2
		
		LACC		*  
		SACL		MAIN_TEMP_2
		
		LACC		#0H 
		SACL		* , 0;  		 
		                     
		B			_CHECK_NUM_END
		;!DEBUG
		LACC        ASP_SEND_W_PTR  
		ADD			#ASP_SEND_BUF
		SACL		ASP_POINTER
		LAR			AR1 ,  ASP_POINTER  
		LACC		MAIN_TEMP_1 
		AND			#0FFH
		SACL		*
		
		LACC        ASP_SEND_W_PTR
		ADD			#1H
		AND			#3FH
		SACL		ASP_SEND_W_PTR  
		
		LACC        ASP_SEND_W_PTR  
		ADD			#ASP_SEND_BUF
		SACL		ASP_POINTER
		LAR			AR1 ,  ASP_POINTER   
		LACC		MAIN_TEMP_3 
		AND			#0FFH
		SACL		*
		
		LACC        ASP_SEND_W_PTR
		ADD			#1H
		AND			#3FH
		SACL		ASP_SEND_W_PTR
		
		LACC        ASP_SEND_W_PTR  
		ADD			#ASP_SEND_BUF
		SACL		ASP_POINTER
		LAR			AR1 ,  ASP_POINTER   
		LACC		MAIN_TEMP_2 
		SACL		*
		
		LACC        ASP_SEND_W_PTR
		ADD			#1H
		AND			#3FH
		SACL		ASP_SEND_W_PTR  
		
_CHECK_NUM_END:			
		RET  

;**********************************************************
;***清除1f指定的时隙的数据缓冲区为0 ,并设定发送到cpu的清    
;***没有检测到数据,而且一次发送已经完成后就清除发送   
;***#acc0 缓冲的数据低4位为mfc  
;**********************************************************
FUN_NO_DTMF_PRO:
        ;取出当前检测的时隙数字    
		;*************************************************    
		MAR			* , AR1 
		LACC		DEC_TIMESLOT_INDEX
		ADD			#TIME_SLOT_TBL , 0 
		TBLR		MAIN_TEMP_1   
		
		LACC		MAIN_TEMP_1 
		ADD			#RECIEVE_DTMF_BUF 
		SACL		MAIN_TEMP_2
		LAR			AR1 , MAIN_TEMP_2  
		
		LACC		*
		SUB			#07FFFH
		BCND		NO_DTMF_END , EQ  
		
		;统计NO_DTMF_COUNT
		LACC		MAIN_TEMP_1 
		ADD			#NO_DTMF_COUNT 
		SACL		MAIN_TEMP_3
		LAR			AR1 , MAIN_TEMP_3  
		
		LACC		*
		ADD			#1H
		SACL		*
		
		SUB			#VAL_NO_DTMF_MAX
		BCND		NO_DTMF_END , LT 
		
		LAR			AR1 , MAIN_TEMP_2
		 
		;将数据设为没有发送数据
		LACC		#07FFFH
		SACL		* 
		
		;发送DTMF到交换矩阵
		;*************************************************	
		LACC		MAIN_TEMP_1
		SFR

⌨️ 快捷键说明

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