Dit doet nog niet precies wat je verwacht omdat INKEY geen 'blockig instruction' is: met andere woorden het wacht niet totdat een toets wordt ingedrukt. Als er geen toets wordt ingedrukt, geeft 'ie het cijfer 16 terug en gaat meteen door met de verdere verwerking. Daar moet je dus op testen!

Een betere variant (declaraties e.d. weggelaten):


    While 1=1
        nummer = InKey
        DelayMS 50      ; De help zegt 50, hier kun je mee spelen...
        If nummer <> 16 Then
            ; Nu weten we zeker dat er een toets was ingedrukt! 
            Print 1,1,LookUp nummer,["123*456E789#*0#"]            
        End If
    Wend

OK als variabele is ongelijk aan 16 dus...

Ik heb het stukje code van Picsels net uitgeprobeerd maar elke keer als ik op een toets druk, krijg ik een toets in druk krijg ik eerst het nummer wat ik in druk en daarna 2, bijna zwarte, blokjes.
Waarom kan ik dan dus niet het programmatje van Fantomaz gebruiken?

O ja, als ik een paar keer een toets heb ingedrukt, gaat het nog buiten het schermpje door waardoor ik dus niet meer zie wat ik in toets.
Ik had ergens in de handleiding gelezen hoe ik de lengte en de aantal regels kon instellen, maar ik kan het nu niet meer vinden |:(. Weten jullie dat toevallig??

DECLARE LCD_LINES 1 , 2 , or 4 

Als het niet werkt, laat dan wel even de code zien die je hebt gefabriekt.
Want ik denk dat je twee zaken door elkaar hebt gebruikt.

En uiteraard ben je vrij om te gebruiken wat je wilt :-)
Alleen kunnen sommige constructies die op het eerste gezicht goed lijken, bij toekomstige uitbreiding/verandering onverwachte neveneffecten opleveren.

[edit]
Kleine correctie (krijg je als je zaken uit het hoofd doet): de blokjes ontstaan omdat 'at' in de print onbtreekt.
Dus het moet zijn:


   Print At 1,1,LookUp nummer,["123*456E789#*0#"]  

Je kunt de 'At 1,1,' ook weglaten. Dan zul je zien dat de toets die je indrukt er steeds bij komt, en niet meer van het scherm loopt:


   Print LookUp nummer,["123*456E789#*0#"]  

[edit 2]
Tot slot: na wat proberen komt er nog net wat meer bij kijken: je moet ook weer wachten tot de toets wordt losgelaten, anders detecteert het programma een aantal toetsaanslagen achter elkaar (en loopt 'ie van het display af).
Dit voorbeeld werkt (net zelf getest). Het wacht tot je een toets indrukt en weer loslaat. De toets die je hebt ingedrukt wordt op het display afgedrukt.

    Dim toets As Byte
    While 1=1
        toets = InKey
        If toets <> 16 Then
            'Ontdenderen; zie help.
            DelayMS 50
            ' Toets gedrukt; wacht op loslaten.
            While InKey <> 16
            Wend
            DelayMS 50
            ' En tonen van de ingedrukte toets
            Print LookUp toets, ["123*456E789#*0#"]
        End If        
    Wend

of nog beter:

    Dim toets As Byte
    While 1=1
        GoSub OphalenToets
        If toets > 0 Then Print toets
    Wend

    
OphalenToets:
    toets = InKey
    If toets = 16 Then
        toets = 0
    Else
        DelayMS 50
        While InKey <> 16: Wend
        DelayMS 10
        toets = LookUp toets, ["123*456E789#*0#"]
    End If
    Return

etc... etc... etc...

Hij loopt nog steeds van mijn beeldje af(na 23 plaatsen komt er pas iets op de volgende regel te staan).
Mijn idee was nu om de lengte in te vullen(Symbol LCD_Length=15) en vandaaruit dan verder te laten lopen(dus dat de letters die buiten de lengte vallen opgeslagen worden en later als lopende tekst worden weergegeven).

Nu heb ik nog 2 vraagjes.
1. Hoe moet ik de weggevallen letters opslaan in een tijdelijk opslagpunt?
2. Kan ik voor het omzetten van nummers naar letters(dus 2=a,b,c,A,B,C of 2), beter een array (als dat kan), of kan ik beter een Gosub gebruiken?

Op 16 oktober 2007 20:41:45 schreef jorim23:
1. Hoe moet ik de weggevallen letters opslaan in een tijdelijk opslagpunt?

Geef aan wat je precies wilt bereiken.
Dat is al 70% van de oplossing.

2. Kan ik voor het omzetten van nummers naar letters(dus 2=a,b,c,A,B,C of 2), beter een array (als dat kan), of kan ik beter een Gosub gebruiken?

Kan allemaal.
Je kunt ook nog de select/case gebruiken.
Er is in dit geval denk ik niet zoveel mis met de LOOKUP.

Wat wil je nog meer met de waarden doen, alleen op het dsplay zetten of ook verder verwerken.
Wat je zou kunnen doen is gelijk al de juiste ASCII waarde genereren. bv:


WHILE 1 = 1
 KEY = INKEY
 IF KEY <> 16 THEN
  VAR1 = LOOKUP KEY , [ 49, 50, 60, 42, 52, 53, 54, enz enz
  PRINT VAR1
 ENDIF
 KEY = INKEY
 WHILE INKEY <> 16 : WEND
WEND

Nog wel een teller bij houden als je 1e regel vol is om dan naar de volgende regel te gaan.

Now you're talking.
Nu we dit 'foutje' hebben gevonden, misschien handiger om daar dan ook verder te gaan.
Zijn de admins ook weer gerustgesteld dat we on topic blijven :-)

Volgens mij mis ik iets...
Moet ik dan eerst de ASCII codes in inkey zetten?
Weet de PIC dan ook bij welk nummer, welke letters horen?

De variabele KEY welke komt van het INKEY commando, heeft een waarde van 0 tot 15. Het heeft de waarde 16 als er geen toets wordt ingedrukt.
Stel dat nu een toest wordt ingedrukt welke een waarde 5 geeft, dan wordt door het commando LOOKUP de 5 ste waarde uit de rij geselecteerd. Dat is in mijn voorbeeld 52. Bij ASCII waarde 52 hoordt het symbool "4".

Snap je?

Effe uitzoeken welke waardes er bij welke toets horen

Je moet o.a.:

  • een buffertje aanleggen waar je de tekst in bewaard (array)
  • in een variabele het toetsnummer opslaan
  • in een andere variabele bijhouden hoe vaak de toets al is ingedrukt: 1e keer = A, 2e keer = B etc.; afhankelijk van de toets
  • in nog een variabele bijhouden hoe ver je al gevorderd bent (positie 1, 2, 3 etc.)
  • Hoofdletters tonen ja of nee

En op enig moment moet je de toets + het aantal aanslagen vertalen naar een letter.
Klein voorbeeldje (hier moet nog wel het e.e.a. aan uitgewerkt worden):

        Dim toets           As Byte
        Dim letter          As Byte
        Dim AantalIndrukken As Byte
        Dim DoCaps          As Bit

        '.....

        'Hoofdletters, dan 2e set tekens selecteren        
        If DoCaps Then AantalIndrukken = AantalIndrukken + 3

        'Nu de key + aantal indrukken vertalen naar een letter
        Select(toets)
            Case 1:  ' key 2 ingedrukt
                letter = LookUp AantalIndrukken,["abcABC"]        
            Case 2:  ' key 3 ingedrukt
                letter = LookUp AantalIndrukken,["defDEF"]        
            'etc...
        EndSelect

De PIC weet uiteraard niet welke nummers bij welke toetsen horen. Dat moet je zelf aangeven. Hierboven ga ik ervan uit dat toets '2' waarde 1 is, toets '3' waarde 2 etc.

Ik heb nu het volgende:

 Dim nummer                As byte 
 Dim letter                As Byte
 Dim AantalIndrukken       As Byte        
 Dim HoofdLetters          As Bit

 
 programma:
  nummer= lookup inkey, ["123*456#789*0#"]

    hoofdletters =  AantalIndrukken + 3

        Select nummer
            case 1:
                letter = lookup aantalindrukken,[",.?:!()1"]
            Case 2:  
                letter = LookUp AantalIndrukken,["abcABC2"]        
            Case 3:  
                letter = LookUp AantalIndrukken,["defDEF3"]
            Case 4:
                letter = lookup aantalindrukken,["ghiGHI4"]
            case 5:
                LETTER = LOOKUP aantalindrukken,["jklJKL5"]
;enzovoort
EndSelect

Hij compileerd en programmerd het zonder problemen, maar als ik het programmatje laat draaien wordt er niets weergegeven op mijn scherm al ik een toets in druk.
komt dat omdat ik

nummer= lookup inkey, ["123*456#789*0#"]

verkeerd heb staan? of is dat stukje helemaal niet goed?

@picsels: Bedankt voor het opstapje wat je me hebt gegeven.

Heb je het wel in een loopje staan, Jorim?

Je bedoeld zoieta als GoTo?

Sorry, was weer eens te snel.
Ik heb m nu in een While...Wend loop gezet. Zal eens kijken wat ie nu doet

[Bericht gewijzigd door jorim23 op (68%)]

Ja, of anders een while-wend. of repeat-untill oid
Je programma moet wel steeds door die inkey heenlopen om het ook te doen.
De PIC onthoudt het niet vanzelf.

Ik heb ze net in een GoTo loop gezet en in een While...Wend loop, maar ze doen het geen van tweeen. Kan het dan misschien zijn dat het niet werkt,omdat ik na de EndSelect geen Print " " heb gezet?
Nee werkt ook niet...

No problem.

Een tip: de complexiteit van wat je wilt zit hem niet in de juiste toepassing van de PICBASIC statements, maar in de logica en structuur van het programma.
Alle 'losse onderdelen' van je programma zijn al zo'n beetje aan bod geweest, alleen moet er nog een compleet programma van worden gemaakt. Het handigste is om stap voor stap je programma op te bouwen. (ICSP is a wonderful thing...)

Ter illustratie een aanvang, waar je zelf nog het nodige aan moet toevoegen.

    Dim Toets           As Byte
    Dim Teken           As Byte
    Dim AantalIndrukken As Byte
    Dim VorigeToets     As Byte
    Dim AantalTekens    As Byte

    Clear        
    VorigeToets = 255                   'Dummy met waarde > 16
    AantalTekens = 0
    
    While 1 = 1
        'Wacht tot een toets is ingedrukt
        GoSub OphalenToets   
        
        'Drukken we voor de 2e keer (of vaker) dezelfde toets in?
        If Toets = VorigeToets Then
            'Schuif door naar het volgende teken onder dezelfde toets
            Inc AantalIndrukken
            
            'Pas op dat we niet hoger komen dan het maximum aantal letters per toets.
            'Als dat gebeurt, dan weer met de 1e letter beginnen.
            If AantalIndrukken > 6 Then AantalIndrukken = 0
        Else
            'De net ingedrukt toets wijkt af van de vorige. Dus de vorige letter
            'laten we staan op de LCD en we gaan door met de volgende.
            Inc AantalTekens
            
            'Dit is een nieuwe toets, dus de 1e keer dat die is ingedrukt.
            AantalIndrukken = 0
            
            'En de toets die net is ingedrukt, bewaren we voor de volgende keer.
            'Dan kunnen we zien dat we hem voor de 2e keer (of vaker) indrukken.
            VorigeToets = Toets            
        End If
        
        'Zo, de toetsindruk is bepaald. We kunnen nu het bijbehorende
        'teken opzoeken en op de LCD afdrukken.
        GoSub VertaalToetsNaarTeken
        GoSub TekenOpLCD
    Wend
    
'Wacht tot er daadwerkelijk op een toets is gedrukt.    
'We vertalen de toets nog niet naar een letter. Dat doen we in 
'het hoofdprogramma.
OphalenToets:
    Repeat
        Toets = InKey
        'Als een toets is ingedrukt, wacht dan tot die weer is losgelaten.
        If Toets <> 16 Then
            DelayMS 50
            While InKey <> 16: Wend
            DelayMS 10
        End If
    Until Toets <> 16
    Return        
    
'Op basis van de toets die is ingedrukt, en het aantal malen dat die is
'ingedrukt, vertalen we die naar een bepaald teken.  
'Let op dat we maximaal 7 tekens per toets toestaan.  
VertaalToetsNaarTeken:    
    Select Toets          
        Case 0:  ' key 1 ingedrukt
            Teken = LookUp AantalIndrukken,[".,?!<>@"]        
        Case 1:  ' key 2 ingedrukt
            Teken = LookUp AantalIndrukken,["abcABC2"]        
        Case 2:  ' key 3 ingedrukt
            Teken = LookUp AantalIndrukken,["defDEF3"]        
        'etc...
    EndSelect
    Return

'Afdrukken van het huidige teken op het LCD op de juiste positie.
TekenOpLCD:
    Print At 1,AantalTekens,Teken
    Return

Ik heb m nu bijgewerkt, maar ik krijg elke keer de volgende foutmelding:
Misplaced Case command!
Hij zegt dat deze fout is:

            Case 0:  ' key 1 ingedrukt
                Teken = LookUp AantalIndrukken,[".,?!@1"] 

Dan heb je er omheen waarschijnlijk iets niet goed staan.
Ik heb letterlijk copy/paste gedaan vanuit de IDE en dit compileert beslist!
We hebben het toch over de Proton+ PICBASIC compiler?

[Edit]
Ik vermoed dat je in delen hebt gekopieerd en dat 'Select Toets' is weggevallen.
Dan krijg je die melding.

You don't fool me.
Ik ken mijn pappenheimers >:)

Ik krijg nu tijdens het compilen een foutmelding.
List index out of bounce(1)
Kan dat komen omdat ik een demoversie gebruik?

bounce? Staat die te springen dan? Ik neem aan bounds. Kan google je daar niets over vertellen, daar geloof ik niets van.

Nou vooruit dan maar. Je gebruikt een lijst met een aantal elementen. Die lijst heeft een bereik. Bijvoorbeeld van 1 t/m 3. Jij kiest vervolgens het element op index 4. Index 4 valt dan buiten het bereik van de lijst. Gevolg index is buiten bereik (List index out of bounds).

Overigens gaat het waarschijnlijk niet lukken om wat je wilt, te stoppen in maar 50 regels code.
(Tenzij die regelbeperking er inmiddels uit is gehaald.)