Touch Grafik LCD mit AVR
13369-mal angesehen • Hochgeladen: 23.09.2008
Auf LEDSEE.com habe ich mir ein Touch LCD Display mit 128x64 Pixel bestellt. Das Display wird bei mit als Fernbedienung für einen Hausbus verwendet. Das Display lässt sich einfach an einen AVR Mikrocontroller anschließen. Ein Port für die Daten und 6 Controllleitungen + 4 ADC Channels für die Touch auswertung. Ich habe ein ATMEGA32 genommen, der allerdings schon rand voll ist, Dabei hab ich PORTD für die Controllregister, PORTC für die Daten und PORTA für den Touch genommen.
Source Datein mit HEX und Schaltplan. Download.
Datenblatt von LEDSEE.com
Update 5.1.2010
Ich hab heute mal meinen Quellcode und den Schaltplan hochgestellt. Ihr könnt die Datein einfach als Zip runterladen.
Quellcode Zeigen
$regfile = "m32def.DAT"
$crystal = 8000000
$swstack = 75
$hwstack = 100
$framesize = 40
$baud = 9600
Config Portc = Output
Config Porta = Output
$lib "glcdKS108.lbx"
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 2 , Ce2 = 3 , Cd = 5 , Rd = 4 , Reset = 6 , Enable = 7
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Setfont Font8x8
Dim X As Word , Y As Word
Dim X1 As Byte , Y1 As Byte
Dim C As Byte , R As Byte
Dim Fld As Byte
Dim Audiopegel As Byte
Dim Radiofreq As Byte
Dim Rfreqbuff As Single
Dim Penter As String * 5
Dim Parr(5) As Byte At Penter Overlay
Dim Pidex As Byte
Dim Peinzelchar As Byte
Dim Roomname As String * 15
Dim Temp(12) As Byte
Dim Tempindex As Byte
Dim Tempbuffer As Byte
Dim T1 As Byte
Dim T2 As Byte
Dim Buffer(4) As Byte
Dim Bufferindex As Byte
Dim Pwr(15) As Byte
Dim Pwrindex As Byte
Dim P1 As Byte
Dim P2 As Byte
Dim P3 As Byte
Dim Bupwr As Byte
Dim Menu As Byte
Dim I As Byte
Dim Ia As Byte
Dim Modus As Byte
Readeeprom Modus , 2
Readeeprom Audiopegel , 3
Readeeprom Radiofreq , 4
If Modus = 255 Then
Modus = 90
End If
If Audiopegel = 255 Then
Audiopegel = 0
End If
If Radiofreq = 255 Then
Radiofreq = 0
End If
For I = 51 To 75
Ia = I - 50
Readeeprom Pwr(ia) , I
Next
For I = 1 To 15
If Pwr(i) = 255 Then
Pwr(i) = 0
Ia = I + 50
Writeeeprom Pwr(i) , Ia
End If
Next
For I = 81 To 90
Ia = I - 80
Readeeprom Temp(ia) , I
Next
For I = 1 To 10
If Temp(i) = 255 Then
Temp(i) = 0
Ia = I + 80
Writeeeprom Temp(i) , Ia
End If
Next
Waitms 2
Cls
Modus = 0 '' tag
Showpic 0 , 0 , Pin
For I = 0 To 4
Parr(i) = 0
Next
Penter = ""
Lcdat 7 , 55 , " "
Pidex = 0
Do
Gosub Readtouch
If X > 120 And X < 420 And Y > 580 And Y < 750 Then
If Penter = "1111" Then
Exit Do
Else
For I = 0 To 4
Parr(i) = 0
Next
Penter = ""
Lcdat 7 , 60 , " "
Pidex = 0
End If
Else
Select Case X
Case 120 To 260
C = 1
Case 280 To 420
C = 2
Case 440 To 590
C = 3
Case 620 To 760
C = 4
Case 780 To 920
C = 5
Case Else
C = 0
End Select
Select Case Y
Case 170 To 350
R = 10
Case 370 To 540
R = 20
Case Else
R = 0
End Select
Fld = R + C
If Fld = 0 Then
''Print "X: " ; X ; " Y: " ; Y
Else
Peinzelchar = 11
Select Case Fld
Case 11
Peinzelchar = "1"
Case 12
Peinzelchar = "2"
Case 13
Peinzelchar = "3"
Case 14
Peinzelchar = "4"
Case 15
Peinzelchar = "5"
Case 21
Peinzelchar = "6"
Case 22
Peinzelchar = "7"
Case 23
Peinzelchar = "8"
Case 24
Peinzelchar = "9"
Case 25
Peinzelchar = "0"
Case Else
'' Print "X: " ; X ; " Y: " ; Y
End Select
If Peinzelchar <> 11 Then
If Pidex => 4 Then
Else
Incr Pidex
Parr(pidex) = Peinzelchar
End If
Lcdat 7 , 65 , Penter
Waitms 70
End If
End If
End If
Next
Waitms 300
Menu = 1
Showpic 0 , 0 , Mm
''main menu''
Do
Gosub Readtouch
Gosub Conttouch
Next
Conttouch:
''deutung der analog werte
Select Case Menu
Case 1 ''hauptmenü
Select Case X
Case 120 To 565
C = 10
Case 566 To 920
C = 20
Case Else
C = 0
End Select
Select Case Y
Case 280 To 450
R = 1
Case 451 To 640
R = 2
Case 641 To 810
R = 3
Case Else
R = 0
End Select
Fld = R + C
Select Case Fld
Case 11
''multimedia
Gosub Showmmmenu
Case 12
''licht
Gosub Showlightmenu
Case 22
''modi
Gosub Showmodi
Case 13
''heizung
Gosub Showheizung
Case 23
''extras
Gosub Showextras
End Select
Case 2
If X > 840 And X < 930 And Y > 666 And Y < 820 Then
Waitms 300
Gosub Showmm
Else
If X > 110 And X < 550 Then
Select Case Y
Case 290 To 400
Pwrindex = 1
Roomname = "Kuche"
Gosub Showlgtmenu
Case 401 To 510
Pwrindex = 4
Roomname = "Wohnzimmer"
Gosub Showlgtmenu
Case 511 To 615
Pwrindex = 7
Roomname = "Esszimmer"
Gosub Showlgtmenu
Case 616 To 720
Roomname = "Bad"
Pwrindex = 10
Gosub Showlgtmenu
Case 721 To 820
Roomname = "Flur"
Pwrindex = 13
Gosub Showlgtmenu
End Select
End If
End If
Case 4
Select Case Y
Case 590 To 825
R = 2
Case 260 To 495
R = 1
Case Else
R = 0
End Select
Select Case X
Case 130 To 262
C = 10
Case 300 To 447
C = 20
Case 500 To 637
C = 30
Case 770 To 912
C = 40
Case Else
C = 0
End Select
Fld = R + C
If Fld = 11 Or Fld = 21 Or Fld = 31 Or Fld = 42 Or Fld = 12 Or Fld = 22 Or Fld = 32 Then
Select Case Fld
Case 42
P1 = Pwr(pwrindex)
P2 = Pwr(pwrindex + 1)
P3 = Pwr(pwrindex + 2)
Bupwr = Pwrindex + 50
Print Chr(bupwr) ; Chr(p1)
Writeeeprom P1 , Bupwr
Bupwr = Bupwr + 1
Print Chr(bupwr) ; Chr(p2)
Writeeeprom P2 , Bupwr
Bupwr = Bupwr + 1
Print Chr(bupwr) ; Chr(p3)
Writeeeprom P3 , Bupwr
Case 11
If Pwr(pwrindex) = 127 Then
Pwr(pwrindex) = 127
Else
Incr Pwr(pwrindex)
End If
Case 21
If Pwr(pwrindex + 1) = 127 Then
Pwr(pwrindex + 1) = 127
Else
Incr Pwr(pwrindex + 1)
End If
Case 31
If Pwr(pwrindex + 2) = 127 Then
Pwr(pwrindex + 2) = 127
Else
Incr Pwr(pwrindex + 2)
End If
Case 12
If Pwr(pwrindex ) = 0 Then
Pwr(pwrindex ) = 0
Else
Decr Pwr(pwrindex )
End If
Case 22
If Pwr(pwrindex + 1) = 0 Then
Pwr(pwrindex + 1) = 0
Else
Decr Pwr(pwrindex + 1)
End If
Case 32
If Pwr(pwrindex + 2) = 0 Then
Pwr(pwrindex + 2) = 0
Else
Decr Pwr(pwrindex + 2)
End If
End Select
Lcdat 5 , 1 , " "
Lcdat 5 , 2 , Pwr(pwrindex )
Lcdat 5 , 30 , Pwr(pwrindex + 1)
Lcdat 5 , 58 , Pwr(pwrindex + 2)
If Fld = 42 Then
Waitms 300
Gosub Showlightmenu
End If
End If
Case 3
Select Case X
Case 120 To 565
C = 10
Case 566 To 920
C = 20
Case Else
C = 0
End Select
Select Case Y
Case 280 To 450
R = 1
Case 451 To 640
R = 2
Case 641 To 810
R = 3
Case Else
R = 0
End Select
Fld = R + C
Select Case Fld
Case 23
''ESC
Waitms 300
Gosub Showmm
Case 21
''inet
Waitms 300
Gosub Showinet
Case 11
''audio
Waitms 300
Gosub Showaudio
Case 12
''cd
Waitms 300
Gosub Showcd
Case 13
''radip
Waitms 300
Gosub Showradio
End Select
Case 5 ''internet
If X > 840 And X < 930 And Y > 666 And Y < 820 Then
Waitms 300
Gosub Showmmmenu
End If
Case 6 ''modi
Select Case X
Case 120 To 565
C = 10
Case 566 To 920
C = 20
Case Else
C = 0
End Select
Select Case Y
Case 280 To 450
R = 1
Case 451 To 640
R = 2
Case 641 To 810
R = 3
Case Else
R = 0
End Select
Fld = R + C
Select Case Fld
Case 11
Modus = 90
Gosub Showmodi
Case 12
Modus = 91
Gosub Showmodi
Case 13
Modus = 92
Gosub Showmodi
Case 21
Modus = 93
Gosub Showmodi
Case 22
Modus = 94
Gosub Showmodi
Case 23
''ESC
Waitms 300
Writeeeprom Modus , 2
Print Chr(70) ; Chr(modus)
Gosub Showmm
End Select
Case 7
If X > 840 And X < 930 And Y > 666 And Y < 820 Then
Waitms 300
Gosub Showmm
Else
If X > 110 And X < 550 Then
Select Case Y
Case 290 To 400
Tempindex = 1
Roomname = "Kuche"
Gosub Showhmenu
Case 401 To 510
Tempindex = 3
Roomname = "Wohnzimmer"
Gosub Showhmenu
Case 511 To 615
Tempindex = 5
Roomname = "Esszimmer"
Gosub Showhmenu
Case 616 To 720
Roomname = "Bad"
Tempindex = 7
Gosub Showhmenu
Case 721 To 820
Roomname = "Flur"
Tempindex = 9
Gosub Showhmenu
End Select
End If
End If
Case 8:
If X > 270 And X < 590 And Y > 660 And Y < 820 Then
Waitms 300
Gosub Showheizung
Elseif X > 591 And X < 880 And Y > 660 And Y < 820 Then
T1 = Temp(tempindex)
T2 = Temp(tempindex + 1)
Tempbuffer = Tempindex + 80
Print Chr(tempbuffer) ; Chr(t1)
Writeeeprom T1 , Tempbuffer
Tempbuffer = Tempbuffer + 1
Print Chr(tempbuffer) ; Chr(t2)
Writeeeprom T2 , Tempbuffer
Tempbuffer = Tempbuffer - 81
Waitms 300
Gosub Showheizung
Else
Select Case X
Case 220 To 320
C = 10
Case 650 To 750
C = 20
Case Else
C = 0
End Select
Select Case Y
Case 310 To 420
R = 1
Case 470 To 580
R = 2
Case Else
R = 0
End Select
Fld = R + C
Select Case Fld
Case 11
If Temp(tempindex) = 0 Then
Temp(tempindex) = 0
Else
Decr Temp(tempindex)
End If
Case 12
If Temp(tempindex + 1) = 0 Then
Temp(tempindex + 1) = 0
Else
Decr Temp(tempindex + 1)
End If
Case 21
If Temp(tempindex) = 100 Then
Temp(tempindex) = 100
Else
Incr Temp(tempindex)
End If
Case 22
If Temp(tempindex + 1) = 100 Then
Temp(tempindex + 1) = 100
Else
Incr Temp(tempindex + 1)
End If
End Select
Lcdat 5 , 34 , " "
Lcdat 3 , 34 , " "
Lcdat 3 , 35 , Temp(tempindex) ; " C"
Lcdat 5 , 35 , Temp(tempindex + 1) ; " C"
End If
Case 9
If X > 270 And X < 590 And Y > 660 And Y < 820 Then
Waitms 300
Gosub Showheizung
Elseif X > 591 And X < 880 And Y > 660 And Y < 820 Then
Print Chr(71) ; Chr(audiopegel)
Waitms 300
Gosub Showheizung
Else
If Y > 420 And Y < 530 Then
Select Case X
Case 140 To 220
If Audiopegel = 0 Then
Audiopegel = 0
Else
Audiopegel = Audiopegel - 1
Print Chr(71) ; Chr(audiopegel)
End If
Case 440 To 520
If Audiopegel = 100 Then
Audiopegel = 100
Else
Audiopegel = Audiopegel + 1
Print Chr(71) ; Chr(audiopegel)
End If
End Select
End If
Lcdat 4 , 22 , " "
Lcdat 4 , 22 , Audiopegel
End If
Case 10
If X > 780 And X < 930 And Y > 630 And Y < 820 Then
Waitms 300
Gosub Showmmmenu
Else
If Y > 300 And Y < 460 Then
Select Case X
Case 130 To 250
Print Chr(73) ; Chr(40)
Case 251 To 370
Print Chr(73) ; Chr(41)
Case 371 To 490
Print Chr(73) ; Chr(42)
Case 491 To 610
Print Chr(73) ; Chr(44)
Case 611 To 730
Print Chr(73) ; Chr(43)
Case 731 To 850
Print Chr(73) ; Chr(45)
End Select
End If
End If
Case 11
If X > 780 And X < 930 And Y > 630 And Y < 820 Then
Waitms 300
Gosub Showmmmenu
Else
If Y > 420 And Y < 530 Then
Select Case X
Case 140 To 220
If Radiofreq = 0 Then
Radiofreq = 0
Else
Radiofreq = Radiofreq - 1
Print Chr(74) ; Chr(radiofreq)
End If
Case 750 To 830
If Radiofreq = 40 Then
Radiofreq = 40
Else
Radiofreq = Radiofreq + 1
Print Chr(74) ; Chr(radiofreq)
End If
End Select
End If
Rfreqbuff = Radiofreq + 176
Rfreqbuff = Rfreqbuff / 2
Lcdat 4 , 22 , " "
Lcdat 4 , 22 , Rfreqbuff ; " MHz"
End If
Case 12
Select Case X
Case 120 To 565
C = 10
Case 566 To 920
C = 20
Case Else
C = 0
End Select
Select Case Y
Case 280 To 450
R = 1
Case 451 To 640
R = 2
Case 641 To 810
R = 3
Case Else
R = 0
End Select
Fld = R + C
Select Case Fld
Case 23
''esc
Waitms 300
Gosub Showmm
End Select
End Select
Return
Checkmodus:
Select Case Modus
Case 90
Showpic 40 , 16 , Ok
Case 91
Showpic 52 , 32 , Ok
Case 92
Showpic 54 , 48 , Ok
Case 93
Showpic 118 , 16 , Ok
Case 94
Showpic 112 , 32 , Ok
End Select
Return
Showmmmenu:
Cls
Showpic 0 , 0 , Multimedia
Menu = 3
Return
Showlightmenu:
Cls
Showpic 0 , 0 , Light
Menu = 2
Return
Showinet:
Cls
Showpic 0 , 0 , Keybrd
Menu = 5
Return
Showheizung:
Cls
Showpic 0 , 0 , Heizung
Menu = 7
Return
Showhmenu:
Cls
Showpic 0 , 0 , Heizungsub
Lcdat 1 , 10 , Roomname
Menu = 8
Return
Showaudio:
Cls
Showpic 0 , 0 , Audio
Menu = 9
Return
Showcd:
Cls
Showpic 0 , 0 , Cd
Menu = 10
Return
Showradio:
Cls
Showpic 0 , 0 , Radio
Menu = 11
Return
Showextras:
Cls
Showpic 0 , 0 , Extras
Menu = 12
Return
Showmodi:
Cls
Showpic 0 , 0 , Modi
Gosub Checkmodus
Menu = 6
Return
Showlgtmenu:
Cls
Menu = 4
Lcdat 1 , 10 , Roomname
Showpic 2 , 8 , Up
Showpic 30 , 8 , Up
Showpic 58 , 8 , Up
Lcdat 5 , 2 , Pwr(pwrindex)
Lcdat 5 , 30 , Pwr(pwrindex + 1)
Lcdat 5 , 58 , Pwr(pwrindex + 2)
Showpic 2 , 40 , Down
Showpic 30 , 40 , Down
Showpic 58 , 40 , Down
Showpic 100 , 40 , Esc
Return
Showmm:
Cls
Menu = 1
Showpic 0 , 0 , Mm
Return
Readtouch:
Config Pina.0 = Output
Config Pina.2 = Output
Set Porta.0
Reset Porta.2
Ddra.1 = 0
Ddra.3 = 0
Waitms 20
Y = Getadc(3)
Y = 1024 - Y
Config Porta.1 = Output
Config Pina.3 = Output
Reset Porta.1
Set Porta.3
Ddra.0 = 0
Ddra.2 = 0
Waitms 20
X = Getadc(2)
X = 1024 - X
If Menu <> 12 And Menu <> 11 And Menu <> 10 And Menu <> 9 And Menu <> 8 And Menu <> 7 And Menu <> 6 And Menu <> 5 And Menu <> 4 And Menu <> 3 And Menu <> 2 And Menu <> 1 Then
Print "X: " ; X ; " Y: " ; Y
End If
Return
Pin:
$bgf "pin.bgf"
Mm:
$bgf "MM.bgf"
Light:
$bgf "lightmenu.bgf"
Up:
$bgf "up.bgf"
Down:
$bgf "down.bgf"
Esc:
$bgf "ESC.bgf"
Multimedia:
$bgf "multimedia.bgf"
Internet:
$bgf "internet.bgf"
Modi:
$bgf "modi.bgf"
Ok:
$bgf "ok.bgf"
Heizung:
$bgf "heating.bgf"
Heizungsub:
$bgf "heizungsub.bgf"
Audio:
$bgf "audio.bgf"
Cd:
$bgf "cd.bgf"
Radio:
$bgf "radio.bgf"
Extras:
$bgf "extras.bgf"
Keybrd:
$bgf "keybrd.bgf"
Keybrde:
$bgf "keybrde.bgf"
$include "font8x8.font"
Kommentare
ich hab als Hausbussystem RS485 verwendet... läuft eigetnlich super gut
14:00 22.03.2009
Alles schön und gut, im Quelltext sind die DO-LOOPs nicht richtig definiert (mit NEXT). Was ich zum Testen benötige sind die Grafik- und Fontdateien und ein Schaltplan. Wo kann ich dies bekommen?
13:00 20.12.2009
Hallo, Tut mir leid, dass du so lange warten musstest. Schick mir einfach mal ne Mail. timhot@gmx.de
22:26 04.01.2010
Kommentar verfassen
Bilder
Zum Vergrößern Klicken|
|
|
|
|
Tolle Sache! Im BasCom läuft allerdings erst mal ein Fehler auf. welches hausbussystem wird denn verwendet? X10, EIB ....
14:55 18.03.2009