'
'Subroutinen für I2C-Arduino-LCD
'
$regfile = "m1284pdef.dat"
$crystal = 12000000 'EXTERN !
$hwstack = 128
$swstack = 128
$framesize = 128
' ------------------ATmega1284P------------------------
' +---v---+
' (XCK/T0) PB0 |1 40| PA0 (ADC0)------Taster
' (T1) PB1 |2 39| PA1 (ADC1)------Taster2
' (INT2/AIN0) PB2 |3 38| PA2 (ADC2)------Taster_HBL
' (OC0/AIN1) PB3 |4 37| PA3 (ADC3)
' (SS) PB4 |5 36| PA4 (ADC4)
' (MOSI) PB5 |6 35| PA5 (ADC5)
' (MISO) PB6 |7 34| PA6 (ADC6)
' (SCK) PB7 |8 33| PA7 (ADC7)
' RESET |9 32| AREF
' VCC |10 31| GND
' GND |11 30| AVCC
' XTAL2 |12 29| PC7 (TOSC2)
' XTAL1 |13 28| PC6 (TOSC1)
' (RXD) PD0 |14 27| PC5 (TDI)
' (TXD) PD1 |15 26| PC4 (TDO)
' (INT0) PD2 |16 25| PC3 (TMS)
' (INT1) PD3 |17 24| PC2 (TCK)
' (OC1B) PD4 |18 23| PC1 (SDA)-------I2C
' (OC1A) PD5 |19 22| PC0 (SCL)-------I2C
' DCF77---(ICP1) PD6 |20 21| PD7 (OC2)-------LED
' +-------+
' ================================================
' Bestimme die Ein- und Ausgänge
Ddra = &B_0000_0000 '1 ist Ausgang 0 ist Eingang
Porta = &B1111_1111
Ddrb = &B_0000_0000 '1 ist Ausgang 0 ist Eingang
Portb = &B1111_1111
Ddrc = &B_0011_1111 '1 ist Ausgang 0 ist Eingang
Portc = &B1100_0000
Ddrd = &B_1011_1111 '1 ist Ausgang 0 ist Eingang
Portd = &B0100_0000 'auf Hi oder Low setzen
Led Alias Portd.7
Taster Alias Pina.0
Taster2 Alias Pina.1
Taster_hbl Alias Pina.2
' ==============================================================================
Declare Sub Lcda_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 20)
Declare Sub Lcda_cls
Declare Sub Lcda_init
Dim Text As String * 20 'LCD Ausgabe
Dim Lcd_text(20) As Byte At Text Overlay 'ASCII-Werte der LCD Ausgabe
Dim Init(5) As Byte 'Byte-Array für LCD-Parameter
Dim Hbl As Byte 'LCD-HintergrundBeLeuchtung
Dim Lcd_zeilen As Byte
Dim Lcd_spalten As Byte
Const Aus = 8 'HBL Ausschalten
Const Ein = 0 'HBL Einschalten
'**********************************************
'Angaben zum Display einstellen! Beispiel 4x16:
Lcd_zeilen = 4 'Anzahl der LCD-Zeilen eintragen!
Lcd_spalten = 16 'Anzahl der LCD-Charakter angeben
'**********************************************
'**********************************************
'TWI-Adresse des LCD-Bausteins angeben:
Const Lcd_arduino = &H40 'I2C-Adresse des PCx8574(A)
'**********************************************
' PCx8574(A)
' __
' A0 -o|1 |o- Vdd
' A1 -o| |o- SDA
' A2 -o| |o- SCL
' RS -o| |o- n.c. (INT)
' RW -o| |o- D7
' E -o| |o- D6
'HBL=HintergrundBeLeuchtung-o| |o- D5
' GND -o|_9|o- D4
' ==============================================================================
' I2C-Config
$lib "i2c_twi.lbx"
'Config Twi = 100000 'BUS-Takt,
'Config Scl = Portc.0 'I2C SCL
'Config Sda = Portc.1 'I2C SDA
'Config I2cdelay = 1
'I2cinit
' ==============================================================================
'######################## Pollin Modul : Inverted = 1 ##########################
Config Dcf77 = Pind.6 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Update = 0 , Check = 1 , Inverted = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
Date$ = "01.01.07"
Time$ = "12:00:00"
' #############################################################################
Dim I As Byte , I2 As Byte 'Indexzähler
Dim Tb As Bit 'Toggle-Bit
Dim Ab As Bit 'Anzeige-Bit
Dim Dtag As Byte , Wtag As String * 10
Dim Sync As Bit
Dim Puls As Bit
Dim Status_old As Byte
' #############################################################################
' Anfangswerte:
Tb = 0 'Toggel-Bit auf 0
Ab = 0 'Taster-Bit auf 0
Lcda_init
Hbl = Ein
' ################################################
' # #
' #---------------Arbeitsschleife----------------#
' # #
' ################################################
Do 'Hauptschleife-Beginn
If Taster_hbl = 0 Then 'Taster Hintergrundbeleuchtung
Hbl = Ein
Else
Hbl = Aus
End If
If Puls = 1 Then 'Puls wird von Sectic auf 1 gesetzt
Dtag = Dayofweek() 'Wochentag ermitteln
Wtag = Lookupstr(dtag , Wochentage) 'Wochentag im Klartext
Lcda_ 1 , 9 , Time$ 'Zeit anzeigen
Lcda_ 2 , 1 , Wtag 'Wochentag anzeigen
Lcda_ 2 , 9 , Date$ 'Datum anzeigen
Text = Time(dcf_sec) 'DCF-Zeit anzeigen
Lcda_ 3 , 9 , Text
Reset Puls
Else
End If
If Status_old <> Dcf_status Then 'Ausführen beim neuen Status
Status_old = Dcf_status 'Status kopieren
Text = Bin(dcf_status) 'in String konvertieren
Lcda_ 4 , 9 , Text 'Statusbits binär anzeigen
Else
End If
If Taster2 = 0 Then 'CLS und Zähler-Test
Hbl = Aus
Lcda_init 'Display neu initialisieren
Waitms 250
Bitwait Taster2 , Set
Hbl = Ein
For I = 0 To 255 'Variablenausgabe-Test
Text = Str(i) 'Binär zu String wandeln
Lcda_ 1 , 7 , Text
Lcda_ 1 , 23 , Text 'entspricht 3 , 7
Lcda_ 2 , 7 , Text
Lcda_ 2 , 23 , Text 'entspricht 4 , 7
Next I
Waitms 500
Lcda_cls 'beide Displayhälften löschen
Reset Tb 'Toggel-Bit auf 0
Reset Ab 'Taster-Bit auf 0
Else
End If
If Taster = 0 Then 'Displayanzeige wechseln
Toggle Tb 'Toggle-Bit wechseln
Reset Ab 'Anzeige-Bit zurücksetzen
Waitms 250
Bitwait Taster , Set
Else
End If
If Tb = 0 Then
If Ab = 0 Then 'Layout einmal ausgeben
Lcda_cls
Lcda_ 1 , 1 , "Uhrzeit"
Lcda_ 2 , 4 , " der "
Lcda_ 1 , 17 , "DCF_sec="
Lcda_ 2 , 17 , "CASSIO "
Set Ab
Else
End If
Else
For I = 1 To 4 'Geschwindigkeitstest aller 64 Zeichen
For I2 = 1 To 16
Lcda_ I , I2 , "X"
Next I2
Next I
Wait 1
Tb = 0
End If
' ----------------------------------------
If _sec > 1 Then Reset Dcf_status.7 'Sync-Bit der Softclock zurücksetzen
If _sec = 1 Then
If Dcf_status.7 = 1 Then
Sync = 1 'Sync der Softclock merken
Else
Sync = 0 'Kein Sync der Softclock
End If
Else
End If
' ----------------------------------------
If Sync = 1 Then 'Wenn Sync der Softclock, dann...
Lcda_ 1 , 8 , "="
Reset Led 'LED EIN
Else 'wenn kein Sync, dann.....
Lcda_ 1 , 8 , ":"
Set Led 'LED AUS
End If
Loop 'Hauptschleife-Ende
End 'end program
' #############################################################################
Sectic:
Set Puls
Return
' #############################################################################
Sub Lcda_(x1 As Byte , X2 As Byte , Text1 As String * 20) 'Sub zur Zeichenausgabe am Display
$include "_lcda_i2c.bas"
' #############################################################################
Sub Lcda_cls: 'Sub zum löschen beider Displayhälften
$include "_lcda_CLS.bas"
' #############################################################################
Sub Lcda_init: 'Sub zum initialisieren beider Displayhälften
$include "_lcda_init.bas"
' #############################################################################
Wochentage:
Data "Mon" , "Die" , "Mit" , "Don" , "Fre" , "Sam" , "Son"