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

📄 dtmf_255_10k_diag.asm

📁 电话远程控制家电系统单片机开发电话远程控制家电系统单片机开发
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;
;
;	SOFTWARE DTMF DECODER - TEST PROGRAM
;	modified Goertzel algorithm
;	timer 2 used to generate interupts at 9765.625hz
;	PWM1 output at 19531.25hz
;
;
;	(c) 2003 Radu Constantinescu
;	constantinescuradu @yahoo.com
;	RELEASED UNDER GNU PUBLIC LICENSE
;	
;
;	Use 255 samples table	
;	FOR 16F87X / 20 Mhz
;	F sample = 5000000/512 hz
;
;	DTMF Signal Input at RC1 pin - Schmitt trigger 
;	BLINK PORT C0 AT EACH CHARACTER
;
;
;
;
;

#include <p16f877.inc>

Bank0:	MACRO
	bcf STATUS, RP0
	bcf STATUS, RP1
	ENDM
Bank1:	MACRO
	bsf STATUS, RP0
	bcf STATUS, RP1
	ENDM
Bank2:	MACRO
	bcf STATUS, RP0
	bsf STATUS, RP1
	ENDM
Bank3:	MACRO
	bsf STATUS, RP0
	bsf STATUS, RP1
	ENDM



;****************************
;
;User Variables in GPR
;
;****************************
SAMPLEBIT	EQU	0X40


TABLECOUNTER	EQU	0X43
TEMP		EQU	0X44
LOWTEMPLATE	EQU	0X45
HIGHTEMPLATE	EQU	0X46
BYTE		EQU	0X47


PCLATH_SAVE	EQU	0X49
W_TEMP		EQU	0X4A
STATUS_TEMP	EQU	0X4B
FSR_SAVE	EQU	0X4C

;COUNT		EQU	H'27'
RESULT		EQU	H'28'
FLAGS		EQU	H'29'

A697SIN		EQU	H'30'
A697COS		EQU	H'31'	; ACC
A770SIN		EQU	H'32'
A770COS		EQU	H'33'	; ACC
A852SIN		EQU	H'34'
A852COS		EQU	H'35'	; ACC
A941SIN		EQU	H'36'
A941COS		EQU	H'37'	; ACC
A1209SIN	EQU	0X38
A1209COS	EQU	0X39	;ACC
A1336SIN	EQU	0X3A
A1336COS	EQU	0X3B	;ACC
A1447SIN	EQU	0X3C
A1447COS	EQU	0X3D	;ACC
A1633SIN	EQU	0X3E
A1633COS	EQU	0X3F	;ACC

	#DEFINE	DONE		FLAGS,0
	#DEFINE ONELIT		FLAGS,3


	CBLOCK 0x50
	scrA:	1	; scratch pad	0X50
	scrB:	1
	scrC:	1	
	scrD:	1
	count_1:1	; counter lsb
	count_2:1
	count_3:1
	count_4:1	; counter msb
	temp1l:	1	; temp 1 lo
	temp1h:	1	; temp 1 hi
	temp1C:	1	; temp 1 Celsius
	temp2l:	1	; temp 2 lo
	temp2h:	1	; temp 2 hi
	temp2C: 1	; temp 2 Celsius
	dig_10:	1	; display digit 10
	dig_9:	1	; display digit 9
	dig_8:	1	; display digit 8
	dig_7:	1	; display digit 7
	dig_6:	1	; display digit 6
	dig_5:	1	; display digit 5
	dig_4:	1	; display digit 4
	dig_3:	1	; display digit 3
	dig_2:	1	; display digit 2
	dig_1:	1	; display digit 1
	dig_0:	1	; end of string 0 0X68
	ENDC

	CBLOCK 0x72	; variables for all the RAM pages
	comA:	1
	comB:	1
	comC:	1
	comD:	1
	ENDC






	ORG	0X00
	NOP
	CLRF STATUS
	GOTO	START
	;GOTO STARTPLUS

INTERRUPT_VECTOR	
	ORG	0X04

;****************************
;
;	CONTEXT SAVE
;
;****************************
C_SAVE	MOVWF	W_TEMP
	SWAPF	STATUS,W
	CLRF	STATUS		;ENSURE BANK0 SAVE
	MOVWF	STATUS_TEMP

	MOVF	PCLATH,W	; SAVE PCLATH
	MOVWF   PCLATH_SAVE

	MOVF	FSR, W
	MOVWF	FSR_SAVE

	BTFSS	PIR1,TMR2IF	; Exit ISR if it wasn't a TMR2 Overflow
	GOTO	C_RESTORE

	BCF	PIR1,TMR2IF	; RESET TIMER 2 INT FLAG
	;BCF	INTCON,INTF

	movlw	1
	xorwf	PORTC, F	; flip port C0

	BTFSC	DONE
	GOTO	C_RESTORE	; Skip if done

;*****************************

	;TEST LEVEL of RC1 and set BYTE

	CLRF	BYTE
	BTFSS	PORTC, 1	
	GOTO	CONTINUE
PIN_HIGH
	COMF	BYTE, F
CONTINUE

;*****************************
;
;Get the expected Lowband Bits
;
;*****************************
	MOVLW	LOW	LOWBAND 
	ADDWF	TABLECOUNTER,W
	MOVLW	HIGH	LOWBAND
	BTFSC	STATUS,C
	ADDLW	1
	MOVWF	PCLATH
	
	MOVF	TABLECOUNTER,W
	CALL	LOWBAND

	CLRF	PCLATH
	MOVWF	LOWTEMPLATE
	MOVF	BYTE,W
	XORWF	LOWTEMPLATE, F	; APPLY INPUT OVER MASK
;*****************************
;
;Get the expected Highband Bits 
;
;*****************************
	MOVLW	LOW	HIGHBAND
	ADDWF	TABLECOUNTER,W
	MOVLW	HIGH	HIGHBAND
	BTFSC	STATUS,C
	ADDLW	1
	MOVWF	PCLATH
	
	MOVF	TABLECOUNTER,W
	CALL	HIGHBAND
	
	CLRF	PCLATH
	MOVWF	HIGHTEMPLATE
	MOVF	BYTE,W
	XORWF	HIGHTEMPLATE, F	; APPLY INPUT OVER MASK
;*******************************
;
;	LOWTEMPLATE AND HIGHTEMPLATE 
;	CONTAIN THE EXPECTED VALUES
;	FOR THE INCOMING BIT
;
;*******************************

	MOVLW	LOW A697SIN
	MOVWF	FSR		;ACCUMULATOR ADDR
	MOVLW	8
	MOVWF	SAMPLEBIT
COMPAREBITL
	RLF 	LOWTEMPLATE,F
	BTFSS	STATUS,C	
	GOTO	MATCHL
	DECF	INDF,F
	GOTO	CONTINL
MATCHL	
	INCF	INDF,F	
CONTINL
	INCF	FSR,F
	DECFSZ	SAMPLEBIT,F
	GOTO	COMPAREBITL	;FINISH THE BYTE

	MOVLW	LOW A1209SIN
	MOVWF	FSR		;ACCUMULATOR ADDR
	MOVLW	8
	MOVWF	SAMPLEBIT
COMPAREBITH
	RLF 	HIGHTEMPLATE,F
	BTFSS	STATUS,C	
	GOTO	MATCHH
	DECF	INDF,F
	GOTO	CONTINH
MATCHH	
	INCF	INDF,F	
CONTINH
	INCF	FSR,F
	DECFSZ	SAMPLEBIT,F
	GOTO	COMPAREBITH	;FINISH THE BYTE

;********************************
;
; Increment Tablecounter 0..255
;
;********************************
	
	INCF	TABLECOUNTER,F
	MOVF	TABLECOUNTER,W
	XORLW	D'255'		;This is the number of samples to test against (max 7f)
	BTFSC	STATUS,Z
	BSF	DONE

;********************************
;
; Context Restore
;
;********************************

C_RESTORE
	CLRF	STATUS		;ENSURE BANK0 RESTORE
	MOVF	FSR_SAVE,W
	MOVWF	FSR
	MOVF	PCLATH_SAVE,W
	MOVWF	PCLATH		; RESTORE PCLATH
	SWAPF	STATUS_TEMP,W
	MOVWF	STATUS
	SWAPF	W_TEMP,F
	SWAPF	W_TEMP,W
	
	RETFIE







	ORG	0X100
INIT
	;Bank0
	clrf PORTC		; program port C<0> for output
	movlw	B'11111110'	;port C0=out, C1=INPUT
	BANKSEL TRISC
	movwf	TRISC
	;Bank0

	;BANKSEL	TRISB		;Bank1
	;BSF	TRISB, 1	;PORTB1 = in

	BANKSEL T2CON	
	MOVLW	B'00001100'	; X,1/2 postscale, timer 2 ON ~4.8khz sample rate	
	MOVWF	T2CON		
	
	BANKSEL PR2
	MOVLW 0XFF		; TIMER 2 PERIOD REGISTER
	MOVWF PR2
	
	BANKSEL PIR1
	BCF	PIR1,TMR2IF	; CLEAR TIMER 2 INT FLAG
	BANKSEL PIE1
	BSF	PIE1,TMR2IE	; START INT FOR TIMER 2
	BANKSEL INTCON
	BSF	INTCON,PEIE 	; START PERIPHERAL INT
	BSF	INTCON,GIE	; START GLOBAL INT

	BANKSEL	CCP1CON
	MOVLW	B'00001100'
	MOVWF	CCP1CON		;PWM 1 ON
	BANKSEL	TRISC
	BCF	TRISC,2		; RC2 = PWM 1 OUT
	BANKSEL CCPR1L
	MOVLW	.128
	MOVWF	CCPR1L		; 50 DUTY CYCLE ~18KHZ

	RETURN




START
		call   init_disp                          
		call   cur_h1	                   
		;movlw  LOW linie3                         
		;movwf  comA                          
		;movlw  HIGH linie3                           
		;movwf  comB                          
		;call   prt_rom                     
		;call   cur_h2                          
		;movlw  LOW linie3                          
		;movwf  comA                          
		;movlw HIGH linie3                           
		;movwf  comB                          
		;call   prt_rom
		;CALL 	cur_h1      



STARTPLUS
	BSF	DONE		; DO NOT START ....
	CALL	INIT
CLEANUP
	MOVLW	0X2F		; start -1
	MOVWF	FSR
TEMPXX
	INCF	FSR,F
	CLRF	INDF
	MOVF	FSR,W
	XORLW	0X3F		; CLEAR RAM FROM 0X30-0X3F
	BTFSS	STATUS,Z
	GOTO	TEMPXX
	MOVLW	0		; table read pointer
	MOVWF	TABLECOUNTER
	BCF	DONE		; CLEAR DONE, START 

MAIN

	BTFSC	DONE		; GOT 128 SAMPLES?
	GOTO	GOT128
	nop
	nop

	GOTO	MAIN


GOT128
	MOVLW	H'30'
	MOVWF	FSR
TESTFORNEG
	BTFSC	INDF,7
	GOTO	NEG
	GOTO	NEXT
NEG
;	SUBTRACT F FROM 0
	MOVF	INDF,W
	SUBLW	0
	MOVWF	INDF
NEXT
	INCF	FSR,F
	MOVF	FSR,W
	XORLW	H'40'
	BTFSS	STATUS,Z
	GOTO	TESTFORNEG
	
	CALL	WINNER
	GOTO	CLEANUP		; START AGAIN





WINNER
	MOVLW	H'30'
	MOVWF	FSR
MORERESULTS
	MOVF	INDF,W
	CLRF	INDF
	INCF	FSR,F
	ADDWF	INDF,F
	MOVF	FSR,W
	INCF	FSR,F
	XORLW	H'3F'
	BTFSS	STATUS,Z
	GOTO	MORERESULTS

	MOVLW	0X31
	MOVWF	FSR


	;GOTO OUTCHAR

;OUTPUTRESULT
;WINNER
	call cur_h1	; first debug line	

	movf	A697COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	movf	A770COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	movf	A852COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	movf	A941COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram


	call cur_h2	; second debug line

	movf	A1209COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	movf	A1336COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	movf	A1447COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	movf	A1633COS, W
	movwf 	count_1
	call dispU8
	movlw 0
	movwf dig_0	; place a 0 at the end of the string
	BCF STATUS, IRP	; RAM bank 0 -1 indirect	
	movlw low dig_4
	call prt_ram

	return



;OUTCHAR
;
;OUTPUT HERE
;

	MOVF	INDF,W
	SUBLW	D'64'		;THRESHOLD
	RRF	RESULT,f
	INCF	FSR,F
	INCF	FSR,F
	MOVF	FSR,W
	XORLW	0X41
	BTFSS	STATUS,Z
	RETURN			; GOT TRASH
	COMF	RESULT,f

	MOVF	RESULT,W	
	XORLW	D'17'
	BTFSC	STATUS,Z
	GOTO	GOTCHA1
	MOVF	RESULT,W
	XORLW	D'33'
	BTFSC	STATUS,Z
	GOTO	GOTCHA2
	MOVF	RESULT,W
	XORLW	D'65'
	BTFSC	STATUS,Z
	GOTO	GOTCHA3
	MOVF	RESULT,W
	XORLW	D'18'
	BTFSC	STATUS,Z
	GOTO	GOTCHA4
	MOVF	RESULT,W
	XORLW	D'34'

⌨️ 快捷键说明

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