📄 dialer.asm
字号:
MOV Temp,Read_Data
MOV A,Read_Data
CJNE A,#0ffh,Run_Pare_Continue1
LJMP Program_END
Run_Pare_Continue1:
SWAP A
ANL A,#0FH
MOV Temp,a
RL A
MOV DPTR,#JMPTAB
JMP @A+DPTR
JMPTAB: AJMP JMPEND ;0
Compare_P: AJMP Compare_Para ;1
Jump_P: AJMP Jump_Para ;2
Get_Rest_P: AJMP Get_Rest_Para ;3
Dial_P: AJMP Dial_Para ;4
Off_Hook_P: AJMP Off_Hook_Para ;5
On_Hook_P: AJMP On_Hook_Para ;6
Dial_In_P: AJMP Dial_Input_Para ;7
Wait_P: AJMP Wait_Para ;8
Expand_P: AJMP Expand_Para ;9
Call_P: AJMP Call_Para ;A
Return_P: AJMP Return_Para ;B
Detect_P: AJMP Detect_Para ;C
Keep_P: AJMP Keep_Para ;D
Ring_P: AJMP Ring_Para ;E
Special_P: AJMP Special_Para ;F
JMPEND: LJMP Program_End
;*******************************************
Expand_Para:
; acall Sub_Expand
LJMP Run_EEPROM_Para
;*******************************************
Special_Para:
acall Special_Function
LJMP Run_EEPROM_Para
;*******************************************
Compare_Para:
acall Sub_Compare
LJMP Run_EEPROM_Para
;*******************************************
Jump_Para:
acall Sub_Jump
LJMP Run_EEPROM_Para
;*******************************************
Detect_Para:
acall Detect_Line_Status
LJMP Run_EEPROM_Para
;*******************************************
Get_Rest_Para:
INC Run_Address
MOV Config_Flag,#0fh
; SETB IE.0
; SETB IE.7
LJMP Run_EEPROM_Para
;*******************************************
Dial_Para:
ACALL Sub_Dial
nop
LJMP Run_EEPROM_Para
;*******************************************
;link under below conditions:
;1. Input_Len <=Dial_From
Dial_Input_Para:
ACALL Read_EEPROM
CLR DTMF_CS
MOV Dial_From,Read_Data
MOV A,Dial_From
ANL A,#0FH
MOV R1,A
MOV A,Dial_From
SWAP A
ANL A,#0FH
MOV Dial_From,A
MOV A,Input_Len
CLR C
SUBB A,Dial_From
JC Dial_Input_Over_P
DJNZ Dial_From,Cal_Dial_From_P
MOV Dial_Buffer,#Buffer_Add
SJMP Dial_Next_Loop_P
Cal_Dial_From_P:
MOV A,Dial_From
CLR C
RRC A
MOV Dial_Buffer,#Buffer_Add
ADD A,Dial_Buffer
MOV Dial_Buffer,A
Dial_Next_Loop_P:
MOV R0,Dial_Buffer
MOV DTMF_Out,@R0
MOV A,Dial_From
JB ACC.0,Dial_Even_Para
MOV A,DTMF_Out
SWAP A
MOV DTMF_Out,A
Dial_Even_Para:
acall Dial_DTMF
INC Dial_From
MOV A,Input_Len
SETB C
SUBB A,Dial_From
JC Dial_Input_Over_P
MOV A,Dial_From
JB ACC.0,Dial_Next_Input_P
INC Dial_Buffer
Dial_Next_Input_P: DJNZ R1,DiaL_Next_Loop_P
Dial_Input_Over_P:
DV_Low_Over:
LJMP Run_EEPROM_Para
; LJMP Program_END
;*****************************************
On_Hook_Para:
acall Sub_On_Hook
LJMP Run_EEPROM_Para
;*****************************************
Off_Hook_Para:
acall Sub_Off_Hook
LJMP Run_EEPROM_Para
;*****************************************
Wait_Para:
acall Sub_Wait
LJMP Run_EEPROM_Para
;*****************************************
Call_Para:
acall Sub_Call
LJMP Run_EEPROM_Para
;*****************************************
Return_Para:
acall Sub_Return
LJMP Run_EEPROM_Para
;*****************************************
Keep_Para:
acall Sub_Keep
LJMP Run_EEPROM_Para
;*****************************************
Ring_Para:
acall Sub_Ring
LJMP Run_EEPROM_Para
;*****************************************
Data_Valid:
;/*****************************************
;/* Sub Program Begins here
;/*****************************************
Delay_10mS:
;Parameters X10mS
;Private Delay_Count1,Delay_Count2
MOV Delay_Count1,#100
MOV Delay_Count2,#100
Sub_Delay_Loop:
DJNZ Delay_Count1,Sub_Delay_Loop
MOV Delay_Count1,#100
DJNZ Delay_Count2,Sub_Delay_Loop
DJNZ X10mS,Delay_10mS
INC X10mS
RET
;/******************************************
Delay_Seconds:
;Parameters Delay_Counter
MOV A,Delay_Counter
ANL A,#0Fh
MOV Delay_Counter,A
JZ No_Time_Left
Next_Second:
MOV mS_Counter,#0
Wait_For_1S:
MOV A,mS_Counter
CJNE A,#50,Wait_For_1S ;mS_Counter < 50
DJNZ Delay_Counter,Next_Second
No_Time_Left: RET
;/******************************************
Dial_DTMF:
;Patameters DTMF_Out, Temp
;Private
CLR IE.0
MOV FLAG_RED,#4
CLR RED_LED
CLR DTMF_CS
SETB DTMF_RS0
MOV X10mS,#2
ACALL Delay_10mS
MOV A,#05h ;/*0101 Control Register A
MOV R0,#00h
MOVX @R0,A
MOV A,DTMF_Out
ANL A,#0FH
CLR DTMF_RS0
MOV R0,#0H
MOVX @R0,A
MOV X10mS,#10
ACALL Delay_10mS
CLR DTMF_CS
SETB DTMF_RS0
MOV A,#04h ;/*0100 Control Register A
MOV R0,#00h
MOVX @R0,A
; SETB DTMF_RS0
WAIT_SEND_END:
; MOVX A,@R0
; JNB ACC.1,WAIT_SEND_END
; JNB MT8888C_FLAG.1,WAIT_SEND_END
; CLR MT8888C_FLAG.1
SETB IE.0
RET
;******************************************
short_Delay:
MOV Delay_Count1,#5
Short_Loop:
DJNZ Delay_Count1,Short_Loop
RET
;/******************************************
Get_DTMF:
;Glode Flag_Byte, Input_Len, Temp_Buff,Next_Buff_Add,Temp
;Private Get_Wait_Time,Time_Out_Limit
;return DTMF_Input
MOV Second_Counter,#0
MOV mS_Counter,#0
CLR DTMF_Time_Out
; SETB DTMF_RS0
; MOV R0,#0
; MOVX A,@R0
;WAIT_FOR_REDAY: MOVX A,@R0
; JB ACC.2,RECIEVE_OK
WAIT_FOR_READY:
MOV A,INPUT_B
CJNE A,INPUT_E,RECIEVE_OK
MOV A,mS_Counter
CJNE A,#50,WAIT_FOR_READY
MOV mS_Counter,#0
INC Second_Counter
MOV A,Second_Counter
CJNE A,Time_Out_Limit,WAIT_FOR_READY
SETB DTMF_Time_Out
RET
RECIEVE_OK: MOV A,INPUT_B
CLR C
RRC A
JC HI_B
ADD A,#BUFFER_ADD
MOV R0,A
MOV A,@R0
SWAP A
ANL A,#0FH
MOV DTMF_INPUT,A
INC INPUT_B
MOV FLAG_RED,#10
CLR RED_LED
RET
HI_B:
ADD A,#BUFFER_ADD
MOV R0,A
MOV A,@R0
ANL A,#0FH
MOV DTMF_INPUT,A
INC INPUT_B
MOV FLAG_RED,#10
CLR RED_LED
RET
; CLR DTMF_RS0
; MOVX A,@R0
; ANL A,#0FH
; MOV DTMF_Input,A
; INC Input_Len
; Setb DTMF_DV_Low
; MOV A,Input_Len
; RRC A
; JC Input_Odd
; MOV R1,Save_Buffer
; MOV A,@R1
; ORL A,DTMF_Input
; MOV @R1,A
; MOV A,Save_Buffer
; CJNE A,#Buffer_End,Input_No_Over
; SJMP Get_DTMF_Over
;Input_No_Over: INC Save_Buffer
; SETB RED_LED
; RET
;*******************************************
Get_DTMF2:
;Glode Flag_Byte, Input_Len, Temp_Buff,Next_Buff_Add,Temp
;Private Get_Wait_Time,Time_Out_Limit
;return DTMF_Input
MOV Second_Counter,#0
MOV mS_Counter,#0
CLR DTMF_Time_Out
SETB DTMF_RS0
MOV R0,#0
MOVX A,@R0
WAIT_FOR_DTMF: MOVX A,@R0
JB ACC.2,REC_DTMF_OK
MOV A,mS_Counter
CJNE A,#50,WAIT_FOR_DTMF
MOV mS_Counter,#0
INC Second_Counter
MOV A,Second_Counter
CJNE A,Time_Out_Limit,WAIT_FOR_DTMF
SETB DTMF_Time_Out
RET
REC_DTMF_OK:
CLR DTMF_RS0
MOVX A,@R0
ANL A,#0FH
MOV DTMF_Input,A
RET
INC Input_Len
SETB DTMF_DV_Low
MOV A,Input_Len
RRC A
JC Input_Odd_D
MOV R1,Save_Buffer
MOV A,@R1
ORL A,DTMF_Input
MOV @R1,A
MOV A,Save_Buffer
CJNE A,#Buffer_End,Input_N_Over
SJMP Get_DTMF_Over
Input_N_Over: INC Save_Buffer
SJMP Get_DTMF_Over
Input_Odd_D:
MOV A,DTMF_Input
SWAP A
MOV R1,Save_Buffer
MOV @R1,A
Get_DTMF_OVER: RET
Quit_Get_DTMF: RET
;/******************************************
;/******************************************
Read_EEPROM:
;Parameters Read_Data, Bit_len,Bits_to_Send
SETB EEPROM_DO
CLR EEPROM_CS
NOP
NOP
NOP
NOP
SETB EEPROM_CS
MOV Bit_len,#RDWR_Inst_Len
MOV Bits_to_send,#Read_Inst
acall Send_Bits
MOV Bit_Len,#EEPROM_Add_Len
MOV Bits_To_Send,Run_Address
Acall Send_Bits
MOV Read_Data,#0
MOV Bit_Len,#Byte_Len
Read_Next_Bit:
CLR EEPROM_SK
NOP
NOP
NOP
NOP
SETB EEPROM_SK
CLR C
JNB EEPROM_DO,Bit_Got
SETB C
Bit_Got: MOV A,Read_Data
RLC A
MOV Read_Data,A
DJNZ Bit_Len,Read_Next_Bit
INC Run_Address
MOV A,Run_Address
JZ JMP_Program_END
CLR EEPROM_CS
RET
JMP_Program_END:
LJMP Program_END
;***************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -