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

📄 dtmf_gen.lst

📁 pic16c6x和pic16c7xxx都可以通用
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -