Ik heb het volgende stukje code:

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE 

lcd_rspin                 = porta.4
lcd_enpin                 = porta.3

 ALL_DIGITAL = True					
 delayms 500
Cls
While 1 = 1
       	PRINT at 1,1,@ Lookup INKEY [1,2,3,"*",4,5,6,0,7,8,9,"#",0,0,0], "  "
        PRINT at 2,1,Lookup INKEY,["123*456E789#A0BC "]
Wend

Nu het volgende: Als de code om is gezet in een .Hex file en ik laat m draaien(het programmatje) dan klopt hij denk ik niet helemaal.
Hij laat op de eetste regel keurig zien welk nummer ik intoets maar daar achter staat de hele tijd 35.
Wie kan mij vertellen waarom dat zo is en hoe ik het weg kan halen?

Hij laat trouwens in plaats van een * een 0 zien, waarbij op de 2de regel een A staat en voor een # hetzelfde maar dan met een B. Hoe krijg ik het voor elkaar om daar een * en een # van te maken?

Ook begind het programma elke keer als ik de spanning erop zet met een 5. Hoe kan ik het zo krijgen, dat het bij het begin gewoon blanco is?

Alle datalijnen (DB4, DB5, DB6 en DB7) correct aangesloten?

Als het picbasic is, kopieer dan svp je werkende code.
Want wat je nu hebt neergezet compileert niet; de 1e printregel is fout: een @ teveel en een ',' te weinig.

Raar, bij mij compilerd hij hem wel. Ik gebruik de lite versie van proton(had ik er trouwens niet bijverteld, sorry daarvoor).

Exwieze me;), foutje inderdaad. Dit moet de goede zijn.

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE 

lcd_rspin                 = porta.4
lcd_enpin                 = porta.3

 ALL_DIGITAL = True					
 delayms 500
Cls
While 1 = 1
   PRINT at 1,1,@ Lookup INKEY, [1,2,3,"*",4,5,6,0,7,8,9,"#",0,0,0], "  "
   PRINT at 2,1,Lookup INKEY,["123*456E789#A0BC "]
Wend

[Bericht gewijzigd door jorim23 op (66%)]

Da's zeker bijzonder.

Waarom heb je de beide print-regels anders neergeschreven?
De 1e met een @ en géén komma na de INKEY.
De 2e printregel ziet er anders (en beter) uit.

Als je verkeerde tekens ziet, kun je ze toch eenvoudigweg omdraaien in de string tussen de haken []?

Op 13 oktober 2007 22:04:47 schreef picsels:
Waarom heb je de beide print-regels anders neergeschreven?
De 1e met een @ .
De 2e printregel ziet er anders (en beter) uit.

Omdat ik dan op de eerste regel alleen een blokje krijg en geen nummer(de 53 aan t eind is dan overgins weg)

Als je verkeerde tekens ziet, kun je ze toch eenvoudigweg omdraaien in de string tussen de haken []?

Hoe bedoel je dat?

Omdat ik dan op de eerste regel alleen een blokje krijg en geen nummer(de 53 aan t eind is dan overgins weg)

Is dat dan ook wat je wilt?

Hoe bedoel je dat?

Als je een '*' krijgt, en je verwacht een '0', dan moet je die twee omdraaien in de string die tussen haken staat.
Dus zoiets:

   Print At 2,1,LookUp InKey,["1230456E789#A*BC "]

(sterretje en de nul zijn omgedraaid)

Op 13 oktober 2007 22:34:35 schreef picsels:
[...]
Is dat dan ook wat je wilt?

Nee, ik wil het nummer zien die ik op dat moment heb ingedrukt(en uiteindelijk letters, maar dat komt later wel)

[...]
Als je een '*' krijgt, en je verwacht een '0', dan moet je die twee omdraaien in de string die tussen haken staat.
Dus zoiets:

   Print At 2,1,LookUp InKey,["1230456E789#A*BC "]

(sterretje en de nul zijn omgedraaid)

Ik wil, als ik * indruk een * zien, maar dat wil niet lukken(hetzelfde geld voor het hekje). Ik heb t ook al eens geprobeerd met de ASCII codes, maar dat werkte ook niet.

Je moet weten welke toets welk nummer oplevert.
Dus voer het onderstaande programma uit en druk een keer op iedere toets:


    While 1 = 1
        Cls
        Print At 1,1,Dec InKey
    Wend            

Nu weet je precies welke toets welk getal (0..15) oplevert.
In deze volgorde zet je de overeenkomstige tekens in de string achter de lookup.

Kijk in de help bij het voorbeeld bij 'inkey'. De belangrijkste zin is:

The above example is only a demonstration, the values inside the LOOKUP command will need to be re-arranged for the type of keypad used, and it's connection configuration.

Dat werkt niet bij mij. Als ik dan een toets in druk(van mijn matrix bordje) komt er niks te staan.

Variantje:

    Dim toets As Byte
    While 1 = 1
        toets = InKey
        If InKey <> 16 Then
            Cls
            Print At 1,1,Dec toets
        End If
    Wend            

Had even niet opgelet (de inkey is geen blocking instruction.)
Hiermee zou er toch wat moeten verschijnen, anders is er hardwarematig iets niet goed.

[Bericht gewijzigd door picsels op (11%)]

Ik mis hier het lookup commando.
Hoe weet de PIC dan welke volgorde er aangehouden moet worden cq wat hij moet "printen"?

Op 14 oktober 2007 10:32:23 schreef Fantomaz:
Ik mis hier het lookup commando.

Ik mis nog veel meer.
Ik hoop toch dat het programma meer doet dan alleen cijfers op een LCD zetten.

Bovenstaand voorbeeld is bedoeld om te zien welke toets, welke waarde oplevert. Vervolgens kun je daarmee in de lookup de cijfers en tekens in de goede volgorde zetten.

Ik heb het stukje code geprobeert. Hij werkt wel maar t is niet helemaal wat ik bedoel.

Het stukje wat er na INKEY komt, in de code die ik heb, klopt opzich wel(dus als ik de 1 indruk, krijg ik ook een 1), maar wat er niet klopt is dat ik in plaats van een * een 0 zie staan en op de 2de regel een A. Dat is ook zo bij het hekje alleen zie ik dan op de 2de regel een B.

Verder begint het programmatje elke keer bij 5 en staat er achter elk nummer wat ik in druk een 35(dus zoiets als, 5 35 of 1 35).

Ik weet dus niet hoe ik die 35 weg kan halen en hoe ik een * of een hekje zichtbaar maak, als ik deze in druk.

Oke, ik ben nu zo ver dat ik op de 2de regel wel een * en een hekje zie staan, maar als ik het volgende stukje programmeer,

 	PRINT at 1,1,@ Lookup INKEY,[1,2,3,0,4,5,6,0,7,8,9,0,"*",0,"#"], "  "
   	PRINT at 2,1,Lookup INKEY,["123*456E789#*0#C"]

zie ik op de eerste regel, bij het indrukken van het * of hekje, de ASCII code staan(dus 42 en 35). Wannneer ik de toets weer los laat veranderd nummer 42(*) in 2 en nummer 35(hekje) in 5. Rara politiepet.

Als je nou die waarden eerst in een variabele zet en je gooit daar een voorwaarde tegenaan, zou je de hekjes en de sterretjes kunnen aanpassen naar wat anders, voor ze weer te geven op je schermpje.

Na eindeloos gestoei werkt het eindelijk:)
Dit was uiteidelijk de code:

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE 

delayms 500
Cls

lcd_rspin                 = porta.4
lcd_enpin                 = porta.3
				
While 1 = 1
  	PRINT at 1,1,Lookup INKEY,["123*456E789#*0#"]
   	PRINT at 2,1,Lookup INKEY,["123*456E789#*0#C"]
Wend

Mensen bedankt voor de hulp.

Leg nu de werking eens uit, Jorim.
Want ik heb het gevoel dat er iets mist.
Waarin registreert de PIC nou dat er een toets ingedrukt wordt?
En waarom heb je nou 2 regeltjes met nagenoeg dezelfde code? (met en zonder de "C")

Het registeren van een toetsindruk doet de instructie INKEY.
Maar het stukje code dat hier geschreven is vind ik onlogisch, of er ontgaat me wat.

Jorim had nogal wat problemen met (volgens mij) zijn volgorde van cijfers.
Het eindresultaat ontgaat me ook volledig en we hebben hier ook nog wat mailcontact over.

In ieder geval had het weglaten van het "@" teken resultaat.
Ik realiseer me nu; Is dat niet het tekentje voor wanneer je iets als ASCII wilt weergeven?
Het zou wel verklaren waarom er steeds de ASCII code's van hekje en sterretje voorbij kwamen.

Het at teken (@) kan voor DEC in de plaats komen (niet DEC van decrement maar van decimaal.

Dus:
PietJanHein = 1234
PRINT DEC PietJanHein

geeft hetzelfde resultaat als:
PietJanHein = 1234
PRINT @PietJanHein

Let hier wel op dat het @ teken zonder spatie vast aan de variabele moet zitten.

Op 15 oktober 2007 00:37:08 schreef Frits Kieftenbelt: Maar het stukje code dat hier geschreven is vind ik onlogisch, of er ontgaat me wat.

Ik veronderstel dat dit een beetje spielerei is; kijken hoe e.e.a. werkt.
Sowieso is het beter om het resultaat van de INKEY in een variabele te proppen. Kun je er ook nog bepaalde conditionele acties aan koppelen.

En daarbij is het ook weer beter om dit in een subroutine te doen. Hoef je het maar één keer te programmeren, kun je er op verschillende plekken gebruik van maken en heb je in je programma niet de overhead van 2x (of vaker) de LOOKUP en de string-opslag.

Zou ik dan beter zoiets kunnen maken als:

 Dim Nummer as BYTE
Nummer = lookup inkey,["123*456E789#*0#"]

;Programma
While 1=1
 print Nummer
Wend

Nee, je moet die inkey in de loop zetten.
Anders leest hij hem maar een keer uit en komt hij daarna in de loop. (een fractie van een seconde, nadat je de PIC opstart)


Dim Nummer as BYTE
Programma:
While 1=1
 Nummer = lookup inkey,["123*456E789#*0#"]
 print Nummer
Wend

Ik weet dat dit lijkt op hoe je het eerst had (print inkey etc), maar wat Picsel ook al aanhaald, kun je de variabele eerst nog bewerken.
Ik weet dat dat je bedoeling is. :-)

Je kunt dan in die loop die variabele controleren en kleine subloopjes maken.
Daarin kun je tellen hoevaak de toets ingedrukt wordt waardoor je weer een ander karakter kunt gebruiken.
Bij toets "2" dus:
1x = A
2x = B
3x = C
4x = 2