PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM & T6963C GLCD Problem



Lightningman
18.11.2006, 15:27
Hi Leute,

Wie kann ich einzelne Kommandos an ein T6963C basierendes
GLCD schicken?

Zum Beispiel würde ich gerne bei einem Menu eine ausgewählte Zeile
invers darstellen. Das würde mit einer XOR Bitverknüpfung sehr schön
gehen. Leider sehe ich aber nicht wie man daß in BASCOM anstellen
kann. Gleiches gilt auch für die Cursorhöhe (1-8 "lines") und das
Display dunkel schalten (Display off). Sogar blinken des Display
beherrscht der T6963C. Nur wie sage ich es meinen Display ?

Ich möchte ungerne einen zweiten (=inversen) Zeichensatz erstellen
müssen, um eine Zeile invers darzustellen ;o)) und meine ASM
Kenntnisse reichen nicht aus, um Änderungen an der GLCD.lib
vorzunehmen, geschweige den eine ganz neue LIB zu schreiben.


Ein kleines Beispiel oder ein kurzes Code-Snipplet wären super.

viele internette Grüße,
Reinhard

x-ryder
19.11.2006, 19:39
ldi r24,&H80
rcall _GWrite_Cmd

das isses ^^
r24 issn register, wo das command reingeschrieben wird, und das rcall verwendet das ganze dann, umn command ans display zu senden, dieses command setzt den modus auf "OR", also den normalen, möchtest du XOR haben wärs dann &H81, das du in r24 schreiben muss

und die anderen commands kannste dann im datenblatt nachschaun :)

Martin

Lightningman
19.11.2006, 21:20
Hallo Martin,


ldi r24,&H80
rcall _GWrite_Cmd

das isses ^^
r24 issn register, wo das command reingeschrieben wird, und das rcall verwendet das ganze dann, umn command ans display zu senden, dieses command setzt den modus auf "OR", also den normalen, möchtest du XOR haben wärs dann &H81, das du in r24 schreiben muss

und die anderen commands kannste dann im datenblatt nachschaun :)

Martin

Danke erstmal dafür. Leider (wahrscheinlich zeige ich hiermit voll meine
Dämmlichkeit in Sachen Assembler ;o)) funzt es nicht. Anbei mein
Versuch:

$crystal = 16000000
$regfile = "M128def.dat"

Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portb , Ce = 3 , Cd = 0 , Wr = 2 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6

Cls
Locate 10 , 2

$ASM
ldi r24,&H81
rcall _GWrite_Cmd
'$End ASM

Lcd "Diese Zeile sollte Invers dargestellt sein"
Wait 3

$ASM
ldi r24,&H80
rcall _GWrite_Cmd
$End ASM

Locate 15 , 2
Lcd "und diese wieder normal"

Wait 10
End

Leider sind beide Zeilen komplett normal. Wat mach ich falsch?

viele internette Grüße,
Reinhard

x-ryder
19.11.2006, 21:24
du kannst nicht einfach nen text invers darstellen, du musst den nachm XOR und shcreiben mit schwarz übermalen, also mach einfach mal das ganze display schwarz, wenn du den XOR anhast und den text geschrieben

Martin

Lightningman
19.11.2006, 23:40
Hallo Martin,


du kannst nicht einfach nen text invers darstellen, du musst den nachm XOR und shcreiben mit schwarz übermalen, also mach einfach mal das ganze display schwarz, wenn du den XOR anhast und den text geschrieben

Martin

Das ist jetzt NICHT Dein Ernst, oder ?? Ich will ein Auswahlmenu basteln.
In etwa so:

Hauptmenu:
--------------
>1.) Auswahl 1 <<-- nur DIESE Zeile soll inverse sein
2.) Auswahl 2
3.) Auswahl 3
usw.

Der ">" stellt einen graphischen Cursor da, der mittels Encoder auf und
ab bewegt werden kann. Je nach Menupunkt bewirkt ein Drücken des
Encoderknopfs ein Toggeln, Auswahl oder Sprung in ein weiteres Menu.

Zusätzlich sollen rechts neben den Menuzeilen, zur Verdeutlichung, einige
Icons stehen. Bei einigen Menus sitzt rechts daneben ein kleiner Graph
(z.B. Strom / Spannungsverlauf, etc) Das alles verschwindet doch, wenn
ich den Bildschirm schwarz "Pinsel" bevor ich die eine einzige Zeile
invers darstelle.

Gibts da wirklich keine andere Möglichkeit? Es müssen doch schon
Leute ein Auswahlmenu gebastelt haben =P~

Übrigens hatte ich mal den Hexcode für einen 2 Line Cursor (anstelle
volle 8 Linien) eingegeben (in den Code von oben). Da hat sich aber
leider auch nix geändert.

viele internette Grüße,
Reinhard

x-ryder
20.11.2006, 09:32
ne, du musst doch nur dein menü aufbauen und dann über die merkierte zeile schwarz drüberzeichnen, dann iss die zeile wo text und grafik sind invers...

martin

Lightningman
26.11.2006, 02:29
Hallo Martin,


ne, du musst doch nur dein menü aufbauen und dann über die merkierte zeile schwarz drüberzeichnen, dann iss die zeile wo text und grafik sind invers...

martin

Sorry für die späte Antwort. Beruflich bedingt komme ich im Augenblick
nur noch an den WE zum spielen ;o(

Ich habe daß, was Du oben vorgeschlagen hast, versucht, aber leider
ohne Erfolg. Evtl. happert es an meinem Verständnis über was Du mit
dem Kommentar "zeile schwarz drüberzeichnen" meinst. Meinst Du jetzt
Pixelweise (sprich mit PSet)? Oder meinst Du Blockweise (sprich den 6x6
oder 8x8 "font" Feld in der Länge der kompletten Zeile?

Könntest Du mir bitte ein Codesnipplet zukommen lassen (nur rein fürs
"zeile schwarz drüberzeichnen")? Danke!

viele internette Grüße,
Reinhard

x-ryder
26.11.2006, 18:06
$crystal = 16000000
$regfile = "M128def.dat"

Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portb , Ce = 3 , Cd = 0 , Wr = 2 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6

dim x as byte
dim y as byte

Cls
Locate 10 , 2

ldi r24,&H81
rcall _GWrite_Cmd

Lcd "Diese Zeile sollte Invers dargestellt sein"
for x = 1 to 240
for y = 1 to 128
pset x, y, 255
next y
next x
Wait 3

ldi r24,&H80
rcall _GWrite_Cmd

Locate 15 , 2
Lcd "und diese wieder normal"

Wait 10
End

das wäre jetz fürs ganze display, und du wirst das zweite nun nich sehen, weil das ja wieder geodert iss, du müsstest dir jetz mal ne funktion schreiben sub writeinvers(text as String *20, xloc as byte, yloc as byte) oder so, die an der stelle x,y (mit locate dann intern) was hinschreibt, den modus wechselt und nur da drübermalt, und dann den modus wieder ändert

Martin

Lightningman
03.12.2006, 00:11
Hi Martin et all,

Ich danke Dir für die Hilfe. Mein Problem war letztendlich, daß ich in der
Sub vergessen hatte die Werte mit Byval zu übergeben. Hier ist mein jetziger (funktionsfähiger ;o) Code:



$crystal = 16000000
$regfile = "M128def.dat"

Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portb , Ce = 3 , Cd = 0 , Wr = 2 , Rd = 1 , Reset = 4 , Fs = 5 , Mode = 6

Declare Sub Text_2_lcd(text As String , Byval Xloc As Integer , Byval Yloc As Integer , Byval Invert_it As Integer)

Dim Text As String * 40

Cursor Off
Cls
Gosub Menu

Do
Loop

End

Sub Text_2_lcd()
Dim X As Integer , Y As Integer
Dim X_start As Integer , Y_start As Integer , X_start_old As Integer , Y_start_old As Integer
Dim X_stop As Integer , X_stop_old As Integer , Y_stop As Integer , Y_stop_old As Integer

If Invert_it = 1 Then
Locate Yloc , Xloc ' WTF! First y and then x? No sensible person writes this way :( Geez!
ldi r24,&H81
rcall _GWrite_Cmd
Lcd Text
X_start = Xloc * 6
X_start = X_start - 6
X_start_old = X_start ' Store values in a new variable as we need to remove the black bar once the item should no longer be highlighted
X_stop = 6 * Len(text)
X_stop = X_stop + X_start
X_stop_old = X_stop
Y_stop = Yloc * 8
Y_stop_old = Y_stop
Y_start = Y_stop - 8
Y_start_old = Y_start
For X = X_start To X_stop
For Y = Y_start To Y_stop
Pset X , Y , Invert_it
Next Y
Next X
Else
ldi r24,&H80
rcall _GWrite_Cmd
For X = X_start_old To X_stop_old
For Y = Y_start_old To Y_stop_old
Pset X , Y , Invert_it
Next Y
Next X
Locate Yloc , Xloc 'WTF! First y and then x? No sensible person writes this way :( Geez!
Lcd Text
End If
End Sub

Menu:
Text = "Dieser Text ist Inverse"
Call Text_2_lcd(text , 3 , 7 , 1)
Text = "und diese wieder normal"
Wait 3
Call Text_2_lcd(text , 3 , 8 , 0)
Text = "inverse is sooooo cool"
Call Text_2_lcd(text , 3 , 9 , 1)
Return



Vielleicht kann es ja einer brauchen. Das Sub funzt folgendermaßen:

Call Text_2_LCD (Text,x,y,Inverse). Damit wird der Text auf dem
Display an der Position x,y angezeigt. Der Code prüft wie lange der
eigentliche Text ist und macht den schwarzen Balken, womit der Text
invertiert wird, nur so lang wie nötig. Ist der nächste Parameter eine 1,
dann wird der Text invers dargestellt. Gleichzeit merkt sich der Code,
wo invers dargestellt wurde. Sobald die nächste Zeile wieder normal
aussehen soll wird der schwarze Balken (Pset) entfernt. Sprich das
inverse wird aufgehoben.

Ich werde es jedenfalls nicht benutzen.

Das Ganze wird viel zu aufwendig. Ich wollte eigentlich ein Menu
aufbauen und dann mittels einem Rotary Encoders die Zeile, die
verändert werden soll, auswählen (==>invers darstellen) und beim
drücken des Encoder Knopf ins Untermenu springen bzw eine Funktion
ein oder ausschalten.

Das Ganze geht mit Zahlen vor dem Menupukt und einem Keypad als
Spannungsteiler verdrahtet (Abfrage über ADC) viel schneller. Den
Code hatte ich in fünf Minuten geschrieben ;o))

Schade, daß gerade bei solchen einfachen Sachen BASCOM-AVR so
eingeschränkt ist. Auch solche Sachen, daß beim Locate erst der
Y Parameter kommt und dann der X Parameter, ergeben für mich
keinen Sinn. Evtl könnte Mark mal die GLCD Library ein wenig aufpeppen.

viele internette Grüße,
Reinhard