'##############################################################################
' LCD-Display.BAS                                              Stand 17.04.2017
' ---------------                                              (C) Markus Fulde
'
' Testprogramm zur Inbetriebnahme des Display DOGM163
' Die Inbetriebnahme erfolgt mit dem Eva-Board STK500 + STK501
' Die für die LCD-Display-Ansteuerung notwendigen Routinen sind
' als solche gekennzeichnet und bereits zur späteren Verwendung
' ausgelagert.
'##############################################################################

'------------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'------------------------------------------------------------------------------
$regfile = "m8def.dat"                                      ' Definitionsdatei für ATmega128 laden
$crystal = 8000000                                          ' Quarzfrequenz für 16 MHz festlegen

'------------------------------------------------------------------------------
' Allgemeine Zusatzinformatonen zu Programmbeginn
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
' Definition von Ressourcen
'------------------------------------------------------------------------------

' ----- LED's -----
Alive_pin Alias Pinc.0                                      ' GPIO für Alive-LED (für DDR oder Input)
Alive Alias Portc.0                                         ' GPIO für Alive-LED (für Output oder Pullup)

' ----- LCD-Display -----
' LCD-Display
Db4_pin Alias Portd.0                                       ' GPIO für LCD Pin4
Db5_pin Alias Portd.1                                       ' GPIO für LCD Pin5
Db6_pin Alias Portd.2                                       ' GPIO für LCD Pin6
Db7_pin Alias Portd.3                                       ' GPIO für LCD Pin7
E_pin Alias Portd.4                                         ' GPIO für LCD E
Rs_pin Alias Portd.5                                        ' GPIO für LCD RS

'------------------------------------------------------------------------------
' Definition von Konstaten
'------------------------------------------------------------------------------

' ----- Für Testumgebung bzw. Traceausgaben -----
Const Main_testmodus = 1                                    ' Flag für Testmodus Allgemeinsystem
Const Lcd_testmodus = 1                                     ' Flag

' ----- Allgemeine Systemkonstanten -----

' Tatsächliches Allgemeines
' Const Led_aus = 0
' Const Led_ein = 1

Const Led_aus = 1                                           ' Achtung !! bei STK500 ist Logik gedreht!!
Const Led_ein = 0                                           ' Achtung !! bei STK500 ist Logik gedreht!!

Const False = 0
Const True = 1

' Zeitvorgabe für Sekunden-Timer
Const Timervorgabe = 34286                                  ' Timer von 1 Sekunden (SekundenTick)

' ----- LCD -----

' Anmerkung: Wert von 35 ist der beste Wert welcher durch Versuche ermittelt wurde!!
Const Lcd_kontrast_default = 35                             ' LCD-Default-Kontrast

'------------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'------------------------------------------------------------------------------

' ----- Temporäre Hilfsvariablen -----
Dim Temp_byte_1 As Byte                                     ' Temporäre Byte Variable 1
Dim Temp_byte_2 As Byte                                     ' Temporäre Byte Variable 2

' ----- Variablen für LCD-Display -----
Dim Lcd_kontrastwert As Byte                                ' Arbeitsvariable für Kontrastwert

'------------------------------------------------------------------------------
' Prototyping
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen (Projekt und Testumgebung)
'------------------------------------------------------------------------------

' --------------------------------- CONFIG ------------------------------------

' ----- Timer -----

' Konfiguration eines Timers für 1 Sekunden Timer-Tick (Scheduler und Alive)
Config Timer1 = Timer , Prescale = 256                      ' Timer 1 verwenden
On Timer1 Sekunden_tick                                     ' Interrupt Routine
Timer1 = Timervorgabe
Enable Timer1                                               ' Interrupt für Sekunden-Tack

' ----- LCD Display -----

' Konfiguration LCD Display
Config Lcdpin = Pin , Db4 = Db4_pin , Db5 = Db5_pin , Db6 = Db6_pin , Db7 = Db7_pin , E = E_pin , Rs = Rs_pin
Config Lcd = 16 * 2 , Chipset = Dogm162v5                   ' DOG-M Treiber laden
Config Lcdbus = 4                                           ' LCD arbeitet über 4-Bit
Initlcd                                                     ' LCD initialisieren
Waitms 100                                                  ' 100ms nach Init warten
Cursor Off Noblink                                          ' Blinkenden Cursor abschalten

' Definition benutzerdefinierter Zeichen
' LCD-Zeichen linker Sockel des Galgens
Deflcdchar 0 , 16 , 16 , 16 , 16 , 16 , 16 , 30 , 30
' LCD-Zeichen linke obere Ecke des Galgens
Deflcdchar 1 , 15 , 9 , 10 , 12 , 8 , 8 , 8 , 8
' LCD-Zeichen rechter Galgen ohne Männchen
Deflcdchar 2 , 28 , 4 , 32 , 32 , 32 , 32 , 32 , 32
' LCD-Zeichen rechter Galgen mit Kopf
Deflcdchar 3 , 28 , 4 , 4 , 14 , 17 , 17 , 14 , 4
' LCD-Zeichen Bauch
Deflcdchar 4 , 4 , 4 , 4 , 4 , 32 , 32 , 32 , 32
' LCD-Zeichen Bauch mit linkem Beine
Deflcdchar 5 , 4 , 4 , 4 , 4 , 8 , 16 , 16 , 32
' LCD-Zeichen Bauch mit beiden Beinen
Deflcdchar 6 , 4 , 4 , 4 , 4 , 10 , 17 , 17 , 32
' LCD-Zeichen kompletter Männchen-Körper
Deflcdchar 7 , 14 , 21 , 21 , 4 , 10 , 17 , 17 , 32

Cls                                                         ' Clear Screen

' ------------------------------- Port's und Pin's ----------------------------

' ----- LED-Konfigurationen -----
Config Alive_pin = Output

' ------------------------------ Variablen und Werte --------------------------

' ----- LED-Konfigurationen -----
Alive = Led_aus                                             ' Alive-LED aus

' ----- LCD-Display -----
Lcd_kontrastwert = Lcd_kontrast_default                     ' Kontrastwert

'------------------------------------------------------------------------------
' Und los gehts, hier noch die Restarbeiten
'------------------------------------------------------------------------------

' ----- Freigabe aller Interrupts ----
Enable Interrupts                                           ' Damit auch Empfang von Daten über Buffer

' ---------------------------------- Gosub's ----------------------------------

Gosub Lcd_kontrast_set                                      ' LCD Kontrast einstellen

' #############################################################################
'
'                             Hauptprogramm ConvCtrl
'
' #############################################################################

' ----------------------------------------------
' ----- Hier ist die Programmhauptschleife -----
' ----------------------------------------------

Do                                                          ' Hauptschleife

   ' Ein kleiner LCD-Test

   ' Mit kleiner Schleife gesamtes Display mit * füllen
   For Temp_byte_1 = 1 To 2 Step 1
      For Temp_byte_2 = 1 To 16 Step 1
         Locate Temp_byte_1 , Temp_byte_2
         Lcd "*"
         Waitms 50
      Next Temp_byte_2
   Next Temp_byte_1

   ' Mit kleiner Schleife gesamtes Display leeren
   For Temp_byte_1 = 2 To 1 Step -1
      For Temp_byte_2 = 16 To 1 Step -1
         Locate Temp_byte_1 , Temp_byte_2
         Lcd " "
         Waitms 50
      Next Temp_byte_2
   Next Temp_byte_1

   Wait 2

   ' Noch auf beide Zeilen die Positionszahlen ausgeben und gut
   Locate 1 , 1 : Lcd "1234567890123456"
   Locate 2 , 1 : Lcd "1234567890123456"

   Wait 2

   Cls

   ' Galgen zeichnen
   Locate 1 , 1 : Lcd Chr(1)
   Locate 2 , 1 : Lcd Chr(0)
   Waitms 500
   Locate 1 , 2 : Lcd Chr(2)
   Waitms 500
   Locate 1 , 2 : Lcd Chr(3)
   Waitms 500
   Locate 1 , 2 : Lcd Chr(3)
   Locate 2 , 2 : Lcd Chr(4)
   Waitms 500
   Locate 1 , 2 : Lcd Chr(3)
   Locate 2 , 2 : Lcd Chr(5)
   Waitms 500
   Locate 1 , 2 : Lcd Chr(3)
   Locate 2 , 2 : Lcd Chr(6)
   Waitms 500
   Locate 1 , 2 : Lcd Chr(3)
   Locate 2 , 2 : Lcd Chr(7)
   Wait 5

   Cls

   Locate 1 , 1
   '    1234567890123456
   Lcd "  Kontrasttest  "
   Locate 2 , 1
   Lcd "#*#*#*#*#*#*#*#*"

   Wait 5

   ' Der Kontrast lässt sich mit 6 Bit einstellen. Damit ergibt sich ein Werte-
   ' bereich von 0b000000 (0) bis 0b111111 (63)

   ' Minimaler Kontrast
   Lcd_kontrastwert = 0
   Gosub Lcd_kontrast_set
   Wait 5

   ' Maximaler Kontrast
   Lcd_kontrastwert = 63
   Gosub Lcd_kontrast_set
   Wait 5

   ' Default Kontrast
   Lcd_kontrastwert = Lcd_kontrast_default
   Gosub Lcd_kontrast_set

   Wait 5

Loop                                                        ' Hauptschleife

'## End Hauptprogramm #########################################################

End

'******************************************************************************
' Interruptroutinen
'******************************************************************************

'------------------------------------------------------------------------------
' Interrupt-Service-Routine (Timer1): Sekunden_tick
' Routine zur Auswertung des Timer Interrupts
'------------------------------------------------------------------------------
Sekunden_tick:

   ' ----- Programmcode -----

   Timer1 = Timervorgabe                                    ' Timer neu laden
   Toggle Alive                                             ' Alive-LED toggeln lassen

Return
'-- End Sekunden_tick  --------------------------------------------------------

'******************************************************************************
' Subroutinen
'******************************************************************************

' ***************
' * LCD-Display *
' ***************

'******************************************************************************
' GOSubroutinen
'******************************************************************************

' ***************
' * LCD-Dsiplay *
' ***************

'------------------------------------------------------------------------------
' LCD - Gosub-Routine: Lcd_contrast_set
' Routine berechnen neue Kontrastwerte und steuert direkt den
' Kontroller des Display an.
' Aufgrund von 6 Bit sind nur Kontrastwerte zwischen 0 und 63 möglich!
'------------------------------------------------------------------------------
Lcd_kontrast_set:                                           ' Kontrasteinstellung Display

   ' ----- Programmcode -----

   ' Verarbeitung des Kontrastwertes für High-Byte und Low-Byte
   Temp_byte_1 = Lcd_kontrastwert And &B00001111
   Temp_byte_1 = Temp_byte_1 + &B01110000

   Temp_byte_2 = Lcd_kontrastwert
   Shift Temp_byte_2 , Right , 4
   Temp_byte_2 = Temp_byte_2 And &B00000011
   Temp_byte_2 = Temp_byte_2 + &B01010100

   ' Instruction Table 1 einstellen [0,1]
   _temp1 = &B00101001
   !rCall _Lcd_control

   ' Tempvar_1 = &B0111xxxx für Kontrast Set Instruction Table 1 - Low Byte
   _temp1 = Temp_byte_1
   !rCall _Lcd_control

   ' Temovar_2 = &B010101xx für Kontrast Set Instruction Table 1 - High Byte
   _temp1 = Temp_byte_2
   !rCall _Lcd_control

   ' Zurückschalten auf Instruction Table 0 [0,0]
   _temp1 = &B00101000
   !rCall _Lcd_control

Return
'-- End Lcd_kontrast_set ------------------------------------------------------

'------------------------------------------------------------------------------
' Devices schließend und ggf. "Terminate Programm execution"
'------------------------------------------------------------------------------

' System halt
End                                                         'end program

'------------------------------------------------------------------------------
' Definition von globalen Konstantenfeldern
'------------------------------------------------------------------------------

' ----------------------------------------------------------------------------

'###################################### END ###################################

'################################### Historie #################################
' 17.04.2017 : Version 1.0
'              Erstellung der 1. Version der generellen Inbetriebnahme EA DOG-M
'##############################################################################