;Nummermelder programma versie 1, bij wijziging ook versienr. in opstart-display aanpassen. ;In het Engels onder naam CallerID_V-1_UK ;V-1 ;Compileren met Crownhill Proton+ PIC Basic compiler. ;'Nummermelder' geeft op een (2*16) LC-Display het volgende weer: ;Bij een oproep is meteen het telefoonnummer van de beller te zien, deze blijft staan ; totdat er een ander nieuw telefoonnummer ontvangen wordt OF als de toets bedient wordt. ;Met de toets kan door de telefoonnummers 'gebladerd' worden. ;Op de tweede regel is te zien hoeveel telefoonnummers het geheugen bevat. ;De LED gaat branden bij nieuw ontvangen nummer(s) en gaat pas uit als allen bekeken zijn. ;Deze LED knippert even snel als een nieuw ontvangen nummer al in het geheugen aanwezig is. ;Een (op)nieuw ontvangen telefoonnummer wordt in het display aangeduid met *N*, ; die verdwijnt als het telefoonnummer bekeken is. ;Max.12 10-cijferige telefoonnummers kunnen er in de PIC worden opgeslagen, bij stroomuitval ; blijft alles bewaard (zonder batterij) aangezien de nummers in EEPROM worden opgeslagen. ;Is het geheugen vol dan wordt dit op het display vermeld en knippert het backlight en LED. ;Als het geheugen vol is wordt nog wel steeds het laatst ontvangen nummer op het LCD ; getoond, maar niet meer in het geheugen opgeslagen. ;Bij een oproep of een druk op de toets wordt de backlight van de LCD voor 30 sec. aangezet. ;Als de toets langer dan 2 sec. wordt vastgehouden dan wordt gevraagd of de aanwezige ; telefoonnummers moeten worden gewist, binnen 4 seconden moet dan nogmaals op de toets ; worden gedrukt, is echter een nummer nog niet bekeken, dan kan er niet gewist worden. ;Het werkt natuurlijk alleen als de telefoonmaatschappij (KPN) de nummers doorgeeft. ;Meteen na het programmeren van de PIC staat het programma in TEST-mode. ;Dit is te herkennen aan TEST, rechtsonder in het LC-Display. ;In TEST-mode werkt de schakeling normaal, maar is de schakeling ook te testen: ;Druk op een parallel aangesloten telefoon eerst op toets '*' (simuleert: nieuw nummer), ; dan binnen een seconde (snel) een nummer intoetsen en besluit met telefoontoets '#'. ;Wordt geen "ENTER" (#) gegeven, dan doet de PIC het zelf na een seconde (Time-out). ;TEST-mode is ook in te schakelen door bij het inschakelen van de spanning de toets ; ingedrukt te houden. ;Door de spanning een paar seconden van de schakeling te halen en opnieuw in te schakelen ; staat het programma niet meer in TEST-mode (De toetsen '*' en '#' werken dan niet meer). ;De PIC zelf heeft geen kristal nodig, hij loopt op de inwendige klok. ;Tijd + datum is een toekomstige uitbreiding (Poorten A.6 en A.7 zijn hiervoor gereserveerd) ;Als een HD44780 2x16 LC-Display voorhanden is, hoeft deze schakeling niet veel te kosten. ;EEPROM adres 0 bevat de adres teller van de EEPROM zelf. ;EEPROM adres 1 bevat de teller van het aantal telefoonnummers + die van een nieuw telnr. ;EEPROM adres 2 houdt bij of de 'nieuwe nummers' LED aan of uit is (ivm. stroomuitval) ;EEPROM adres 3 en verder, bevatten de telefoonnummers, elke LOW-NIB van een BYTE bevatten ; 1 cijfer van een telefoonnummer. De HIGH-NIB van de BYTE van elk eerste cijfer van een ; telefoonnummer bevat het volgnummer van dat telefoonnummer. ;Een ontvangen telefoonnummer begint met een 'D' (0000=0), dit om te voorkomen dat de ; nummers die modem of huistelefoon tijdens bellen geven op de lijn op het display komen. ;Een ontvangen telefoonnummer wordt voor compleet gezien als de laatst ontvangen waarde ; een 'C' (1111=15) betreft (standaard) of als er een time-out is (TimeOutTijd) . ;Extra benodigdheden: +5V voeding (evt. 7805 met adapter) ; PIC16F628A ; IC MT8870 of CM8870 + kristal 3.579545MHz ; LED + puls-toets ; HD44780 LC-Display 2x16 (evt. met backlight) ; NPN transistor (bv. BC547) ; VDR S07K130 (130V) ; Weerstanden 1k + 10k + 33k + 39k + 68k + 3x100k + 270k ; Condensator 2x10n + 3x100n + 100uF(elco) ; 2-aderig snoer voor telefoonlijn ;There is an English version too / Er is ook een Engelse versie ;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie) DEVICE 16F628A CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_OFF, MCLRE_OFF 'ivm. PORTA.5 als INPUT (MCLRE_OFF) XTAL 4 ALL_DIGITAL TRUE ;Normale aliases (constanten) SYMBOL AntiDender = 10 ;mSec: Wachtlustijd tegen contact-dender SYMBOL BckLghtTijd = 30000 ;mSec: (30.000 = 30 sec) Max.65500! SYMBOL KijkTijd = 15000 ;mSec: Tijd SYMBOL MaxAdres = 3 + 120 ;EEPROM geheugen, elke eenheid is 1 cijfer van een telefoonnummer, verhogen van dit nummer is niet mogelijk vanwege het maximum EEPROM geheugen SYMBOL MinAdres = 3 ;Vanaf MinAdres staan de telefoonnummers (0=EE_Adres, 1=Teller, 2=WeergeefAdres) SYMBOL RAM_Max = 15 ;Het max. aantal cijfers van een telefoonnummer dat eerst in RAM kan worden geschreven SYMBOL RAM_Min = 2 ;Het min. aantal cijfers waaraan een telefoonnummer moet voldoen SYMBOL TimeOutTijd = 15000 ;0,1 mSec: (15.000 = 1,5 sec) Max.65500! SYMBOL WisTijd = 200 ;0,01 sec: (200 = 2 sec) De tijd die nodig is om de toets ingedrukt te houden om de telefoonnummers te wissen ;Logische aliases (constanten) SYMBOL AAN = 0 ;Omgekeerd ON SYMBOL FALSE = 0 SYMBOL OFF = 0 SYMBOL ON = 1 SYMBOL TRUE = 1 SYMBOL UIT = 1 ;Omgekeerd OFF 'Poort aliases 'Bij wijzigen ook TRIS veranderen SYMBOL Q1 = PORTA.0 ;Uitgangen van MT8870 SYMBOL Q2 = PORTA.1 SYMBOL Q3 = PORTA.2 SYMBOL Q4 = PORTA.3 SYMBOL STD = PORTA.4 ;Is hoog als Q1...Q4 een geldige waarde in het register hebben SYMBOL Toets = PORTA.5 ;Kort drukken = stap door telnr's, lang drukken = alles wissen SYMBOL Reserve1 = PORTB.6 ;Voor klok chip SYMBOL Reserve2 = PORTB.7 ;Voor klok chip SYMBOL LED = PORTB.0 ;Licht op als er nieuwe nummers aanwezig zijn SYMBOL BackLight = PORTB.1 ;LCD backlight, aansturen dmv. een NPN transistor (BC547) ;YMBOL PORTB.2 t/m PORTB.7 ;Gereserveerd voor LCD ; 76543210 TRISA = %11111111 TRISB = %11111100 PORTB_PULLUPS OFF ;Array's DIM Nummer[RAM_Max + 2]AS BYTE ;Bevat het ontvangen nummer voordat het (na onderzoek) naar EEPROM wordt geschreven ;Word DIM BackLightTimer AS WORD ;Telt af tot 0, daarna wordt backlight vd. LCD uitgezet DIM TimeOut AS WORD ;Wordt gebruikt voor time-out functie DIM WD1 AS WORD ;Word Dummy 1 ;Byte DIM Cijfer AS BYTE ;Bevat 1 cijfer van een telefoonnummerde van of voor de EEPROM DIM DTMF AS BYTE ;Bevat steeds 1 cijfer dat van de telefoonlijn wordt ontvangen DIM EE_Adres AS BYTE ;Houdt het huidige adres bij, waarnaar toegeschreven wordt DIM EE_Teller AS BYTE ;Bevat het EEPROM adres bij bestaand-nummer onderzoek zodat de originele EE_Adres zijn waarde niet wordt gemuteerd (kan blijven behouden) DIM IndexNummer AS BYTE ;Bevat het indexnummer van array Nummer DIM Teller AS BYTE ;De teller houdt het aantal telefoonnummers bij, als Teller op bv. 5 staat dan staan er 5 - 1 = 4 nummers in het geheugen (De 1 is al voor het volgende nieuwe nummer) DIM TelNr AS BYTE ;Bevat het te onderzoeken volgnummer van een compleet telnr. DIM WeergeefAdres AS BYTE ;Loopt door het geheugen tijdens weergeven, laat hierdoor EE_Adres intact DIM BD1 AS BYTE ;Byte Dummy 1 DIM BD2 AS BYTE ;Byte Dummy 2 ;Bit DIM BestaandNummer AS BIT ;Is hoog als na de bestaand-nummer controle het telnr. al bestaat DIM GeldigNummer AS BIT ;Is hoog als er een geldig telefoonnummer binnenkomt DIM TestMode AS BIT ;Is hoog als het programma in TEST-mode staat PORTA = 0 PORTB = 0 ;Alles uit CLEAR DELAYMS 500 ;LCD stabilisatie ;Opstart instellingen BackLight = ON ;LCD backlight aanzetten IF Toets = AAN THEN TestMode = TRUE ;Bij opstart de toets ingedrukt houden = TEST-mode aan CLS :PRINT "TESTMODE, u kunt" PRINT AT 2, 1, "toets los laten" WHILE Toets = AAN: WEND ;Wacht tot toets wordt losgelaten (Anders zou hij naar 'wissen' kunnen gaan) ENDIF CLS :PRINT "Nummermelder V-1" ;Programma naam en versie PRINT AT 2, 1, "www.picbasic.nl" DELAYMS 2000 ;Tijd voor bericht op LCD EDATA MinAdres, 0, 0, 16 ;EE_Adres, Teller op 0(!), LED uit, HIGH-NIB op 1 zetten (=16) (= Eerste telnr.) IF EREAD 1 = 0 THEN TestMode = TRUE ;Na het programmeren van de PIC meteen in TEST-mode GOTO WisNummers ;Na het programmeren van de PIC staat Teller de allereerste keer een 0 (door EDATA) alleen DAN naar wissen, hierna nooit meer omdat het EEPROM nummers kan bevatten na stroomuitval ENDIF EE_Adres = EREAD 0 ;Het EE_Adres zelf wordt op EEPROM adres 0 bijgehouden Teller = EREAD 1 ;Aantal telefoonnummers-teller staat op EEPROM adres 1 WeergeefAdres = MinAdres ;Het WeergeefAdres zelf begint op MinAdres IF EREAD 2 > 0 THEN LED = ON ;Als de LED aan was (voor stroomuitval), dan wéér aanzetten IF Teller < 2 THEN ;Als teller = 0 of 1 (1 betekent GEEN nummers) GOSUB GeenNummers ELSE GOSUB Scherm ENDIF GOTO Scan ;SUBROUTINES (In alfabetische volgorde) GeenNummers: CLS :PRINT "Geen nummers" GOSUB Test ;Zet "TEST" op het LCD als TestMode = TRUE RETURN Scherm: CLS :PRINT "Aanwezig ", DEC Teller - 1, " nr" IF Teller > 2 THEN PRINT "'s" ;2 = 1 aanwezig nr. + het nr. voor de nog te ontvangen telefoonnummer IF LED = OFF THEN PRINT AT 2, 1,"Geen nieuwe nr's" ;IF laten staan anders print hij "Geen nieuwe nummers" bij opstart als er wel nieuwe waren RETURN Test: IF TestMode = TRUE THEN PRINT AT 2,13, "TEST" RETURN ;HOOFDPROGRAMMA (Labels in alfabetische volgorde) GeheugenVol: IndexNummer = 0 ;RAM weer vrijgeven zodat een nieuw nummer nog wel op het LCD kan worden getoond PRINT AT 2, 1, "Geheugen vol" WHILE STD = ON: WEND ;Wacht tot STD laag is anders zou hij in de WHILE lus meteen naar NummerOntvangst gaan WHILE Toets = UIT ;Zolang er niet op Toets gedrukt wordt... INC BD1 DELAYMS 4 ;... om de seconde (4ms * 250)... IF BD1 > 250 THEN TOGGLE BackLight ;... de backlight... LED = BackLight ;... en de LED laten knipperen (ivm. een LCD zonder backlight) BD1 = 0 ENDIF IF STD = ON THEN NummerOntvangst ;Bij geheugen vol wordt nog wel steeds het laatst ontvangen nummer getoond WEND LED = ON GOTO Scan NummerCompleet: IF IndexNummer < RAM_Min THEN Scan;Een telefoonnummer moet uit minimaal aantal cijfers bestaan LED = ON ;'Nieuw ontvangen nummers' LED aanzetten EWRITE 2, [1] ;Geef ook aan EEPROM door dat LED aan is (ivm. stroomuitval) ;Onderzoek of het nummer al in het geheugen aanwezig is (Of het al "bestaat") EE_Teller = MinAdres ;Start waarde aan EE_Teller geven TelNr = 0 ;De telefoonNUMMER teller tijdens onderzoek WHILE TelNr < (Teller - 1) ;Teller bevat het aantal aanwezige telnr's incl. de nieuwe, deze gaat er dus nog vanaf (- 1) BestaandNummer = TRUE ;Ga er bij elk telnr. onderzoek van uit dat telnr. bestaat INC TelNr ;Volgende telefoonnummer BD1 = 0 ;Het hoeveelste CIJFER van het telefoonnummer tijdens onderzoek REPEAT INC BD1 ;Volgende cijfer van telefoonnummer IF Nummer[BD1] <> (15 & EREAD EE_Teller) THEN BestaandNummer = FALSE;Als het cijfer ongelijk is aan dat van de EEPROM, is het nummer dus ongelijk INC EE_Teller UNTIL (240 & EREAD EE_Teller) > 0 AND BD1 > RAM_Min;Vergelijk tot aan volgende nummer, maar niet de eerste paar (afh.van RAM_Min), omdat daar het volgnummer en het *N* (Nieuw) teken in staan IF IndexNummer <> BD1 THEN BestaandNummer = FALSE;Nieuw tel.nr is korter of langer dan die in EEPROM dus sowieso ongelijk IF BestaandNummer = TRUE THEN BREAK ;Nog steeds TRUE? Dan niet verder zoeken, het nummer bestaat al WEND IF BestaandNummer = FALSE THEN;Ontvangen nummer bestaat nog niet? Dan in EEPROM schrijven EWRITE EE_Adres + 1, [240];Maak alle 4 de bits vd. HIGH-NIB vh. 2e cijfer vh. telnr. hoog (=240) (='(op)nieuw' teken) BD1 = 1 REPEAT BD2 = (240 & EREAD EE_Adres) | (15 & Nummer[BD1]);Tel het cijfer (LOW-NIB) bij de HIGH-NIB gegevens even in BD2... EWRITE EE_Adres, [BD2] ;... en schrijf dit naar EEPROM INC BD1 IF EE_Adres < MaxAdres THEN INC EE_Adres ELSE GOTO GeheugenVol ENDIF UNTIL BD1 > IndexNummer INC Teller ;Verhoog de teller alvast voor een volgend telefoonnummer en... EWRITE EE_Adres, [Teller * 16];...zet dat nummer alvast op de eerste geheugenplaats voor dat nieuwe nummer in HIGH-NIB EWRITE 0, [EE_Adres, Teller, 1];Het EE_Adres zelf, de Teller en LED = 1 ook opslaan in EEPROM ELSE EE_Teller = MinAdres ;Stel EE_Teller op het adres vanwaar het moet beginnen met zoeken REPEAT ;Zoek op welk EEPROM adres het al bestaande nummer staat, om er het *N* teken te plaatsen BD1 = EREAD EE_Teller INC EE_Teller UNTIL BD1 >> 4 = TelNr ;Schuif de HIGH-NIB naar LOW-NIB zodat deze met TelNr kan worden vergeleken BD1 = 240 | EREAD EE_Teller;Maak alle 4 de bits vd. HIGH-NIB vh. 2e cijfer vd. telnr. hoog (=240) (='(op)nieuw' teken) EWRITE EE_Teller, [BD1] ;... en zet dit in EEPROM BD1 = 1 REPEAT TOGGLE LED ;Knipper, nummer bestaat al DELAYMS 100 INC BD1 UNTIL BD1 > 40 ;Even getal ENDIF WHILE STD = ON: WEND ;Wacht tot STD laag is anders zou hij in 'Scan' meteen weer naar 'NummerOntvangst' springen (in een lus komen) DELAYMS 50 ;Wacht tot STD echt goed laag is BestaandNummer = FALSE ;Voorkomt dat als na een BestaandNummer = TRUE, wordt gewist, het programma vastloopt GOTO Scan NummerOntvangst: DELAYMS 1 ;Wacht tot Q1...Q4 goed op de ingangen staat ;Een compleet nummer begint met een 'D', dan het nummer en eindigt met een 'C' (Compleet) DTMF = Q1 + (2 * Q2) + (4 * Q3) + (8 * Q4) ;0...15 = 0 tot 9, *, #, A, B, C en D ;Als (DTMF = 11 (= '*') en TestMode = waar) OF als DTMF = 0 (= 'D') dan... IF DTMF = 11 AND TestMode = TRUE OR DTMF = 0 THEN ;=D Als het een geldig telefoonnummer is dan... (Een ONgeldig telefoonnummer is bijv. de DTMF tonen tijdens het opbellen met de eigen huistelefoon CLS: PRINT "Nr:" ;Wis het display, zodat het nieuwe nummer kan worden getoond GOSUB Test ;Zet "TEST" op het LCD als TestMode = TRUE CURSOR 1, 4 ;Cursor weer achter "Nr:" neerzetten BackLight = ON ;LCD backlight aanzetten GeldigNummer = TRUE ;Een geldig telefoonnummer komt binnen WeergeefAdres= MinAdres ;Bij volgende keer bekijken van nummers weer van voren af aan beginnen ENDIF IF GeldigNummer = TRUE THEN ;Als er een geldig telefoonnummer binnenkomt dan... SELECT CASE DTMF CASE 0, 11 ;= D, *, (CASE 0 niet weghalen, ook niet door REM, anders gaat hij er via CASE ELSE uit) CASE 1 TO 10 ;= 0...9 cijfer, namelijk... IF DTMF = 10 THEN DTMF = 0;...een '10' uit de MT8870 betekent cijfer '0' PRINT DEC DTMF ;Zet het nieuw ontvangen nummer cijfer voor cijfer op het display INC IndexNummer ;Verhoog de index van array Nummer voor volgende cijfer Nummer[IndexNummer] = DTMF;Plaats cijfer van telefoonnummer zolang in RAM IF IndexNummer >= RAM_Max THEN NummerCompleet;Veiligheid, komt normaal nooit voor, zou betekenen dat telefoonnummer langer is dan RAM_Max ;CASE 13 TO 14 ;13=A 14=B CASE 12 IF TestMode = TRUE THEN NummerCompleet ;= #, werkt alleen in testmode CASE 15 ;= C, het nummer is Compleet GOTO NummerCompleet CASE ELSE GOTO Scan ;Anders zou hij in een lus terecht kunnen komen ENDSELECT ELSE GOTO Scan ENDIF TimeOut = TimeOutTijd WHILE STD = ON AND TimeOut > 0;Wacht tot STD laag wordt of tot de time-out DELAYUS 100 DEC TimeOut WEND TimeOut = TimeOutTijd WHILE STD = OFF ;Wacht tot STD hoog wordt, een nieuw cijfer is ontvangen DELAYUS 100 DEC TimeOut IF TimeOut = 0 THEN NummerCompleet;Na TimeOutTijd wordt het nummer als compleet aangenomen (= ontvangst van een D (WD1 = 15)) WEND GOTO NummerOntvangst ;Ga volgende cijfer van het telefoonnummer ontvangen Scan: BackLightTimer = BckLghtTijd ;Set backlight tijd GeldigNummer = FALSE ;Reset IndexNummer = 0 ;Reset het indexnummer van array Nummer BD1 = 0 REPEAT Nummer[BD1] = 0 ;RAM geheugen wissen INC BD1 UNTIL BD1 > RAM_Max WHILE 1 = 1 ;Normaal loopt het programma in deze lus, wachtend op toetsindruk of nummerontvangst IF Toets = AAN THEN ToetsRoutine IF STD = ON THEN NummerOntvangst IF BackLightTimer = 0 THEN ;Als tijd voorbij is... BackLight = OFF ;...backlight uitzetten ELSE DELAYMS 1 ;Vertraag iets voor de backlight timer DEC BackLightTimer ;DECrease backlight timer ENDIF WEND ToetsRoutine: BackLight = ON ;LCD backlight aanzetten BackLightTimer = BckLghtTijd;Stel tijd in voor de backlight vd LCD IF EE_Adres > MinAdres THEN ;Alleen uitvoeren als er telefoonnummer(s) aanwezig zijn WD1 = 0 REPEAT INC WD1 DELAYMS 10 IF LED = ON THEN WD1 = 0 ;Als alle nieuwe(!) nummers nog niet zijn bekeken, kan niet gewist worden (Tijd WD1 blijft 1) IF Toets = UIT THEN BREAK ;Als toets niet bedient is dan uit FOR-NEXT springen UNTIL WD1 = WisTijd IF WD1 >= WisTijd THEN Wissen;Als de WD1 teller v.d. FOR-WisTijd-NEXT helemaal is doorlopen moet het geheugen gewist worden (de toets is dan lang vastgehouden) Cijfer = EREAD WeergeefAdres CLS: PRINT AT 2, 1, "Nr:", DEC (Cijfer & 240) / 16, "/", DEC Teller - 1 ;, "-->", DEC EE_Adres 'Toon HIGH-NIB en Teller-1 BD1 = WeergeefAdres + 1 IF EREAD BD1 > 15 THEN PRINT " *N*" ;(Op)nieuw ontvangen dus zet *N* op het LCD en... BD2 = 15 & EREAD BD1 ;EREAD niet rechtstreeks in EWRITE (EWRITE BD1, [15 & EREAD BD1]) want dat werkt niet EWRITE BD1, [BD2] ;... wis het gelijk uit het EEPROM geheugen, het telnr. is immers nu gezien ENDIF GOSUB Test ;Zet "TEST" op het LCD als TestMode = TRUE CURSOR 1, 1 ;Zet cursor alvast op de goede plek REPEAT PRINT DEC Cijfer & 15 ;Alleen LOW-NIB tonen (HIGH-NIB bevat het hoeveelste telefoonnummer) INC WeergeefAdres ;Volgende cijfer van het telefoonnummer tonen... Cijfer = EREAD WeergeefAdres UNTIL Cijfer > 15 ;...tot een ander telefoonnummer IF (Cijfer & 240) / 16 = Teller THEN WeergeefAdres = MinAdres;Als laatste nummer wordt getoond dan toon de nr's in een lus, volgende keer weer het eerste nummer weergeven IF LED = ON THEN ;Als de LED aan is onderzoeken of er nog meer nieuwe nummers zijn, zoniet dan LED uit zetten EE_Teller = MinAdres ;Begin vanaf het eerste nummer te onderzoeken REPEAT IF 240 & EREAD EE_Teller = 240 THEN BREAK ;Er is nog een ander nieuw nummer: hoeft dus niet verder te onderzoeken INC EE_Teller UNTIL EE_Teller = MaxAdres ;Onderzoek tot het laatste adres IF EE_Teller = MaxAdres THEN LED = OFF;Als de hele lus doorlopen is betekent het dat er geen nieuwe nummers meer zijn, dus LED uit EWRITE 2, [0] ;Geef ook aan EEPROM door dat LED uit is (ivm. stroomuitval) ENDIF WHILE Toets = AAN: WEND ;Wacht tot de toets wordt losgelaten DELAYMS AntiDender WD1 = 0 REPEAT ;Als binnen KijkTijd geen toets wordt ingedrukt, valt hij terug in Scan lus INC WD1 DELAYMS 1 ;Vertraging voor zowel WD1 als BackLightTimer IF BackLightTimer = 0 THEN BackLight = OFF ELSE DEC BackLightTimer ENDIF IF LED = ON THEN WD1 = 0;Blijf eeuwig in deze lus als alle (nieuwe) nummers nog niet bekeken zijn IF Toets = AAN THEN ToetsRoutine ;Opnieuw deze routine in. Display volgend telefoonnummer IF STD = ON THEN NummerOntvangst ;Mocht tijdens bekijken gebeld worden, springen naar ontvangst routine UNTIL WD1 = KijkTijd IF LED = OFF THEN GOSUB Scherm;Als alle nummers bekeken zijn dan... WeergeefAdres = MinAdres ;Voor de volgende keer weer vanaf begin weergeven ENDIF GOTO Scan Wissen: CLS :PRINT "Nummers wissen?" PRINT AT 2, 1, "TOETS=Bevestigen" GOSUB Test ;Zet "TEST" op het LCD als TestMode = TRUE WHILE Toets = AAN :WEND ;Toets die nog is ingedrukt om in mode "wissen" te komen, moet eerst losgelaten worden DELAYMS AntiDender ;Toets moet goed vrij zijn anders gaat hij al meteen wissen BD1 = 200 WHILE Toets = UIT AND BD1 > 0 ;Zolang er niet op de toets gedrukt wordt EN de tijd nog niet voorbij is: WEND DELAYMS 20 DEC BD1 WEND IF BD1 = 0 THEN ;Wissen gecanceld, niet binnen de tijd op de toets gedrukt GOSUB Scherm ;Zet huidige toestand weer op het scherm GOTO Scan ENDIF WisNummers: CLS: PRINT "Nummers worden" PRINT AT 2, 1, "gewist!" GOSUB Test ;Zet "TEST" op het LCD als TestMode = TRUE EWRITE MinAdres, [16] ;HIGH-NIB (op EEPROM adres 3) op 1 zetten (=16) (= Eerste telnr.) EE_Adres = MinAdres + 1 REPEAT EWRITE EE_Adres, [0] ;Overige geheugen op 0 INC EE_Adres UNTIL EE_Adres > MaxAdres BD1 = 1 REPEAT ;LED 5x knipperen ten teken: gewist TOGGLE LED DELAYMS 200 INC BD1 UNTIL BD1 > 10 GOSUB GeenNummers ;Plaats 'Geen nummers' op het LCD EE_Adres = MinAdres ;De EE_Adres pointer weer op het eerste telefoonnummer adres zetten Teller = 1 ;'Aantal nummers' teller weer op 1 WeergeefAdres = MinAdres ;Het WeergeefAdres gelijk aan constante MinAdres maken LED = OFF ;Nieuwe nummers' LED uitzetten EWRITE 0, [EE_Adres, Teller, 0];Schrijf het ook naar EEPROM resp. EE_Adres, Teller, LED = 0 WHILE Toets = AAN: WEND ;Wacht tot de toets wordt losgelaten DELAYMS AntiDender GOTO Scan