Ich habe einmal eine LCD-Ansteuerung auf dem PC via Paraschnitstelle geschrieben. Das ganez dann auf den AVR umgelegt.
Hiermit kannst du das regeln, musst allerdings in den LCD_Wait funktionen die Zeiten entsprechend auf die Taktraten anpassen!!!
Code:
'########################################################################################################################################
'# LCD-Routinen #########################################################################################################################
'########################################################################################################################################
'LCD Winstar 1202A Spezifische Routinen
Sub Lcd_send(byval V_value As Byte)
'## maskiert ausgeben!!
'Out Lcd_adr , V_value
End Sub
Sub Lcd_send_statecode(byval V_rs As Byte , Byval V_rw As Byte , Byval V_clock As Byte)
Dim V As Byte
'## V (startwert für Bytemaske vordevinieren)
V = 3
If V_rs = 1 Then V = V And 254
If V_rw = 1 Then V = V And 253
If V_clock = 1 Then V = V Or 4
'## maskiert ausgeben!!
'Out LCD_ADR + 2, V
End Sub
Sub Lcd_send_clock_init()
Call Lcd_send_statecode(0 , 0 , 1)
Waitus 1800
Call Lcd_send_statecode(0 , 0 , 0 )
Waitus 1800
End Sub
Sub Lcd_send_clock_cmd()
Call Lcd_send_statecode(0 , 0 , 1)
Waitus 45
Call Lcd_send_statecode(0 , 0 , 0)
Waitus 45
End Sub
Sub Lcd_send_clock_data()
Call Lcd_send_statecode(1 , 0 , 1)
Waitus 45
Call Lcd_send_statecode(1 , 0 , 0)
Waitus 45
End Sub
Sub Lcd_init()
'## LCD-BYTE Adresswert festlegen
'Lcd_adr = 0
Lcd_display = 8
'LCD-Reset
Call Lcd_send(48)
Call Lcd_send_clock_init
Call Lcd_send(48)
Call Lcd_send_clock_init
Call Lcd_send(48)
Call Lcd_send_clock_init
'LCD-Init
Call Lcd_send(44)
Call Lcd_send_clock_init
Call Lcd_send(4)
Call Lcd_send_clock_init
Call Lcd_clear
Call Lcd_set_displayon(1)
End Sub
Sub Lcd_clear()
Call Lcd_send(1)
Call Lcd_send_clock_init
Call Lcd_set_position_cursor(1 , 0)
End Sub
Sub Lcd_set_displayon(byval V_value As Byte)
If V_value = 1 Then
Lcd_display = Lcd_display Or 4
Else
Lcd_display = Lcd_display Xor 4
End If
Call Lcd_send(lcd_display)
Call Lcd_send_clock_init
End Sub
Sub Lcd_set_cursoron(v_value As Byte)
If V_value = 1 Then
Lcd_display = Lcd_display Or 2
Else
Lcd_display = Lcd_display Xor 2
End If
Call Lcd_send(lcd_display)
Call Lcd_send_clock_init
End Sub
Sub Lcd_put_text_multichar(byval V_string As String)
For Xbyte = 1 To Len(v_string)
Xstring = Mid(v_string , Xbyte , 1)
Xchar = Asc(xstring)
Call Lcd_put_text_monochar(xchar)
Next
For Xbyte = Len(v_string) To 12
Call Lcd_put_text_monochar(32)
Next
End Sub
Sub Lcd_put_text_monochar(byval V_char As Byte)
Call Lcd_send(v_char)
Call Lcd_send_clock_data
Call Lcd_shift_cursor(1)
End Sub
Sub Lcd_shift_cursor(byval V_left As Byte)
If V_left = 1 Then
Call Lcd_send(24)
Else
Call Lcd_send(28)
End If
Call Lcd_send_clock_cmd
'Call Lcd_wait1
End Sub
Sub Lcd_set_position_line(byval V_line As Byte)
Select Case V_line
Case 1 : Lad = 128
Case 2 : Lad = 192
End Select
Call Lcd_send(lad)
Call Lcd_send_clock_cmd
End Sub
Sub Lcd_set_position_cursor(byval V_line As Byte , Byval V_pos As Byte)
Select Case V_line
Case 1 : Lad = 128 Or V_pos
Case 2 : Lad = 192 Or V_pos
End Select
Call Lcd_send(lad)
Call Lcd_send_clock_cmd
End Sub
Diese Funktionen kannst du ganz leicht an unterschiedliche Zeilen und Zeichen anpassen.
JimJim
XUN
Lesezeichen