Nog effectiever als je toch moet programmeren,
Hier een voorbeeld van Pibasic Frits Kieftenbelt voor een DTMF generator
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
XTAL 20 ;Kristal van 20MHz
;Logische constanten
SYMBOL AAN = 0 ;Omgekeerd ON
SYMBOL LAAG = 0 ;Laag signaal
SYMBOL HOOG = 1 ;Hoog signaal
SYMBOL OFF = 0 ;UIT
SYMBOL ON = 1 ;AAN
SYMBOL UIT = 1 ;Omgekeerd OFF
;Muzieknoten met bijbehorende frequenties in Hertz
SYMBOL C = 2092 ;C noot
SYMBOL D = 2348 ;D noot
SYMBOL E = 2636 ;E noot
SYMBOL G = 3136 ;G noot
SYMBOL R = 0 ;Rust (stilte, pauze)
;Poortnamen
'YMBOL - = PORTA.0 ;Vrij bruikbaar als in/uitgang
'YMBOL - = PORTA.1 ;Vrij bruikbaar als in/uitgang
'YMBOL - = PORTA.2 ;Vrij bruikbaar als in/uitgang
'YMBOL - = PORTA.3 ;Vrij bruikbaar als in/uitgang
SYMBOL CM8870_StD = PORTA.4 ;
SYMBOL CM8870_Q1 = PORTA.5 ;
'YMBOL - = PORTA.6 ;Vrij bruikbaar als in/uitgang (of 20MHz kristal)
'YMBOL - = PORTA.7 ;Vrij bruikbaar als in/uitgang (of 20MHz kristal)
SYMBOL CM8870_Q4 = PORTB.0 ;
SYMBOL LED = PORTB.1 ;Vrij bruikbaar als in/uitgang (USART) tevens LED3
'YMBOL - = PORTB.2 ;Vrij bruikbaar als in/uitgang (USART)
SYMBOL Geluid = PORTB.3 ;Tonen zijn ook te versturen door de CCP/PWM module (HPWM)
SYMBOL Relais = PORTB.4 ;LAAG = relais actief = "telefoon opnemen"
SYMBOL BelSignaal = PORTB.5 ;LAAG als de telefoonbel gaat (er wordt gebeld)
SYMBOL CM8870_Q2 = PORTB.6 ;
SYMBOL CM8870_Q3 = PORTB.7 ;
;Variabelen declareren
;WORD
DIM Freq1 AS WORD ;Frequentie 1
DIM Freq2 AS WORD ;Frequentie 2
DIM WD1 AS WORD ;Word Dummy 1
;BYTE
DIM NootNr AS BYTE ;Teller die bijhoudt welke muzieknoot wordt afgespeeld
DIM TelefoonToets AS BYTE ;Toetsnummer (DTMF) die de opbeller op zijn telefoon indrukt
DIM Teller AS BYTE ;FOR...NEXT telvariabele
DIM Timer AS BYTE
DIM BD1 AS BYTE ;Byte Dummy 1
;BIT
DIM ID1 AS BIT ;bIt Dummy 1
; 76543210
PORTA = %00000000 ;PORTA poorten laag
PORTB = %00100000 ;PORTB poorten laag, (behalve B.5; HOOG = reedrelais uit)
TRISA = %11111111 ;
TRISB = %11100101 ;B.4 uitgang reedrelais, B.3 uitgang geluid, B.1 uitgang LED
Relais = AAN ;Maak verbinding met de telefoonlijn
GOTO Start ;Spring over de subroutine
;Subroutine
DTMF: ;Kijk welke telefoontoets de opbeller indrukt
TelefoonToets = CM8870_Q1 + (2 * CM8870_Q2) + (4 * CM8870_Q3) + (8 * CM8870_Q4)
WHILE CM8870_StD = HOOG : WEND ;Wacht tot de opbeller de telefoontoets los laat
DELAYMS 1 ;Wacht nog even tot CM8870_StD goed LAAG is
RETURN
;Hoofdprogramma
Start:
WHILE CM8870_StD = LAAG : WEND ;Wacht tot de opbeller op een toets drukt
GOSUB DTMF ;Ga kijken welke toets de opbeller heeft ingedrukt
SELECT TelefoonToets ;Afhankelijk van ingedrukte toets (eventueel) actie ondernemen
CASE 10 ;Bij telefoontoets '0' indrukken... LET OP: 10 staat voor '0'
LED = OFF ;...de rode LED uitzetten
CASE 1 ;Bij telefoontoets '1' indrukken...
LED = ON ;...de rode LED aanzetten
CASE 5 ;Als telefoontoets '5' wordt ingedrukt dan muziek afspelen
FOR NootNr = 0 TO 28 ;Speel de 29 noten na elkaar af (29 = 0 t/m 28)
Freq1 = LOOKUPL NootNr, [E,D,C,D,E,E,E,R,D,D,D,R,E,G,G,R,E,D,C,D,E,E,E,E,D,D,E,D,C]
IF Freq1 > 8 THEN Freq2 = Freq1 - 8 ;Dit geeft een speciaal geluidseffect
FREQOUT Geluid, 225, Freq1, Freq2 ;Speel de noten af op de telefoon
NEXT
CASE 9 ;Bij telefoontoets '9' indrukken...
Relais = UIT ;... de verbinding verbreken
ENDSELECT
GOTO Start