TobiasBlome
02.10.2009, 16:48
Hallo,
wie programmiert ihr einen Zeilenumbruch?
LCD: 4*20 Zeichen
Der Text wird über die serielle Schnittstelle -> UDR empfangen und in einem String*20 geschrieben.
Nun war die Überlegung den String*80 zu machen und mit MID aufzuteilen. Leider habe ich hier nur einen ATtiny2313 zur Verfügung und der schafft nur String*60 maximal.
Was mir aufgefallen ist: Wenn ich mehr als 20 Zeichen sende, erscheinen die aber (etwas abgehackt) trotzdem auf dem LCD? wieso? wird der String nicht erst wieder leer gemacht und dann mit LCD auf dem Display überschrieben?
Tobias
mein Code bisher...
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "ATtiny2313.dat" 'ATtiny2313-Deklarationen
$hwstack = 32
$swstack = 8
$framesize = 24
'$crystal = 14745600 'Quarz: 14,7456 MHz
$crystal = 8000000
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein / Ausgänge definieren:
Ddrd = &B1111111 'Pin PD5-0 als Eingang / 6 als Ausgang (LCD) konfigurieren
Ddrb = &B11111111
'PullUps setzen:
Portd = &B0111100 '1 = PullUp AKTIV
Portb = &B00100000 '1 = PullUp AKTIV
'-------------------------------------------------------------------------------
'LCD konfiguration
Config Lcd = 20 * 4 'LCD größe
Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.3 , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Portd.6
Cursor Off Noblink
'-------------------------------------------------------------------------------
'Alias
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4
Taster4 Alias Pind.5
Taster5 Alias Pinb.5
'-------------------------------------------------------------------------------
'Variablen
Dim Parameter As String * 20 'max 60
Dim E_byte As Byte , E_flag As Byte
'-------------------------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "RS232 - LCD"
'-------------------------------------------------------------------------------
'Für RS232:
On Urxc Onrxd 'Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen
'-------------------------------------------------------------------------------
Do 'Hauptschleife
'Tasterabfrage:
If Taster1 = 0 Then
Print "Taster1"
Cls
Lcd "Taster1"
End If
'RS232 - Empfang umwandeln
If E_flag = 1 Then 'Empfangsstring komplett
' Substring = Mid(String , A , B)
Print Parameter
Cls
Lcd Parameter
Parameter = "" 'Parameter löschen
E_flag = 0 'Empfang neu setzen
End If
Loop
'-------------------------------------------------------------------------------
Onrxd:
E_byte = Udr
If E_byte = 13 Then '13 = CR (Enter)
E_flag = 1
Else
Parameter = Parameter + Chr(e_byte)
End If
Return
wie programmiert ihr einen Zeilenumbruch?
LCD: 4*20 Zeichen
Der Text wird über die serielle Schnittstelle -> UDR empfangen und in einem String*20 geschrieben.
Nun war die Überlegung den String*80 zu machen und mit MID aufzuteilen. Leider habe ich hier nur einen ATtiny2313 zur Verfügung und der schafft nur String*60 maximal.
Was mir aufgefallen ist: Wenn ich mehr als 20 Zeichen sende, erscheinen die aber (etwas abgehackt) trotzdem auf dem LCD? wieso? wird der String nicht erst wieder leer gemacht und dann mit LCD auf dem Display überschrieben?
Tobias
mein Code bisher...
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "ATtiny2313.dat" 'ATtiny2313-Deklarationen
$hwstack = 32
$swstack = 8
$framesize = 24
'$crystal = 14745600 'Quarz: 14,7456 MHz
$crystal = 8000000
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein / Ausgänge definieren:
Ddrd = &B1111111 'Pin PD5-0 als Eingang / 6 als Ausgang (LCD) konfigurieren
Ddrb = &B11111111
'PullUps setzen:
Portd = &B0111100 '1 = PullUp AKTIV
Portb = &B00100000 '1 = PullUp AKTIV
'-------------------------------------------------------------------------------
'LCD konfiguration
Config Lcd = 20 * 4 'LCD größe
Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.3 , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Portd.6
Cursor Off Noblink
'-------------------------------------------------------------------------------
'Alias
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4
Taster4 Alias Pind.5
Taster5 Alias Pinb.5
'-------------------------------------------------------------------------------
'Variablen
Dim Parameter As String * 20 'max 60
Dim E_byte As Byte , E_flag As Byte
'-------------------------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "RS232 - LCD"
'-------------------------------------------------------------------------------
'Für RS232:
On Urxc Onrxd 'Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen
'-------------------------------------------------------------------------------
Do 'Hauptschleife
'Tasterabfrage:
If Taster1 = 0 Then
Print "Taster1"
Cls
Lcd "Taster1"
End If
'RS232 - Empfang umwandeln
If E_flag = 1 Then 'Empfangsstring komplett
' Substring = Mid(String , A , B)
Print Parameter
Cls
Lcd Parameter
Parameter = "" 'Parameter löschen
E_flag = 0 'Empfang neu setzen
End If
Loop
'-------------------------------------------------------------------------------
Onrxd:
E_byte = Udr
If E_byte = 13 Then '13 = CR (Enter)
E_flag = 1
Else
Parameter = Parameter + Chr(e_byte)
End If
Return