📄 mainsrc.asm
字号:
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 + -