📄 dtmf_gen.lst
字号:
012E 108C BCF PIR1,1
012F 0008 RETURN }
0043 bits pwm1;
/* Function Prototypes */
void main_isr();
void timer2_isr();
/* 16C74 I/O port bit declarations */
/* global program variables */
0044 char tmr2_cntr; /* timer 2 interrupt counter */
0045 char delay_cntr; /* delay time counter (10ms ticks)*/
/* Tone Coefficients for DTMF Tones */
0130 0782 ADDWF PCL const DTMF_1[4]={30, 51, 48, 27};
0131 341E RETLW 1Eh
0132 3433 RETLW 33h
0133 3430 RETLW 30h
0134 341B RETLW 1Bh
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 11
0135 0782 ADDWF PCL const DTMF_2[4]={30, 51, 56, 19};
0136 341E RETLW 1Eh
0137 3433 RETLW 33h
0138 3438 RETLW 38h
0139 3413 RETLW 13h
013A 0782 ADDWF PCL const DTMF_3[4]={30, 51, 64, 11};
013B 341E RETLW 1Eh
013C 3433 RETLW 33h
013D 3440 RETLW 40h
013E 340B RETLW 0Bh
013F 0782 ADDWF PCL const DTMF_4[4]={33, 48, 48, 27};
0140 3421 RETLW 21h
0141 3430 RETLW 30h
0142 3430 RETLW 30h
0143 341B RETLW 1Bh
0144 0782 ADDWF PCL const DTMF_5[4]={33, 48, 56, 19};
0145 3421 RETLW 21h
0146 3430 RETLW 30h
0147 3438 RETLW 38h
0148 3413 RETLW 13h
0149 0782 ADDWF PCL const DTMF_6[4]={33, 48, 64, 11};
014A 3421 RETLW 21h
014B 3430 RETLW 30h
014C 3440 RETLW 40h
014D 340B RETLW 0Bh
014E 0782 ADDWF PCL const DTMF_7[4]={36, 45, 48, 27};
014F 3424 RETLW 24h
0150 342D RETLW 2Dh
0151 3430 RETLW 30h
0152 341B RETLW 1Bh
0153 0782 ADDWF PCL const DTMF_8[4]={36, 45, 56, 19};
0154 3424 RETLW 24h
0155 342D RETLW 2Dh
0156 3438 RETLW 38h
0157 3413 RETLW 13h
0158 0782 ADDWF PCL const DTMF_9[4]={36, 45, 64, 11};
0159 3424 RETLW 24h
015A 342D RETLW 2Dh
015B 3440 RETLW 40h
015C 340B RETLW 0Bh
015D 0782 ADDWF PCL const DTMF_0[4]={40, 41, 56, 19};
015E 3428 RETLW 28h
015F 3429 RETLW 29h
0160 3438 RETLW 38h
0161 3413 RETLW 13h
0162 0782 ADDWF PCL const DTMF_star[4]={40, 41, 48, 27};
0163 3428 RETLW 28h
0164 3429 RETLW 29h
0165 3430 RETLW 30h
0166 341B RETLW 1Bh
0167 0782 ADDWF PCL const DTMF_pound[4]={40, 41, 64, 11};
0168 3428 RETLW 28h
0169 3429 RETLW 29h
016A 3440 RETLW 40h
016B 340B RETLW 0Bh
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 12
016C 0782 ADDWF PCL const DTMF_A[4]={30, 51, 75, 2};
016D 341E RETLW 1Eh
016E 3433 RETLW 33h
016F 344B RETLW 4Bh
0170 3402 RETLW 02h
0171 0782 ADDWF PCL const DTMF_B[4]={33, 48, 75, 2};
0172 3421 RETLW 21h
0173 3430 RETLW 30h
0174 344B RETLW 4Bh
0175 3402 RETLW 02h
0176 0782 ADDWF PCL const DTMF_C[4]={36, 45, 75, 2};
0177 3424 RETLW 24h
0178 342D RETLW 2Dh
0179 344B RETLW 4Bh
017A 3402 RETLW 02h
017B 0782 ADDWF PCL const DTMF_D[4]={40, 41, 75, 2};
017C 3428 RETLW 28h
017D 3429 RETLW 29h
017E 344B RETLW 4Bh
017F 3402 RETLW 02h
/*****************************************************************************
* main isr - 16C74 vectors to 0004h (MPC __INT() function) on any interrupt *
* assembly language routine saves W and Status registers then tests flags in
* INTCON to determine source of interrupt. Routine then calls appropriate isr.
* Restores W and status registers when done.
*****************************************************************************/
0004 2980 GOTO 0180h void __INT(void)
0180 {
0180 1283 BCF STATUS,RP0 if(PIR1.TMR2IF){ /* timer 2 interrupt ? */
0181 1C8C BTFSS PIR1,1
0182 2985 GOTO 0185h
0183 108C BCF PIR1,1 PIR1.TMR2IF=0; /* clear interrupt flag */
0184 2191 CALL 0191h timer2_isr(); /* and call timer 2 isr */
}
/* Restore W, WImage, and STATUS registers */
#asm
0185 1283 BCF STATUS,RP0 ;Bank 0
0186 0825 MOVF temp_PCLATH, W
0187 008A MOVWF PCLATH ;PCLATH restored
0188 0822 MOVF temp_WImage, W
0189 00A1 MOVWF __WImage ;__WImage restored
018A 0824 MOVF temp_FSR, W
018B 0084 MOVWF FSR ;FSR restored
018C 0E23 SWAPF temp_STATUS,W
018D 0083 MOVWF STATUS ;RP0 restored
018E 0EA0 SWAPF temp_WREG,F
018F 0E20 SWAPF temp_WREG,W ;W restored
#endasm
0190 0009 RETFIE }
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 13
/****************************************************************************
* timer 2 isr - provides PWM sample clock generation and millisecond counter
* for tone routine
*****************************************************************************/
void timer2_isr(void)
{
0191 1283 BCF STATUS,RP0 sample_flag=active; /* set sample flag (150us clock) */
0192 14AC BSF 2C,1
0193 3080 MOVLW 80h PORTB.7=!PORTB.7; /* toggle PORTB.7 at sample rate */
0194 0686 XORWF PORTB
0195 0844 MOVF 44,W if(tmr2_cntr++==7){ /* check counter */
0196 0AC4 INCF 44
0197 00A1 MOVWF 21
0198 3007 MOVLW 07h
0199 0221 SUBWF 21,W
019A 1D03 BTFSS STATUS,Z
019B 299F GOTO 019Fh
019C 1283 BCF STATUS,RP0 tmr2_cntr=0; /* reset if max */
019D 01C4 CLRF 44
019E 0AB7 INCF 37 ms_cntr++; /* and increment millisecond ticks */
}
019F 0008 RETURN }
void main()
{
/* initialize OPTION register */
01A0 30CF MOVLW CFh OPTION=0b11001111;
01A1 1683 BSF STATUS,RP0
01A2 0081 MOVWF TMR0
/* initialize INTCON register (keep GIE inactive!) */
01A3 018B CLRF INTCON INTCON=0b00000000; /* disable all interrupts */
/* initialize PIE1 and PIE2 registers (periphereal interrupts) */
01A4 018C CLRF PIR1 PIE1=0b00000000; /* disable all interrupts */
01A5 018D CLRF PIR2 PIE2=0b00000000;
/* initialize T1CON and T2CON registers */
01A6 1283 BCF STATUS,RP0 T1CON=0b00000000; /* T1 not used */
01A7 0190 CLRF T1CON
01A8 3028 MOVLW 28h T2CON=0b00101000; /* T2 postscaler=5 */
01A9 0092 MOVWF T2CON
/* initialize CCPxCON registers */
01AA 300C MOVLW 0Ch CCP1CON=0b00001100; /* set CCP1CON for PWM mode */
01AB 0097 MOVWF CCP1CON
01AC 009D MOVWF CCP2CON CCP2CON=0b00001100; /* set CCP2CON for PWM mode (not used in demo) */
/* initialize SSPCON register */
01AD 0194 CLRF SSPCON SSPCON=0b00000000; /* serial port - not used */
/* initialize ADCONx registers */
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 14
01AE 019F CLRF ADCON0 ADCON0=0b00000000; /* A-D converter */
01AF 3002 MOVLW 02h ADCON1=0b00000010;
01B0 1683 BSF STATUS,RP0
01B1 009F MOVWF ADCON0
/* initialize TRISx register (port pins as inputs or outputs) */
01B2 300F MOVLW 0Fh TRISA=0b00001111;
01B3 0085 MOVWF PORTA
01B4 0186 CLRF PORTB TRISB=0b00000000;
01B5 3080 MOVLW 80h TRISC=0b10000000;
01B6 0087 MOVWF PORTC
01B7 300F MOVLW 0Fh TRISD=0b00001111;
01B8 0088 MOVWF PORTD
01B9 0189 CLRF PORTE TRISE=0b00000000;
/* clear watchdog timer (not used) */
01BA 0064 CLRWDT CLRWDT();
/* initialize program variables */
01BB 1283 BCF STATUS,RP0 tmr2_cntr=0;
01BC 01C4 CLRF 44
/* initialize program bit variables */
01BD 01AC CLRF 2C FLAGS=0b00000000;
/* intialize output port pins (display LED's on demo board) */
01BE 0186 CLRF PORTB PORTB=0;
/* enable interrupts... */
01BF 170B BSF INTCON,PEIE INTCON.ADIE=1; /* Periphereal interrupt enable */
01C0 178B BSF INTCON,GIE INTCON.GIE=1; /* global interrupt enable */
01C1 303E MOVLW 3Eh init_PWM(0x3e); /* initialize PWM port */
01C2 2025 CALL 0025h
01C3 3001 MOVLW 01h PORTB=0x01; /* write a 1 to PORTB */
01C4 1283 BCF STATUS,RP0
01C5 0086 MOVWF PORTB
01C6 301E MOVLW 1Eh a1=DTMF_1[0]; /* and send a DTMF "1" */
01C7 00B8 MOVWF 38
01C8 3033 MOVLW 33h b1=DTMF_1[1];
01C9 00BA MOVWF 3A
01CA 3030 MOVLW 30h a2=DTMF_1[2];
01CB 00B9 MOVWF 39
01CC 301B MOVLW 1Bh b2=DTMF_1[3];
01CD 00BB MOVWF 3B
01CE 3096 MOVLW 96h duration=150;
01CF 00BC MOVWF 3C
01D0 20DC CALL 00DCh tone();
01D1 30C8 MOVLW C8h Delay_Ms_20MHz(200); /* delay 100ms (200/2 using MPC delays) */
01D2 22C8 CALL 02C8h
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 15
01D3 3002 MOVLW 02h PORTB=0x02; /* write a 2 to PORT B */
01D4 1283 BCF STATUS,RP0
01D5 0086 MOVWF PORTB
01D6 301E MOVLW 1Eh a1=DTMF_2[0]; /* and send a DTMF "2" */
01D7 00B8 MOVWF 38
01D8 3033 MOVLW 33h b1=DTMF_2[1];
01D9 00BA MOVWF 3A
01DA 3038 MOVLW 38h a2=DTMF_2[2];
01DB 00B9 MOVWF 39
01DC 3013 MOVLW 13h b2=DTMF_2[3];
01DD 00BB MOVWF 3B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -