picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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??
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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
Wendof 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...
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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?
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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.
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
Ik wil uiteindelijk dit
marcob
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
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.
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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 
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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?
marcob
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
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
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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.
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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.
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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%)]
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
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.
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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...
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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
Returnjorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
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"] picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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.
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
jorim23
Murphy's Law: Anything you try to fix will take longer and cost more than you think.
Ik krijg nu tijdens het compilen een foutmelding.
List index out of bounce(1)
Kan dat komen omdat ik een demoversie gebruik?
Marcel
AVR C tutorial http://expand.xs4all.nl/avr
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).
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
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.)
