'# LCD-Routinen für M50530 # '# ======================= # '# # '# Titel : 4 Bit LCD M50530 # '# Autor : Arno Schweißinger # '# Datum : 27.12.2013 # '# Datum : 05.01.2014 # '# : Uhrzeit stellen eingefügt # '# # '# Stromversorgung: 5V aus dem USB-Port # '# Bauteile: LCD M50530 # '# AtMega8 1MHz # '# Uhrenquarz 32768hz # '# 2 Taster # '# 74AC14 # '# als Spannungsverdoppler # '# # '# Taster Pin: Pd.7 Stunden stellen # '# Taster Pin: Pd.6 Minuten stellen # '# Xtal Pin: Pb6 Pb7 # '# # '# 4bit-Interface M50530 # '# DB4: Alias Portc.0 # '# DB5: Alias Portc.1 # '# DB6: Alias Portc.2 # '# DB7: Alias Portc.3 # '# OC1: Alias Portb.2 # '# OC2: Alias Portb.1 # '# EX: Alias Portb.0 # ' Ports ggf anpassen _d4 Alias Portc.0 _d5 Alias Portc.1 _d6 Alias Portc.2 _d7 Alias Portc.3 _oc1 Alias Portc.4 _oc2 Alias Portc.5 _ex Alias Portb.1 Taster1 Alias Pind.6 ' Minuten Taster2 Alias Pind.7 ' Stunden Const _extime = 20 ' 20us Execution Time Ddrd = &B0011_1111 ' Pin PD6 PD7 auf Eingang Portd = &B1100_0000 ' Pin PD6 PD7 Pullup aktivieren $regfile = "m8def.dat" $crystal = 1000000 ' Internal RC-Osc Enable Interrupts Config Date = Dmy , Separator = . ' ANSI-Format Config Clock = Soft ' Date$ = "26.03.07" Time$ = "21:46:45" Declare Sub Lcd_init() Declare Sub Lcd_str(message As String * 24) Declare Sub Lcd_xy(_x As Byte , _y As Byte) Declare Sub Lcd_cls Declare Sub Lcd_byte(by As Byte) Declare Sub Lcd_command(command As Byte) Declare Sub Lcd_out(command As Byte) Declare Sub Lcd_enable Declare Sub Prg_init Declare Sub Tastatur Declare Sub Textausgabe Declare Sub Striche Dim Temp As Byte ' Übergabe an Sub Dim Lcd_parameter As Byte ' Übergabe an Sub Dim _ch As String * 1 ' char in sub Lcd_str Dim _i As Byte ' Zählschleife Sub Lcd_str Dim Text As String * 24 ' Ausgabe einer Zeile Dim X As Byte , Y As Byte ' Übergabe Cursor Position Dim Felder As Byte ' Sub Textausgabe Zählschleife Dim Modfelder As Byte ' Sub Textausgabe Zählschleife Dim Stunde As Byte ' Sub Textausgabe Dim Index1 As Integer ' Sub Textausgabe Dim Feldpos As Byte ' Sub Textausgabe Dim Strich As String * 1 ' sub striche Strich = "-" ' sub striche Dim Ltext As Byte ' sub striche länge text Dim Itext As Byte ' sub striche Zählschleife '------------------------- ' Begin Hauptprogramm '------------------------- Call Prg_init Call Lcd_init Do Call Textausgabe Call Tastatur Waitms 200 Loop End '------------------------- ' Ende Hauptprogramm '------------------------- Sub Prg_init Config _oc1 = Output Config _oc2 = Output Config _ex = Output Config _d4 = Output Config _d5 = Output Config _d6 = Output Config _d7 = Output Config Taster1 = Input Config Taster2 = Input End Sub Sub Tastatur '------------------ Minuten stellen ------------------------ If Taster1 = 0 Then _sec = 00 ' Sekunden löschen _min = _min + 1 If _min = 60 Then _min = 0 Temp = _min Call Textausgabe Waitms 500 ' 1/2 Sekunde warten While Taster1 = 0 ' Taster gehalten, dann scheller Vorlauf _min = _min + 1 If _min = 60 Then _min = 0 Temp = _min Call Textausgabe Waitms 200 ' 1/5 Sekunde warten Wend End If '------------------ Stunden stellen ------------------------ If Taster2 = 0 Then _hour = _hour + 1 If _hour = 24 Then _hour = 0 Temp = _hour Call Textausgabe Waitms 500 ' 1/2 Sekunde warten While Taster2 = 0 ' scheller Vorlauf _hour = _hour + 1 If _hour = 24 Then _hour = 0 Temp = _hour Call Textausgabe Waitms 200 ' 1/5 Sekunde warten Wend End If End Sub '**************************************************************************** Sub Textausgabe X = 1 : Y = 8 Call Lcd_xy(x , Y) Call Lcd_str(time$) ' als Ziffern Index1 = Lookup(_min , Textfolge ) Feldpos = 0 For Felder = 0 To 11 ' Anzahl der Texte für Minuten X = Lookup(feldpos , Koordinaten ) Incr Feldpos Y = Lookup(feldpos , Koordinaten ) Incr Feldpos Call Lcd_xy(x , Y) Text = Lookupstr(felder , Textfeld ) If Index1.felder = 1 Then Call Lcd_str(text) Else Call Striche End If Next Felder Feldpos = 0 Stunde = _hour ' kopie der Stunden If Stunde = 0 Then Stunde = 12 ' Null Uhr gibt es nicht If Stunde > 12 Then Stunde = Stunde - 12 ' Keine 13-24 stunden If Index1.12 = 1 Then Incr Stunde ' Stunde weiter anzeigen If Stunde = 13 Then Stunde = 1 ' Nullduchgang Decr Stunde ' Felder 0 - 11 For Felder = 0 To 11 ' 12 Stunden X = Lookup(feldpos , Zahlenkoor ) Incr Feldpos Y = Lookup(feldpos , Zahlenkoor ) Incr Feldpos Call Lcd_xy(x , Y) Text = Lookupstr(felder , Zahlentext ) If Felder = Stunde Then Call Lcd_str(text) Else Call Striche End If Next Felder End Sub Sub Striche Ltext = Len(text) For Itext = 1 To Ltext Call Lcd_str(strich) Next Itext End Sub '**************************************************************************** Sub Lcd_init() Lcd_parameter = &B11011010 ' set function mode (SF) 0b11011010 Call Lcd_command(lcd_parameter) ' 4bit-Modus einstellen 11 -4/8bit-FONT-2xDUTY-2xRAM Lcd_parameter = $50 ' set entry mode (SE) 0b01010000 Call Lcd_command(lcd_parameter) ' Cursor selbst setzen Lcd_parameter = $30 ' set display mode (SD) 0b00110011 Call Lcd_command(lcd_parameter) ' Display ein, Cursor nicht anzeigen Call Lcd_cls End Sub Sub Lcd_str(message) For _i = 1 To 24 _ch = Mid(message , _i , 1) Temp = Asc(_ch) If Temp = 0 Then Exit For Call Lcd_byte(temp) Next _i End Sub Sub Lcd_byte(by) Reset _oc1 ' Write DATA RAM Set _oc2 Call Lcd_out(by) End Sub Sub Lcd_xy(_x , _y ) Select Case _y Case 1 : Lcd_parameter = $00 ' $00 Werte bei SF=$D8 Case 2 : Lcd_parameter = $30 ' $40 Case 3 : Lcd_parameter = $60 ' $80 Case 4 : Lcd_parameter = $90 ' $c0 Case 5 : Lcd_parameter = $18 ' $18 Case 6 : Lcd_parameter = $48 ' $58 Case 7 : Lcd_parameter = $78 ' $98 Case 8 : Lcd_parameter = $a8 ' $d8 Case Else : Lcd_parameter = $00 End Select Lcd_parameter = Lcd_parameter + _x Decr Lcd_parameter Set _oc1 ' Write Cursor adress to RAM Set _oc2 Call Lcd_out(lcd_parameter) End Sub Sub Lcd_cls Lcd_parameter = $01 ' Command: Clear Home Call Lcd_command(lcd_parameter) Waitms 2 End Sub Sub Lcd_command(command) Reset _oc1 ' Command Reset _oc2 Call Lcd_out(command) End Sub Sub Lcd_out(command) ' first high nibble If Command.7 = 1 Then Set _d7 Else Reset _d7 End If If Command.6 = 1 Then Set _d6 Else Reset _d6 End If If Command.5 = 1 Then Set _d5 Else Reset _d5 End If If Command.4 = 1 Then Set _d4 Else Reset _d4 End If Call Lcd_enable ' second low nibble If Command.3 = 1 Then Set _d7 Else Reset _d7 End If If Command.2 = 1 Then Set _d6 Else Reset _d6 End If If Command.1 = 1 Then Set _d5 Else Reset _d5 End If If Command.0 = 1 Then Set _d4 Else Reset _d4 End If Call Lcd_enable End Sub Sub Lcd_enable Set _ex : Waitus _extime Reset _ex : Waitus _extime End Sub '**************************************************************************** Textfolge: ' ' Decodieren der Minuten in Text ' ' 0.Bit = Es ist ' 1.Bit = Eben War ' 2.Bit = Gleich ' 3.Bit = Kurz ' 4.Bit = Fünf ' 5.Bit = Zehn ' 6.Bit = Viertel ' 7.Bit = Zwanzig ' 8.Bit = Vor ' 9.Bit = Nach ' 10.Bit = Halb ' 11.Bit = Punkt ' 12.Bit = Stunde + 1 ' Data 2049% '00 Data 2% '01 Data 521% '02 Data 521% '03 Data 533% '04 Data 529% '05 Data 530% '06 Data 530% '07 Data 549% '08 Data 549% '09 Data 545% '10 Data 546% Data 546% Data 581% Data 581% Data 577% Data 578% Data 578% Data 645% Data 645% Data 641% Data 642% Data 642% Data 5397% Data 5397% Data 5393% Data 5394% Data 5394% Data 5389% Data 5385% Data 5121% Data 5641% Data 5641% Data 5653% Data 5653% Data 5649% Data 5650% Data 5650% Data 4485% Data 4485% Data 4481% Data 4482% Data 4482% Data 4421% Data 4421% Data 4417% Data 4418% Data 4418% Data 4389% Data 4389% Data 4385% Data 4386% Data 4386% Data 4373% Data 4373% Data 4369% Data 4370% Data 4370% Data 4359% '58 Data 4357% '59 Textfeld: Data "Es ist" Data "Eben war" Data "gleich" Data "kurz" Data "fuenf" Data "zehn" Data "viertel" Data "zwanzig" Data "vor" Data "nach" Data "halb" Data "Punkt" ' 12.Bit = Stunde + 1 Beispiel 10:55 Uhr sprich:"fünf vor elf" Koordinaten: Data 1 , 1 ' "Es ist " Data 8 , 1 ' "Eben war " Data 17 , 1 ' "gleich " Data 1 , 2 ' "kurz " Data 6 , 2 ' "fünf " Data 12 , 2 ' "zehn " Data 17 , 2 ' "viertel" Data 1 , 3 ' "zwanzig" Data 9 , 3 ' "vor" Data 13 , 3 ' "nach" Data 18 , 3 ' "halb" Data 1 , 4 ' "Punkt" Zahlentext: Data "eins" Data "zwei" Data "drei" Data "vier" Data "fuenf" Data "sechs" Data "sieben" Data "acht" Data "neun" Data "zehn" Data "elf" Data "zwoelf" Zahlenkoor: ' X , Y Data 7 , 4 ' "eins" Data 12 , 4 ' "zwei" Data 17 , 4 ' "drei" Data 1 , 5 ' "vier" Data 6 , 5 ' "fuenf" Data 12 , 5 ' "sechs" Data 18 , 5 ' "sieben" Data 1 , 6 ' "acht" Data 6 , 6 ' "neun" Data 11 , 6 ' "zehn" Data 22 , 4 ' "elf" Data 17 , 6 ' "zwolf"