'Ansteuerung für das Siemens-Display S65 mit der Anfangsnummer LS020...
'
'Pinbelegung, Rückseite Display, Anschluss auf linker Seite
'Auflistung von oben nach unten

'RS       C0
'Reset    D7
'CS       C2
'CLK      C4
'Dat      C6
'Vcc      3 Volt (max. 3.3 Volt, min. etwa 2.4 Volt)
'GND
'Vdigital 3 Volt, kann aber auch 1.8 Volt betragen, habe ich mit Vcc verbunden
'LED+     etwa 10.5 Volt, 20 mA (max 30 mA)
'LED- (GND)

'Da es sich hier um keine SPI-Ansteuerung handelt, können alle Pins beliebig
'ausgetauscht werden.
'Wichtig ist, dass beim Compilieren die korrekte Taktfrequenz angegeben wird
'Code wurde mit Atmega32 16 MHz getestet
'###########################################################################
'   Osaziloskop mit Display Siemens S65
'###########################################################################
'   Diese Software steht unter GPL -(c) Dirk Milewski
'###########################################################################
'  
'###########################################################################
' Wer ne Möglichkeit hat Hard-Spi zu machen bitte Info an mich mit demo Programm
'#############################################################################

$hwstack = 128
$swstack = 128
$framesize = 128

$regfile = "m32def.Dat"
$crystal = 16000000
$baud = 19200

Ddrd = &B11111111                                           'Port C als Output
Ddrc = &B11111111                                           'Port D als Output
Ddra = &B00000000                                           'Port a als Input
Ddrb = &B11111111                                           'portb output ->S65 Display

Dim A1 As Word , B1 As Word , R1 As Byte , F1 As Word , T As Byte , Platz As Word
Dim W1 As Word , Xy As Byte , Farbe As Word , Zeichenkette As String * 30
 '############################
 '     für U messung
 '#############################
Dim X1m As Byte , Y1m As Byte , Zm As Integer
Dim X2m As Byte , Y2m As Byte
Dim D1m As Byte , Eam As Integer , Fam As Integer
Dim Wm As String * 2
Dim V(770) As Byte
Dim U As Word
Dim Umess As Single
Dim Tmp As String * 10
Dim Ypx As Byte
Dim Timeb As Byte



'####################################################################
' ADC kanal 0 und 1 werden benutzt -> zur Auswertung hier nur 0
'####################################################################
'Beispiel: 16000000MHz/16(Prescaler)= 1000000/13 Takte = Messfrequenz 76923 Hz
'####################################################################

Config Adc = Single , Prescaler = 16 , Reference = Internal


Config Pina.2 = Input
Porta.2 = 1
Kup Alias Pina.2

Config Pina.3 = Input
Porta.3 = 1
Kdown Alias Pina.3

Config Pina.4 = Input
Porta.4 = 1
Kright Alias Pina.4

Config Pina.5 = Input
Porta.5 = 1
Kleft Alias Pina.5

Config Pina.6 = Input
Porta.6 = 1
Kenter Alias Pina.6

Config Pina.7 = Input
Porta.7 = 1
Kstart Alias Pina.7

'####################################################################
' Wir AREF = Ub genommen bitte Messen und Hier bei AREF eintragen.
' Interne AREF =2,56V -> siehe datenblatt!
'####################################################################

Const Aref = 2.56
Const N = Aref / 1024



'##################################################
'                   SPI
'#################################################

Rs Alias Portb.0
Res Alias Portb.1
Cs Alias Portb.2
Clk Alias Portb.3
Dat Alias Portb.4




'16Bit Color -> RRRRRGGGGGBBBBB
Const Lila = &B1111100000011111
Const Blau = &B0000000000011111
Const Weiss = &HFFFF
Const Schwarz = &H0000
Const Rot = &B1111100000000000
Const Gruen = &B0000011111100000
Const Cyan = &B0000011111111111
Const Gold = &B1111111111100000
Const Grau = &B1111111111110110
Const Hgelb = &B1111011110101000
Const Dgelb = &B1111011111010000

Const X = 176
Const Y = 132

Declare Sub S65_init()
Declare Sub S65_pset(byval Lx As Byte , Byval Ly As Byte , Byval Color As Word)
Declare Sub S65_line(byval Lx1 As Byte , Byval Ly1 As Byte , Byval Lx2 As Byte , Byval Ly2 As Byte , Byval Color As Word)
Declare Sub S65_zeichen(byval Lx As Byte , Byval Ly As Byte , Byval Bcol As Word , Byval Fcol As Word , Byval Lcd_text As String )
Declare Sub S65_print(byval Lx As Byte , Byval Ly As Byte , Byval Fcol As Word , Byval Bcol As Word , Byval Lcd_text As String)
Declare Sub S65_cls(byval Bcol As Word)
Declare Sub S65_pixelset(byval Lx As Byte , Byval Ly As Byte , Byval Color As Word)





Call S65_init()

Call S65_cls(schwarz)
Call S65_print(8 , 15 , Grau , Rot , "   1Kanal Osziloskop    ")
Call S65_print(18 , 40 , Weiss , Schwarz , " V1.0-20060922 ")
Call S65_print(26 , 25 , Weiss , Schwarz , " by Dirk Milewski (c)  ")
Call S65_print(50 , 60 , Cyan , Schwarz , "www.comwebnet.de")
Call S65_line(40 , 40 , 60 , 60 , Hgelb)
Call S65_line(40 , 40 , 60 , 80 , Cyan)
Call S65_line(40 , 40 , 80 , 60 , Rot)
'#################################
'       Kreuz zeichen
'#################################
For Xy = 30 To 50
 Call S65_pset(xy , 40 , Hgelb)
 Call S65_pset(40 , Xy , Hgelb)

Next Xy

For Xy = 20 To 100
Call S65_pset(xy , 30 , Cyan)
Next Xy

'#####################################
'  Titelscreen
'#####################################
For Xy = 3 To 0 Step -1
Call S65_print(120 , 15 , Cyan , Schwarz , "Start Oszi press any Key")
Waitms 500
Call S65_print(100 , 40 , Cyan , Schwarz , "Start in:   ")
Tmp = Str(xy)
Call S65_print(100 , 100 , Cyan , Schwarz , Tmp)


Call S65_print(120 , 15 , Rot , Schwarz , "Start Oszi press any Key")
Waitms 500
Next Xy
Call S65_cls(schwarz)
'timebase für DIV/T 1..6
Timeb = 1

Do

 'Call S65_line(20 , 20 , 80 , 170 , Cyan)
 Call S65_line(20 , 20 , 120 , 20 , Cyan)
For Xy = 20 To 175
Call S65_pset(20 , Xy , Cyan)
Next



Start Adc

For Zm = 1 To 660
 V(zm) = Getadc(0)                                          'kanal 0 zur Messung

Next
Stop Adc


For Zm = 2 To 175
If Kup = 0 Then
Waitms 100
 Timeb = Timeb + 1
 If Timeb > 7 Then Timeb = 1
 Tmp = Str(timeb)
 Tmp = "D/T: " + Tmp
Call S65_print(120 , 20 , Weiss , Rot , Tmp)
End If

If Timeb > 7 Then Timeb = 1

Fam = Zm * Timeb
U = V(fam)
Umess = U * N
Umess = Umess / Aref
Umess = Umess * 100

Eam = Int(umess)
Umess = U * N
Y2m = Eam + 21


X2m = Zm + 20
If Y2m > 175 Then Y2m = 175
'Call S65_print(120 , 20 , Weiss , Rot , "DIV/T: 100µs ")

'Locate 14 , 10
'Lcd " D/T:" ; Menu_b(timeb)
D1m = X1m
'Line(d , 0 ) -(d , 99) , 0
'Line(x1 , Y1) -(x2 , Y2) , 255
'löschen des Graphen
For Xy = 21 To 132
Call S65_pset(xy , D1m , Schwarz)
Next
'Call S65_line(y1m , X1m , Y2m , X2m , Weiss)
Call S65_pset(y1m , X1m , Weiss)

X1m = X2m
Y1m = Y2m


'Tmp = Fusing(umess , "#.##")
'Tmp = "V=" + Tmp
'Call S65_print(120 , 130 , Weiss , Schwarz , Tmp)

Next


Tmp = Fusing(umess , "#.##")
Tmp = "V=" + Tmp
Call S65_print(120 , 130 , Weiss , Schwarz , Tmp)

Loop
Powerdown
End


'################################################################
'  LCD - commando , Parameter übergabe zum Display
'################################################################
16:
Cs = 0
Shiftout Dat , Clk , A1 , A1
Cs = 1
Return


'##################################
'Start der S65-Ansteuerung
'##################################
Sub S65_init()
Anfang:
Res = 1
Waitms 10
Res = 0                                                     'Reset
Cs = 1
Clk = 1
Dat = 1
Rs = 1

Waitms 1
Res = 1                                                     'Reset Ende
Waitms 10


Cs = 1                                                      'CS select, Start
Waitms 1
Rs = 1
                                                     'RS high, Command
'####################################
'      Displayinitialisierung
'####################################

Restore Init1
For R1 = 1 To 12
Read A1
Gosub 16
Next

Waitms 7                                                    'diese Zeit ist sehr wichtig, sollte keinesfalls unterschritten werden

Restore Init2
For R1 = 1 To 23
Read A1
Gosub 16
Next

End Sub



'##################################
'#           LCD Löschen          #
'##################################

Sub S65_cls(byval Bcol As Word)
Local Aa As Word


Rs = 1
A1 = &HEF90
Gosub 16
A1 = &H0500
Gosub 16
A1 = &H0600
Gosub 16
A1 = &H0700
Gosub 16
Platz = 132 * 176
Rs = 0
For W1 = 0 To Platz
A1 = Bcol
Gosub 16
Next W1
Rs = 1
End Sub





'######################################################
'#                 Setze Pixel -> Pset                #
'######################################################

Sub S65_pset(lx As Byte , Ly As Byte , Color As Word)
Rs = 1

A1 = &H600 + Lx
Gosub 16
A1 = &H700 + Ly
Gosub 16
Rs = 0
Cs = 0
Shiftout Dat , Clk , Color , 0
Cs = 1

End Sub


'######################################################
'#               Line zeichnen                        #
'######################################################

Sub S65_line(byval Lx1 As Byte , Byval Ly1 As Byte , Byval Lx2 As Byte , Byval Ly2 As Byte , Byval Color As Word)
Local M As Byte , M1 As Single , M2 As Single
Local Yg As Byte , Cv As Single , Bn As Integer
Local R As Byte , B As Byte

M1 = Ly2 - Ly1
M2 = Lx2 - Lx1
Cv = M1 / M2
Bn = Int(cv)
M = Low(bn)
B = M * Lx1
B = -1 * B
'If Ly1 = Ly2 Then B = 0
'If Lx1 = Lx2 Then B = 0
B = B + Ly1

For R = Lx1 To Lx2
Yg = M * R
Yg = Yg + B
Call S65_pset(r , Yg , Color)
Next R


End Sub

'#####################################################
'#       ACSII Zeichenausgabe                        #
'#####################################################

Sub S65_zeichen(byval Lx As Byte , Byval Ly As Byte , Byval Bcol As Word , Byval Fcol As Word , Byval Lcd_text As String * 1)

Local R As Integer
Local A As Byte
Local B As Byte
Local C As Long
Local D As Byte
Local E As Byte
Local F As Byte
Local G As Long
Local Xpos As Byte
Local Ypos As Byte
Local Zeichen As String * 1
Print "S65_zeichen(" ; Lx ; "," ; Ly ; "," ; Bcol ; "," ; Fcol ; "," ; Lcd_text ; ")"
Xpos = 0
Ypos = 0
 'For R = 1 To Len(lcd_text)

     ' Zeichen = Mid(lcd_text , R , 1)                       'Hole char
      G = Asc(lcd_text)
      'Print "S65_Zeichen:" ; Lcd_text
      'Print "ASCII:" ; G                                    'Bestimme Pos in Tabelle
      G = G - 32
      G = G * 6

      Readeeprom B , G



      'Call Lcd_locate(lcd_posx , Lcd_posy)

      A = 8                                                 '1.linie frei
      'If Lcd_doublesize = 1 Then A = 16
      'If Lcd_doublesize = 2 Then A = 32


      For F = 1 To 6
         C = 1

            D = B                                           'Byte darf nicht verändert werden für 2. durchlauf
            For E = 1 To 8
            Xpos = Lx + E
            Xpos = 132 - Xpos

            Ypos = Ly + F
            'Ypos = 176 - ypos

               A = D And 1
               If A = 1 Then Call S65_pset(xpos , Ypos , Fcol)
               If A = 0 Then Call S65_pset(xpos , Ypos , Bcol)
               Shift D , Right , 1
            Next
            Decr C

         G = G + 1
         Readeeprom B , G
      Next
      'Ypos = Ypos + 6

  'Next




End Sub

'####################################################################
'  S65_print(x,y,bcol,fcol) -> Zeichenketten auf LCD ausdrucken
'####################################################################


Sub S65_print(byval Lx As Byte , Byval Ly As Byte , Byval Bcol As Word , Byval Fcol As Word , Byval Lcd_text As String)
Local Xpos As Byte
Local Ypos As Byte
Local Zaehler As Byte
Local Laenge As Byte
Local Zeichen As String * 1
Laenge = Len(lcd_text)
For Zaehler = 1 To Laenge
Zeichen = Mid(lcd_text , Zaehler , 1)
Call S65_zeichen(lx , Ly , Bcol , Fcol , Zeichen)
Ly = Ly + 6
Next Zaehler


End Sub



'-------------------------------------------------------------------       Ende Subs zum Definieren von Fenstern


Init1:
Data &HFDFD% , &HFDFD%,
Data &HEF00%,
Data &HEE04% , &H1B04%,
Data &HFEFE% , &HFEFE%,
Data &HEF90% , &H4A04% , &H7F3F% , &HEE04% , &H4306%

Init2:
Data &HEF90% , &H0983% , &H0800% , &H0BAF% , &H0A00% , &H0500% , &H0600% , &H0700%,
Data &HEF00%,
Data &HEE0C%,
Data &HEF90% , &H0080%,
Data &HEFB0% , &H4902%,
Data &HEF00%,
Data &H7F01% , &HE181%,
Data &HE202%,
Data &HE276%,
Data &HE183%,
Data &H8001%,
Data &HEF90%,
Data &H0000%

$eeprom
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00                ' "(space)"
Data &H00 , &H06 , &H5F , &H06 , &H00 , &H00                ' "!"
Data &H07 , &H03 , &H00 , &H07 , &H03 , &H00 ' """
Data &H24 , &H7E , &H24 , &H7E , &H24 , &H00                ' "#"
Data &H24 , &H2B , &H6A , &H12 , &H00 , &H00                ' "$"
Data &H63 , &H13 , &H08 , &H64 , &H63 , &H00                ' "%"
Data &H36 , &H49 , &H56 , &H20 , &H50 , &H00                ' "&"
Data &H00 , &H07 , &H03 , &H00 , &H00 , &H00                ' "'"
'40
Data &H00 , &H3E , &H41 , &H00 , &H00 , &H00                ' "("
Data &H00 , &H41 , &H3E , &H00 , &H00 , &H00                ' ")"
Data &H08 , &H3E , &H1C , &H3E , &H08 , &H00                ' "*"
Data &H08 , &H08 , &H3E , &H08 , &H08 , &H00                ' "+"
Data &H00 , &HE0 , &H60 , &H00 , &H00 , &H00                ' ","
Data &H08 , &H08 , &H08 , &H08 , &H08 , &H00                ' "-"
Data &H00 , &H60 , &H60 , &H00 , &H00 , &H00                ' "."
Data &H20 , &H10 , &H08 , &H04 , &H02 , &H00                ' "/"
Data &H3E , &H51 , &H49 , &H45 , &H3E , &H00                ' "0"
Data &H00 , &H42 , &H7F , &H40 , &H00 , &H00                ' "1"
'50
Data &H62 , &H51 , &H49 , &H49 , &H46 , &H00                ' "2"
Data &H22 , &H49 , &H49 , &H49 , &H36 , &H00                ' "3"
Data &H18 , &H14 , &H12 , &H7F , &H10 , &H00                ' "4"
Data &H2F , &H49 , &H49 , &H49 , &H31 , &H00                ' "5"
Data &H3C , &H4A , &H49 , &H49 , &H30 , &H00                ' "6"
Data &H01 , &H71 , &H09 , &H05 , &H03 , &H00                ' "7"
Data &H36 , &H49 , &H49 , &H49 , &H36 , &H00                ' "8"
Data &H06 , &H49 , &H49 , &H29 , &H1E , &H00                ' "9"
Data &H00 , &H6C , &H6C , &H00 , &H00 , &H00                ' ":"
Data &H00 , &HEC , &H6C , &H00 , &H00 , &H00                ' ";"
'60
Data &H08 , &H14 , &H22 , &H41 , &H00 , &H00                ' "<"
Data &H24 , &H24 , &H24 , &H24 , &H24 , &H00                ' "="
Data &H00 , &H41 , &H22 , &H14 , &H08 , &H00                ' ">"
Data &H02 , &H01 , &H59 , &H09 , &H06 , &H00                ' "?"
Data &H3E , &H41 , &H5D , &H55 , &H1E , &H00                ' "@"
Data &H7E , &H09 , &H09 , &H09 , &H7E , &H00                ' "A"
Data &H7F , &H49 , &H49 , &H49 , &H36 , &H00                ' "B"
Data &H3E , &H41 , &H41 , &H41 , &H22 , &H00                ' "C"
Data &H7F , &H41 , &H41 , &H41 , &H3E , &H00                ' "D"
Data &H7F , &H49 , &H49 , &H49 , &H41 , &H00                ' "E"
'70
Data &H7F , &H09 , &H09 , &H09 , &H01 , &H00                ' "F"
Data &H3E , &H41 , &H49 , &H49 , &H7A , &H00                ' "G"
Data &H7F , &H08 , &H08 , &H08 , &H7F , &H00                ' "H"
Data &H00 , &H41 , &H7F , &H41 , &H00 , &H00                ' "I"
Data &H30 , &H40 , &H40 , &H40 , &H3F , &H00                ' "J"
Data &H7F , &H08 , &H14 , &H22 , &H41 , &H00                ' "K"
Data &H7F , &H40 , &H40 , &H40 , &H40 , &H00                ' "L"
Data &H7F , &H02 , &H04 , &H02 , &H7F , &H00                ' "M"
Data &H7F , &H02 , &H04 , &H08 , &H7F , &H00                ' "N"
Data &H3E , &H41 , &H41 , &H41 , &H3E , &H00                ' "O"
Data &H7F , &H09 , &H09 , &H09 , &H06 , &H00                ' "P"
'80
Data &H3E , &H41 , &H51 , &H21 , &H5E , &H00                ' "Q"
Data &H7F , &H09 , &H09 , &H19 , &H66 , &H00                ' "R"
Data &H26 , &H49 , &H49 , &H49 , &H32 , &H00                ' "S"
Data &H01 , &H01 , &H7F , &H01 , &H01 , &H00                ' "T"
Data &H3F , &H40 , &H40 , &H40 , &H3F , &H00                ' "U"
Data &H1F , &H20 , &H40 , &H20 , &H1F , &H00                ' "V"
Data &H3F , &H40 , &H3C , &H40 , &H3F , &H00                ' "W"
Data &H63 , &H14 , &H08 , &H14 , &H63 , &H00                ' "X"
Data &H07 , &H08 , &H70 , &H08 , &H07 , &H00                ' "Y"
Data &H71 , &H49 , &H45 , &H43 , &H00 , &H00                ' "Z"
Data &H00 , &H7F , &H41 , &H41 , &H00 , &H00                ' "["
'90
Data &H02 , &H04 , &H08 , &H10 , &H20 , &H00                ' "\"
Data &H00 , &H41 , &H41 , &H7F , &H00 , &H00                ' "]"
Data &H04 , &H02 , &H01 , &H02 , &H04 , &H00                ' "^"
Data &H80 , &H80 , &H80 , &H80 , &H80 , &H00                ' "_"                      ' "`"
Data &H0C , &H12 , &H12 , &H0C , &H00 , &H00                ' neu "°" statt "`"
'Data &H00 , &H03 , &H07 , &H00 , &H00  , &H00
Data &H20 , &H54 , &H54 , &H54 , &H78 , &H00                ' "a"
Data &H7F , &H44 , &H44 , &H44 , &H38 , &H00                ' "b"
Data &H38 , &H44 , &H44 , &H44 , &H28 , &H00                ' "c"
Data &H38 , &H44 , &H44 , &H44 , &H7F , &H00                ' "d"
Data &H38 , &H54 , &H54 , &H54 , &H18 , &H00                ' "e"
Data &H08 , &H7E , &H09 , &H09 , &H00 , &H00                ' "f"
'100
Data &H18 , &HA4 , &HA4 , &HA4 , &H7C , &H00                ' "g"
Data &H7F , &H04 , &H04 , &H78 , &H00 , &H00                ' "h"
Data &H00 , &H00 , &H7D , &H00 , &H00 , &H00                ' "i"
Data &H40 , &H80 , &H84 , &H7D , &H00 , &H00                ' "j"
Data &H7F , &H10 , &H28 , &H44 , &H00 , &H00                ' "k"
Data &H00 , &H00 , &H7F , &H40 , &H00 , &H00                ' "l"
Data &H7C , &H04 , &H18 , &H04 , &H78 , &H00                ' "m"
Data &H7C , &H04 , &H04 , &H78 , &H00 , &H00                ' "n"
Data &H38 , &H44 , &H44 , &H44 , &H38 , &H00                ' "o"
Data &HFC , &H44 , &H44 , &H44 , &H38 , &H00                ' "p"
Data &H38 , &H44 , &H44 , &H44 , &HFC , &H00                ' "q"
'110
Data &H44 , &H78 , &H44 , &H04 , &H08 , &H00                ' "r"
Data &H08 , &H54 , &H54 , &H54 , &H20 , &H00                ' "s"
Data &H04 , &H3E , &H44 , &H24 , &H00 , &H00                ' "t"
Data &H3C , &H40 , &H20 , &H7C , &H00 , &H00                ' "u"
Data &H1C , &H20 , &H40 , &H20 , &H1C , &H00                ' "v"
Data &H3C , &H60 , &H30 , &H60 , &H3C , &H00                ' "w"
Data &H6C , &H10 , &H10 , &H6C , &H00 , &H00                ' "x"
Data &H9C , &HA0 , &H60 , &H3C , &H00 , &H00                ' "y"
Data &H64 , &H54 , &H54 , &H4C , &H00 , &H00                ' "z"
Data &H08 , &H3E , &H41 , &H41 , &H00 , &H00                ' "{"
'120
Data &H00 , &H00 , &H7F , &H00 , &H00 , &H00                ' "|"
Data &H00 , &H41 , &H41 , &H3E , &H08 , &H00                ' "}"
Data &H02 , &H01 , &H02 , &H01 , &H00 , &H00                ' "~"
Data &H3F , &H21 , &H21 , &H21 , &H21 , &H00                ' "["
Data &H21 , &H21 , &H21 , &H21 , &H21 , &H00
Data &H21 , &H21 , &H21 , &H21 . &H3F , &H00                ' "]"
Data &H3F , &H3F , &H3F , &H3F , &H3F , &H00
Data &H3F , &H00 , &H00 , &H00 , &H00 , &H00
$data