' ' Fuer Pollin Display 16080 mit Touch ' allu 9/2009 ' ' Hinweis: ' - Wenn Fehler zu ADCSRA oder ADCSR gemeldet werden, den jeweils ' .....anderen Registernamen einsetzen. ' ' Angepasst an Mega32, allu 11/2009 ' ' Hinweis zum Mega32: ' - JTAG-Interface des Mega32 muss ausgeschaltet sein, ' .....ansonsten können PC2 bis PC4 nicht verwendet werden ' 'Hinweis zu Bascom: ' - Falls die Baudrate für die serielle Schnittstelle initialisiert wird, ' ..... . sind PD0 und PD1 nicht mehr verfügbar ' $regfile = "m8def.DAT" $regfile = "m32def.DAT" ' ATMega32 ' $crystal = 8000000 ' Anpassen an die Hardware, Taktfrequenz $crystal = 16000000 ' $baud = 19200 ' Reserviert TxD und RxD für die serielle Schnittstelle ' ..... PD0 und PD1 sind dann nicht mehr verfügbar $hwstack = 64 $swstack = 256 $framesize = 84 'PortPins zum Display 16080 festlegen und initialisieren ' Daten_bus_out Alias Portb ' Anpassen an die Hardware -> Daten-Bus Display ' Daten_bus_in Alias Pinb ' Daten_ddr Alias Ddrb Daten_bus_out Alias Portc Daten_bus_in Alias Pinc Daten_ddr Alias Ddrc Auf_input_stellen Alias &H00 Auf_output_stellen Alias &HFF Bussy Alias 7 ' Touch_control Alias Portc ' Anpassen an die Hardware -> Touchanschluss ' Touch_ddr Alias Ddrc Touch_control Alias Porta Touch_ddr Alias Ddra Y_minus Alias 0 Y_plus Alias 1 X_plus Alias 2 X_minus Alias 3 Out_y_minus Alias 0 Out_y_plus Alias 1 Out_x_plus Alias 2 Out_x_minus Alias 3 In_y_minus Alias 0 In_y_plus Alias 1 In_x_plus Alias 2 In_x_minus Alias 3 Ungedrueckt Alias &HF0 Kalibriert Alias 173 Dim X_vorher As Byte Dim Y_vorher As Byte Dim X_aktuell As Byte Dim Y_aktuell As Byte Dim X_melden As Byte Dim Y_melden As Byte Dim Dummy As Byte Dim F_taste As Byte ' Control_bus Alias Portd '' Anpassen an die Hardware -> Control-Bus Display ' Rs Alias 2 ' Rw Alias 3 ' E Alias 4 ' Cs Alias 6 ' R Alias 7 Control_bus Alias Portd Rs Alias 6 Rw Alias 5 E Alias 7 Cs Alias 4 R Alias 3 Pullups_ein Alias &HFF Config Daten_bus_out = Input Daten_bus_out = Pullups_ein Config Control_bus = Input Control_bus = Pullups_ein Config Control_bus = Output Reset Control_bus.e Accu_l Alias R0 Accu_h Alias R1 Bccu_l Alias R2 Bccu_h Alias R3 ' R4, R5, R6 und R8 verwendet von Bascom Zeile Alias R9 Spalte Alias R10 Zeichen Alias R11 Set_touch_aktiviert Alias &B00000010 Clear_touch_aktiviert Alias &B00000010 Skip_touch_aktiviert Alias 1 Set_touch_meldet Alias &B00000001 Flag_touch_aktiviert Alias R16 Flag_touch_meldet Alias R17 Temp_1 Alias R18 Temp_2 Alias R19 Temp_3 Alias R20 Daten Alias R22 Befehl Alias R23 Cursor_l Alias R24 Cursor_h Alias R25 Dim Touch_aktiviert As Byte Dim Touch_meldet As Byte Ja Alias 1 Erledigt Alias 0 Dim X_oben_links As Byte Dim X_oben_rechts As Byte Dim X_unten_links As Byte Dim X_unten_rechts As Byte Dim Y_oben_links As Byte Dim Y_oben_rechts As Byte Dim Y_unten_links As Byte Dim Y_unten_rechts As Byte Dim X_1_pos As Byte Dim Y_1_pos As Byte Dim X_pro_spaltenbreite As Byte Dim Y_pro_zeilenhoehe As Byte Dim Ticker As Byte Dim Irq_teiler As Byte Dim Locate_zeile As Byte ' 0 bis 79 = 80 Zeilen Dim Locate_spalte As Byte ' 0 bis 22 = 23 Spalten Dim Lcd_string As String * 23 ' Gibt Eingaben vim Display zurück Dim Touch_string As String * 23 Dim Touch_string_zeiger As Byte Dim Lcd_format(192) As Byte Dim Lcd_form_0 As String * 23 At Lcd_format(1) Overlay Dim Lcd_form_1 As String * 23 At Lcd_format(25) Overlay Dim Lcd_form_2 As String * 23 At Lcd_format(49) Overlay Dim Lcd_form_3 As String * 23 At Lcd_format(73) Overlay Dim Lcd_form_4 As String * 23 At Lcd_format(97) Overlay Dim Lcd_form_5 As String * 23 At Lcd_format(121) Overlay Dim Lcd_form_6 As String * 23 At Lcd_format(145) Overlay Dim Lcd_form_7 As String * 23 At Lcd_format(169) Overlay $eeprom Touch_kal_werte: ' Platzhalter und Defaultwerte Data Kalibriert ' schon kalibriert ? Data 50 ' X_1_Pos = rechter Randabstand Data 60 ' Y_1_Pos = linker Randabstand Data 122 ' X_pro_Spaltenbreite Data 85 ' Y_pro_Zeilenhöhe $data Gosub Display_und_touch_initialisieren ' Hier beginnt das Hauptprogramm Dim Timer_a As Byte Dim Timer_b As Byte Dim Temp_a As Word Dim Temp_b As Integer ' TestPins für Zeitmessungen Config Portb.0 = Output ' zum Zeiten messen, nur zum Testzwecker Config Portb.1 = Output ' Hauptmenue _kalibrieren Alias 1 + 48 + 128 _texteingabe Alias 2 + 48 + 128 _delete Alias 3 + 48 + 128 _touch_werte_anzeigen Alias 4 + 48 + 128 _menue Alias 5 + 48 + 128 _timers Alias 6 + 48 + 128 Gosub Auswahl Do If Touch_meldet = Ja Then Touch_meldet = Erledigt Select Case F_taste Case _kalibrieren : Gosub Touch_kalibrieren Case _texteingabe : Gosub Zeicheneingabe Case _touch_werte_anzeigen : Gosub Touch_werte_anzeigen Case _timers : Gosub Timers End Select End If Loop Timers: Gosub Lcd_clear Gosub Lcd_form_clear Locate_zeile = 71 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " MENUE" Lcd_form_7 = " (5 )" Gosub Lcd_write_string Gosub Lcd_form_aufbau Do Loop Until F_taste = _menue Gosub Auswahl Return Auswahl: Gosub Lcd_clear Gosub Lcd_form_clear Locate_zeile = 11 Locate_spalte = 0 Lcd_string = " A u s w a h l" Gosub Lcd_write_string Locate_zeile = 31 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " TIMER" Lcd_form_3 = " (6 )" Gosub Lcd_write_string Locate_zeile = 51 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " TOUCHWERTE ANZEIGEN" Lcd_form_5 = " (4 )" Gosub Lcd_write_string Locate_zeile = 71 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "KALIBRIEREN TEXTEINGABE" Lcd_form_7 = "(1 ) (2 )" Gosub Lcd_write_string Gosub Lcd_form_aufbau Return Touch_werte_anzeigen: Set Portb.1 Gosub Lcd_clear Gosub Lcd_form_clear Locate_zeile = 01 Locate_spalte = 0 Lcd_string = "01234567890123456789012" Lcd_form_0 = Lcd_string Gosub Lcd_write_string Locate_zeile = 11 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "1 " + Chr(&H5b) 'Ä Lcd_form_1 = Lcd_string Gosub Lcd_write_string Locate_zeile = 21 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "2 " + Chr(&H5c) 'Ö Lcd_form_2 = Lcd_string Gosub Lcd_write_string Locate_zeile = 31 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "3 " + Chr(&H5d) 'Ü Lcd_form_3 = Lcd_string Gosub Lcd_write_string Locate_zeile = 41 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "4 MENUE " + Chr(&H7b) 'ä Lcd_form_4 = "4 (5 ) " + Chr(&H7b) 'ä Gosub Lcd_write_string Locate_zeile = 51 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "5 " + Chr(&H7c) 'ö Lcd_form_5 = Lcd_string Gosub Lcd_write_string Locate_zeile = 61 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "6 " + Chr(&H7d) 'ü Lcd_form_6 = Lcd_string Gosub Lcd_write_string Locate_zeile = 71 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "7abcdefghijklmnopqrstu" + Chr(&H7e) 'ß Lcd_form_7 = Lcd_string Gosub Lcd_write_string Gosub Lcd_form_aufbau Locate_zeile = 51 Locate_spalte = 2 Lcd_string = "X1P=" + Str(x_1_pos) + " Y1P=" + Str(y_1_pos) Gosub Lcd_write_string Locate_zeile = 61 Locate_spalte = 2 Lcd_string = "XpS=" + Str(x_pro_spaltenbreite) + " YpZ=" + Str(y_pro_zeilenhoehe) Gosub Lcd_write_string Reset Portb.1 Do If Touch_meldet = Ja Then Locate_zeile = 21 Locate_spalte = 2 Lcd_string = "Raster:Y=" + Str(y_melden) + " X=" + Str(x_melden) + " " Gosub Lcd_write_string Locate_zeile = 31 Locate_spalte = 2 Lcd_string = "Fein:Y=" + Str(y_aktuell) + " X=" + Str(x_aktuell) + " " Gosub Lcd_write_string Lcd_string = "Chr:" + Chr(f_taste) + " Wert=" + Str(f_taste) + " " Locate_zeile = 11 Locate_spalte = 2 Gosub Lcd_write_string Touch_meldet = Erledigt End If Loop Until F_taste = _menue Gosub Auswahl Return Zeicheneingabe: Set Portb.1 Gosub Lcd_clear Gosub Lcd_form_clear Locate_zeile = 21 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " ABCDEFGHIJKLM 123 " Lcd_form_2 = Lcd_string Gosub Lcd_write_string Locate_zeile = 31 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " NOPQRSTUVWXYZ 456" Lcd_form_3 = Lcd_string Gosub Lcd_write_string Locate_zeile = 41 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " abcdefghijklm 789" Lcd_form_4 = Lcd_string Gosub Lcd_write_string Locate_zeile = 51 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = " nopqrstuvwxyz 0 _" Lcd_form_5 = Lcd_string Gosub Lcd_write_string Locate_zeile = 71 Locate_spalte = 0 'Muster = "01234567890123456789012" Lcd_string = "DELETE MENUE" Lcd_form_7 = "(3 ) (5 )" Gosub Lcd_write_string Gosub Lcd_form_aufbau Touch_string = " " Touch_string_zeiger = 1 Locate_zeile = 61 Locate_spalte = 0 Lcd_string = "Input:" + Touch_string + "-" Gosub Lcd_write_string Reset Portb.1 Do If Touch_meldet = Ja Then Set Portb.1 If F_taste < 128 Then Lcd_string = "Zeichen :" + Chr(f_taste) + " Wert=" + Str(f_taste) + " " Else Lcd_string = "Funktion:" + Chr(f_taste) + " Wert=" + Str(f_taste) + " " End If Locate_zeile = 11 Locate_spalte = 0 Gosub Lcd_write_string Locate_zeile = 01 Locate_spalte = 0 Lcd_string = "Position: Y=" + Str(y_melden) + " X=" + Str(x_melden) + " " Gosub Lcd_write_string ' Eingabetext aufbauen If F_taste > 1 And F_taste < 128 And Touch_string_zeiger < 13 Then Touch_string = Touch_string + Chr(f_taste) Incr Touch_string_zeiger Locate_zeile = 61 Locate_spalte = 0 If Touch_string_zeiger > 12 Then Lcd_string = "Input:" + Touch_string Else Lcd_string = "Input:" + Touch_string + "-" End If Gosub Lcd_write_string End If If F_taste = _delete Then If Touch_string_zeiger > 1 Then Decr Touch_string_zeiger Touch_string = Left(touch_string , Touch_string_zeiger) Locate_zeile = 61 Locate_spalte = 0 Lcd_string = "Input:" + Touch_string + "- " Gosub Lcd_write_string End If End If Touch_meldet = Erledigt Reset Portb.1 End If Loop Until F_taste = _menue Gosub Auswahl Return 'Unterprogramme Display_und_touch_initialisieren: ' Display und Touch initialisieren ' GLcd im Grafikmode mit 23 Spalten initialisieren: Waitms 50 Reset Control_bus.r Waitus 50 Set Control_bus.r Waitms 10 Gosub Lcd_initialisieren Gosub Lcd_clear Gosub Touch_init 'Touch per Interupt abfragen Config Timer0 = Timer , Prescale = 1024 Enable Timer0 Enable Interrupts On Ovf0 Tim0_isr 'enable the interrupt ' Gosub ' Touch_kal_werte_laden ' Return ' Touch_kal_werte_laden: Readeeprom Temp_a , Touch_kal_werte If Temp_a = Kalibriert Then Readeeprom X_1_pos Readeeprom Y_1_pos Readeeprom X_pro_spaltenbreite Readeeprom Y_pro_zeilenhoehe Else Gosub Touch_kalibrieren End If Return Touch_kalibrieren: Gosub Lcd_clear Gosub Lcd_form_clear Gosub Zielscheiben_malen If X_pro_spaltenbreite < 114 Or X_pro_spaltenbreite > 130 Then Gosub Touch_default_werte_eintragen Elseif Y_pro_zeilenhoehe < 79 Or Y_pro_zeilenhoehe > 91 Then Gosub Touch_default_werte_eintragen Elseif X_1_pos > 80 Or Y_1_pos > 80 Then Gosub Touch_default_werte_eintragen Else Temp_a = Kalibriert Writeeeprom Temp_a , Touch_kal_werte Writeeeprom X_1_pos Writeeeprom Y_1_pos Writeeeprom X_pro_spaltenbreite Writeeeprom Y_pro_zeilenhoehe End If Gosub Auswahl Return Touch_default_werte_eintragen: Locate_zeile = 51 Locate_spalte = 1 Lcd_string = "KX=" + Str(x_pro_spaltenbreite) + " " Gosub Lcd_write_string Lcd_string = "KY=" + Str(y_pro_zeilenhoehe) Gosub Lcd_write_string Lcd_string = " Fehler" Gosub Lcd_write_string X_pro_spaltenbreite = 122 Y_pro_zeilenhoehe = 85 X_1_pos = 50 Y_1_pos = 60 Wait 5 Return Zielscheiben_malen: Lcd_string = Chr(1) + Chr(2) Locate_zeile = 06 Locate_spalte = 0 Gosub Touch_beruehrung_abwarten X_oben_links = X_aktuell Y_oben_links = Y_aktuell Locate_zeile = 06 Locate_spalte = 21 Gosub Touch_beruehrung_abwarten X_oben_rechts = X_aktuell Y_oben_rechts = Y_aktuell Locate_zeile = 66 Locate_spalte = 0 Gosub Touch_beruehrung_abwarten X_unten_links = X_aktuell Y_unten_links = Y_aktuell Locate_zeile = 66 Locate_spalte = 21 Gosub Touch_beruehrung_abwarten X_unten_rechts = X_aktuell Y_unten_rechts = Y_aktuell Temp_a = X_oben_links + X_unten_links Temp_a = Temp_a + 1 Temp_a = Temp_a / 2 X_1_pos = Temp_a Temp_a = Y_oben_rechts + Y_oben_links Temp_a = Temp_a + 1 Temp_a = Temp_a / 2 Y_1_pos = Temp_a Temp_a = X_oben_rechts - X_oben_links Temp_b = X_unten_rechts - X_unten_links Temp_a = Temp_a + Temp_b Temp_a = 43130 / Temp_a X_pro_spaltenbreite = Temp_a Temp_a = Y_unten_rechts - Y_oben_rechts Temp_b = Y_unten_links - X_oben_links Temp_a = Temp_a + Temp_b Temp_a = 24662 / Temp_a Y_pro_zeilenhoehe = Temp_a Return Touch_beruehrung_abwarten: Gosub Lcd_write_string 'Kreuzchen malen Do Loop Until Touch_meldet = Ja Touch_meldet = Erledigt Gosub Lcd_clear Return Tim0_isr: Set Portb.0 ' für Zeitmessung Incr Irq_teiler If Irq_teiler = 2 Then ' Vorteiler durch 2 für !6 Mhz ' ergibt Touchabfrage alle 33 msec Irq_teiler = 0 Gosub Touch_auswerten Incr Ticker If Ticker = 3 Then Ticker = 0 If Timer_a > 0 Then Decr Timer_a If Timer_b > 0 Then Decr Timer_b End If End If Reset Portb.0 ' für Zeitmessung Return ' und hier gehts in Assembler weiter .... $asm Touch_xy_berechnen: Touch_y_pos: clr Temp_2 ' Wert für 0.Spalte vorbereiten ' Loadadr Y_melden , X ' st X, Temp_1 ' = Spaltennummer clr Accu_H ' Touchwert in Accu A laden Loadadr Y_aktuell , X ld Accu_L, X clr Bccu_H ' Position des 1.Chr in Accu B laden Loadadr Y_1_pos , X ld Bccu_L, X !sub Accu_L, Bccu_L ' = negativ, dann 0. Spalte sbc Accu_H, Bccu_H brmi Touch_Y_Pos_99 mov Bccu_L, Accu_L Loadadr Y_pro_zeilenhoehe , X ld Bccu_H, X mul Bccu_L, Bccu_H lsr Accu_H lsr Accu_H lsr Accu_H ; geteilt durch 2048 inc Accu_H ; kleinster Wert = 1. Spalte Mov Temp_2 , Accu_h cpi Temp_2, 8 ' 7 ist die höchste erlaubte Zahl brlo Touch_y_pos_99 ldi Temp_2, 7 Touch_y_pos_99: Loadadr Y_melden , X st X, Temp_2 ; = Spaltennummer Touch_x_pos: clr Temp_2 ' Wert für 0.Spalte vorbereiten ' Loadadr X_melden , X ' st X, Temp_1 clr Accu_H ' Touchwert in Accu A laden Loadadr X_aktuell , X ld Accu_L, X clr Bccu_H ' Position des 1.Chr in Accu B laden Loadadr X_1_pos , X ld Bccu_L, X !sub Accu_L, Bccu_L ' = negativ, dann 0. Spalte sbc Accu_H, Bccu_H brmi Touch_X_Pos_99 mov Bccu_L, Accu_L Loadadr X_pro_spaltenbreite , X ld Bccu_H, X mul Bccu_L, Bccu_H lsr Accu_H lsr Accu_H ' geteilt durch 1024 inc Accu_H ' kleinster Wert = 1. Spalte mov Temp_2, Accu_H cpi Temp_2, 23 ' 22 ist die höchste erlaubte Zahl brlo Touch_x_pos_99 ldi Temp_2, 22 Touch_x_pos_99: Loadadr X_melden , X st X , Temp_2 ' = Spaltennummer Angetoucht: Loadadr Y_melden , X ld Temp_1, X inc Temp_1 Loadadr Lcd_format(1) , X Angetoucht_10: dec Temp_1 breq Angetoucht_20 adiw XL , 24 rjmp Angetoucht_10 Angetoucht_20: clr Accu_H add XL, Temp_2 adc XH, Accu_H ld Temp_1, X 'Spacezeichen besetigen Cpi Temp_1, &H20 brne Angetoucht_30 clr temp_1 Angetoucht_30: Cpi Temp_1, 95 ' _ ist Spacezeichen brne Angetoucht_40 ldi Temp_1, &H20 Angetoucht_40: Loadadr F_taste , X st X, Temp_1 Angetoucht_99: ret Touch_init: rcall Touch_Ruhe rcall ADC_Init ldi Temp_1, &H00 Loadadr X_vorher , X st X, Temp_1 Loadadr Y_vorher , X st X, Temp_1 Loadadr Touch_aktiviert , X st X, Temp_1 Loadadr Touch_meldet , X st X, Temp_1 ret Adc_init: ldi Temp_1, &B0110_0000 'ADC initialsieren, linksbündig, ADC1 !Out Admux , Temp_1 ldi Temp_1, &B1000_0111 'ADC einschalten, geteilt durch 128 ' !Out Adcsra , Temp_1 !Out Adcsr , Temp_1 ' noch alter Name ret Touch_ruhe: sbi Touch_DDR, out_Y_minus ; alles auf Ausgang sbi Touch_DDR, out_Y_plus sbi Touch_DDR, out_X_plus sbi Touch_DDR, out_X_minus sbi Touch_Control, Y_minus ; Touch stromlos sbi Touch_Control, Y_plus ; weil alle auf +Us SBi Touch_control ,X_minus sbi Touch_Control, X_Plus ret Touch_auswerten: Loadadr Touch_aktiviert , X ld Flag_Touch_aktiviert, X Loadadr Touch_meldet , X ld Flag_Touch_meldet, X cbi Touch_DDR, in_X_plus ;X auf Input stellen cbi Touch_DDR, in_X_minus cbi Touch_Control, Y_minus ;Y bestromen ldi Temp_1, &B01100011 ;auf Eingang X- stellen !Out Admux , Temp_1 rcall Touch_messen Loadadr Y_aktuell , X st X, Accu_H cbi Touch_DDR, in_Y_plus ;Y auf Input stellen cbi Touch_DDR, in_Y_minus cbi Touch_Control, X_minus ;X bestromen ldi Temp_1, &B01100000 ;auf Eingang Y- stellen !Out Admux , Temp_1 rcall Touch_messen Loadadr X_aktuell , X st X, Accu_H ' Touch auswerten Loadadr X_aktuell , X ld Temp_1, X cpi Temp_1, ungedrueckt brsh Touch_auswerten_90 Loadadr Y_aktuell , X ld Temp_1, X cpi Temp_1, ungedrueckt brsh Touch_auswerten_90 sbrc Flag_Touch_aktiviert, skip_Touch_aktiviert rjmp Touch_auswerten_99 Loadadr X_aktuell , X ld Temp_1, X Loadadr X_vorher , X ld Temp_2, X cp Temp_1, Temp_2 brne Touch_auswerten_80 Loadadr Y_aktuell , X ld Temp_1, X Loadadr Y_vorher , X ld Temp_2, X cp Temp_1, Temp_2 brne Touch_auswerten_80 sbr Flag_Touch_aktiviert, set_Touch_aktiviert sbr Flag_Touch_meldet, set_Touch_meldet rcall Touch_xy_berechnen rjmp Touch_auswerten_99 Touch_auswerten_80: Loadadr X_aktuell , X ld Temp_1, X Loadadr X_vorher , X st X, Temp_1 Loadadr Y_aktuell , X ld Temp_1, X Loadadr Y_vorher , X st X, Temp_1 rjmp Touch_auswerten_99 Touch_auswerten_90: cbr Flag_Touch_aktiviert, clear_Touch_aktiviert Touch_auswerten_99: Loadadr Touch_meldet , X ST X, Flag_Touch_meldet Loadadr Touch_aktiviert , X ST X, flag_Touch_aktiviert ret Touch_messen: ' sbi ADCSRA, ADSC ' Dummy-Wandlung starten sbi ADCSR, ADSC ' alte Bezeichnung in Bascom ' Dummy-Wandlung starten Touch_messen_10: ' sbic ADCSRA, ADSC sbic ADCSR, ADSC ' alte Bezeichnung in Bascom rjmp Touch_messen_10 ' Fertisch ? ' sbi ADCSRA, ADSC ' Wandlung starten sbi ADCSR, ADSC ' alte Bezeichnung für Bascom Touch_messen_20: ' SBic Adcsra , Adsc sbic ADCSR, ADSC ' alte Bezeichnung für Bascom rjmp Touch_messen_20 ' Fertisch ? clr Accu_L in Accu_H, ADCH rcall Touch_Ruhe Touch_messen_99: ret Lcd_write_string: Loadadr Locate_zeile , X ' Zeilen 0 bis 70 möglich ld Accu_L, X ldi Temp_2, 24 mov Spalte, Temp_2 mov Accu_H, Temp_2 ' so rechnet der Controller mul Accu_L, Accu_H Loadadr Locate_spalte , X ' Spalte 0 bis 22 möglich ld cursor_L, X clr Cursor_H ' Position = Zeile*24 + Spalte add Cursor_L, Accu_L ADC Cursor_H, Accu_H Loadadr Lcd_string , X Lcd_write_string_10: ld Zeichen, X+ 'Zeichen laden und nächste Bufferadresse ldi Temp_3, &B0111_1111 !and Zeichen, Temp_3 'String zu Ende ? breq LCD_Write_String_99 ldi Temp_3, 8 'Offset in TabChr berechnen mov Accu_L, Temp_3 clr Accu_H mul Accu_L, Zeichen '..Offset + Anfangsadresse von TabChr ldi ZL, low(TabChr *2) ldi ZH, high(TabChr *2) add ZL, Accu_L adc ZH, Accu_H rcall LCD_Write_Chr Loadadr Locate_spalte , Z ' auf die nächste Spalte ld Temp_2, Z inc Temp_2 st Z, Temp_2 'Malprogramm aufrufen rjmp LCD_Write_String_10 Lcd_write_string_99: ret Lcd_write_chr: mov Accu_L, Cursor_L mov Accu_H, Cursor_H adiw Cursor_L, 1 clr Zeile ldi Temp_1, 24 mov Spalte, Temp_1 ldi Temp_1, 8 Lcd_write_chr_10: ldi Befehl, &H0A mov Daten, Accu_L rcall Write_2_Byte ldi Befehl, &HB0B mov Daten, Accu_H rcall Write_2_Byte lpm Temp_3, Z+ ldi Temp_2, 10 Lcd_write_chr_20: rol Temp_3 'Zeichen wenden und D0-bündig ror Daten dec Temp_2 brne LCD_Write_Chr_20 brcc LCD_Write_Chr_30 ' Lücken schliessen ori Daten, &b01000000 Lcd_write_chr_30: ldi Befehl, &H0C rcall Write_2_Byte add Accu_L, Spalte adc Accu_H, Zeile dec Temp_1 brne LCD_Write_Chr_10 Lcd_write_chr_99: ret Lcd_form_clear: ldi Temp_1, 192 clr Temp_2 Loadadr Lcd_format(1) , X Lcd_form_clear_10: st X+ , Temp_2 dec Temp_1 Brne Lcd_form_clear_10 Lcd_form_clear_99: ret Lcd_form_aufbau: ldi Temp_1, 192 Loadadr Lcd_format(1) , X Lcd_form_aufbau_10: ld Temp_2, X+ Cpi Temp_2 , &H28 'Klammer auf brne Lcd_form_aufbau_30 ld Temp_2, X ori Temp_2, &H80 st -X, Temp_2 st X+, Temp_2 st X+, Temp_2 Lcd_form_aufbau_20: dec Temp_1 ' Notbremse Breq Lcd_form_aufbau_99 ld Temp_3, X 'Fertig übersetzt? st X+, Temp_2 cpi Temp_3, &H29 brne lcd_form_aufbau_20 Lcd_form_aufbau_30: dec Temp_1 Brne Lcd_form_aufbau_10 Lcd_form_aufbau_99: ret Lcd_clear: ldi Befehl, &H0A ldi Daten, 0 rcall Write_2_Byte ldi Befehl, &H0B ldi Daten, 0 rcall Write_2_Byte ldi Befehl, &H0C ldi Daten, &H00 ldi Temp_2, 10 Lcd_clear_10: ldi Temp_1, 200 Lcd_clear_20: rcall Write_2_Byte dec Temp_1 brne LCD_Clear_20 dec Temp_2 brne LCD_Clear_10 Lcd_clear_99: ret Lcd_initialisieren: ldi ZL, low(Init_gc_mode *2) ldi ZH, high(Init_gc_mode *2) lpm Temp_1, Z+ ' Schleifenzähler lpm Temp_1, Z+ ' Schleifenzähler Lcd_initialisieren_10: lpm Befehl,Z+ lpm Daten,Z+ rcall Write_2_Byte dec Temp_1 brne LCD_Initialisieren_10 Lcd_initialisieren_99: ret Write_2_byte: push Temp_1 cbi Control_Bus, CS 'Chip select aktivieren rjmp Write_2_Byte_20 Write_2_byte_10: cbi Control_Bus, E 'Enable-Puls beenden nop 'warten nop 'warten nop nop 'warten Write_2_byte_20: sbi Control_Bus, E 'Enable-Puls beginnt nop 'warten nop 'warten nop 'warten 'warten sbic Daten_Bus_in, Bussy 'Fertisch ? rjmp Write_2_Byte_10 nop cbi Control_Bus, E 'Enable-Puls beenden cbi Control_Bus, RW 'Write Signal aktivieren nop 'Register im Grafikcontroller auswählen ldi Temp_1,auf_Output_stellen 'Datenbus auf Ausgabe stellen !out Daten_ddr, Temp_1 '..und umschalten nop !out Daten_Bus_out, Befehl 'Befehl-Register auswählen sbi Control_Bus, E 'ins Befehl-Register schreiben nop 'warten nop nop nop nop nop 'warten cbi Control_Bus, E 'Enable-Puls beenden nop 'Mode-Temp_1 in Grafikcontroller schreiben cbi Control_Bus,RS !out Daten_Bus_out, Daten 'Mode-Temp_1 aufv Bus legen sbi Control_Bus, E 'ins Mode-Register schreiben nop 'warten nop nop nop nop 'warten nop '... und warten cbi Control_Bus, E 'Enable-Puls beenden nop 'Ruhepegel wieder herstellen sbi Control_Bus, CS 'Chip select deaktivieren ldi Temp_1,auf_Input_stellen 'Datenbus auf Input stellen !Out Daten_ddr , Temp_1 '..und umschalten sbi Control_Bus, RW 'Read Signal deaktivieren sbi Control_Bus, RS Write_2_byte_99: pop Temp_1 ret $end Asm End Init_gc_mode: Data &H00 , &H07 'Die nächsten 7 Data &H00 , &H12 'Befehle an GC senden Data &H01 , &H76 Data &H02 , &H17 Data &H03 , &H4F Data &H08 , &H00 Data &H09 , &H00 Data &H00 , &H32 Tabchr: Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H00 Data &H00 , &H00 , &H00 , &H47 , &H00 , &H00 , &H00 , &H00 ' &H01 Data &H20 , &H20 , &H20 , &H1E , &H20 , &H20 , &H20 , &H00 ' &H02 Data &H00 , &H0A , &H1F , &H1F , &H1F , &H0E , &H04 , &H00 ' &H03 Data &H00 , &H04 , &H0E , &H1F , &H1F , &H0E , &H04 , &H00 ' &H04 Data &H04 , &H0E , &H0E , &H04 , &H1F , &H1F , &H04 , &H00 ' &H05 Data &H00 , &H04 , &H0E , &H1F , &H1F , &H04 , &H0E , &H00 ' &H06 Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H07 Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H08 Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H09 Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H0A Data &H00 , &H07 , &H03 , &H0D , &H12 , &H12 , &H0C , &H00 ' &H0B Data &H0E , &H11 , &H11 , &H0E , &H04 , &H0E , &H04 , &H00 ' &H0C Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H0D Data &H03 , &H0D , &H0B , &H0D , &H0B , &H1B , &H18 , &H00 ' &H0E Data &H00 , &H15 , &H0E , &H1B , &H0E , &H15 , &H00 , &H00 ' &H0F Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H7F ' &H10 Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H7F , &H7F ' &H11 Data &H00 , &H00 , &H00 , &H00 , &H00 , &H7F , &H7F , &H7F ' &H12 Data &H00 , &H00 , &H00 , &H00 , &H7F , &H7F , &H7F , &H7F ' &H13 Data &H00 , &H00 , &H00 , &H7F , &H7F , &H7F , &H7F , &H7F ' &H14 Data &H00 , &H00 , &H7F , &H7F , &H7F , &H7F , &H7F , &H7F ' &H15 Data &H00 , &H7F , &H7F , &H7F , &H7F , &H7F , &H7F , &H7F ' &H16 Data &H7F , &H7F , &H7F , &H7F , &H7F , &H7F , &H7F , &H7F ' &H17 Data &H04 , &H0E , &H1F , &H04 , &H04 , &H04 , &H04 , &H77 ' &H18 Data &H04 , &H04 , &H04 , &H04 , &H1F , &H0E , &H04 , &H7D ' &H19 Data &H00 , &H04 , &H06 , &H1F , &H06 , &H04 , &H00 , &H77 ' &H1A Data &H00 , &H04 , &H0C , &H1F , &H0C , &H04 , &H00 , &H7D ' &H1B Data &H00 , &H00 , &H00 , &H10 , &H10 , &H10 , &H1F , &H77 ' &H1C Data &H00 , &H0A , &H0A , &H1F , &H0A , &H0A , &H00 , &H7D ' &H1D Data &H04 , &H04 , &H0E , &H0E , &H1F , &H1F , &H00 , &H77 ' &H1E Data &H1F , &H1F , &H0E , &H0E , &H04 , &H04 , &H00 , &H7D ' &H1F Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H20 Data &H04 , &H0E , &H0E , &H04 , &H04 , &H00 , &H04 , &H00 ' &H21 Data &H1B , &H1B , &H12 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H22 Data &H00 , &H0A , &H1F , &H0A , &H0A , &H1F , &H0A , &H00 ' &H23 Data &H08 , &H0E , &H10 , &H0C , &H02 , &H1C , &H04 , &H00 ' &H24 Data &H19 , &H19 , &H02 , &H04 , &H08 , &H13 , &H13 , &H00 ' &H25 Data &H08 , &H14 , &H14 , &H08 , &H15 , &H12 , &H0D , &H00 ' &H26 Data &H0C , &H0C , &H08 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H27 Data &H04 , &H08 , &H08 , &H08 , &H08 , &H08 , &H04 , &H00 ' &H28 Data &H08 , &H04 , &H04 , &H04 , &H04 , &H04 , &H08 , &H00 ' &H29 Data &H00 , &H0A , &H0E , &H1F , &H0E , &H0A , &H00 , &H00 ' &H2A Data &H00 , &H04 , &H04 , &H1F , &H04 , &H04 , &H00 , &H00 ' &H2B Data &H00 , &H00 , &H00 , &H00 , &H00 , &H0C , &H0C , &H08 ' &H2C Data &H00 , &H00 , &H00 , &H1F , &H00 , &H00 , &H00 , &H00 ' &H2D Data &H00 , &H00 , &H00 , &H00 , &H00 , &H0C , &H0C , &H00 ' &H2E Data &H00 , &H01 , &H02 , &H04 , &H08 , &H10 , &H00 , &H00 ' &H2F Data &H0E , &H11 , &H13 , &H15 , &H19 , &H11 , &H0E , &H00 ' &H30 Data &H04 , &H0C , &H04 , &H04 , &H04 , &H04 , &H0E , &H00 ' &H31 Data &H0E , &H11 , &H01 , &H06 , &H08 , &H10 , &H1F , &H00 ' &H32 Data &H0E , &H11 , &H01 , &H0E , &H01 , &H11 , &H0E , &H00 ' &H33 Data &H02 , &H06 , &H0A , &H12 , &H1F , &H02 , &H02 , &H00 ' &H34 Data &H1F , &H10 , &H10 , &H1E , &H01 , &H11 , &H0E , &H00 ' &H35 Data &H06 , &H08 , &H10 , &H1E , &H11 , &H11 , &H0E , &H00 ' &H36 Data &H1F , &H01 , &H02 , &H04 , &H08 , &H08 , &H08 , &H00 ' &H37 Data &H0E , &H11 , &H11 , &H0E , &H11 , &H11 , &H0E , &H00 ' &H38 Data &H0E , &H11 , &H11 , &H0F , &H01 , &H02 , &H0C , &H00 ' &H39 Data &H00 , &H00 , &H0C , &H0C , &H00 , &H0C , &H0C , &H00 ' &H3A Data &H00 , &H00 , &H0C , &H0C , &H00 , &H0C , &H0C , &H08 ' &H3B Data &H02 , &H04 , &H08 , &H10 , &H08 , &H04 , &H02 , &H00 ' &H3C Data &H00 , &H00 , &H1F , &H00 , &H00 , &H1F , &H00 , &H00 ' &H3D Data &H08 , &H04 , &H02 , &H01 , &H02 , &H04 , &H08 , &H00 ' &H3E Data &H0E , &H11 , &H01 , &H06 , &H04 , &H00 , &H04 , &H00 ' &H3F Data &H0E , &H11 , &H17 , &H15 , &H17 , &H10 , &H0E , &H00 ' &H40 Data &H0E , &H11 , &H11 , &H11 , &H1F , &H11 , &H11 , &H00 ' &H41 Data &H1E , &H11 , &H11 , &H1E , &H11 , &H11 , &H1E , &H00 ' &H42 Data &H0E , &H11 , &H10 , &H10 , &H10 , &H11 , &H0E , &H00 ' &H43 Data &H1E , &H11 , &H11 , &H11 , &H11 , &H11 , &H1E , &H00 ' &H44 Data &H1F , &H10 , &H10 , &H1E , &H10 , &H10 , &H1F , &H00 ' &H45 Data &H1F , &H10 , &H10 , &H1E , &H10 , &H10 , &H10 , &H00 ' &H46 Data &H0E , &H11 , &H10 , &H17 , &H11 , &H11 , &H0F , &H00 ' &H47 Data &H11 , &H11 , &H11 , &H1F , &H11 , &H11 , &H11 , &H00 ' &H48 Data &H0E , &H04 , &H04 , &H04 , &H04 , &H04 , &H0E , &H00 ' &H49 Data &H01 , &H01 , &H01 , &H01 , &H11 , &H11 , &H0E , &H00 ' &H4A Data &H11 , &H12 , &H14 , &H18 , &H14 , &H12 , &H11 , &H00 ' &H4B Data &H10 , &H10 , &H10 , &H10 , &H10 , &H10 , &H1F , &H00 ' &H4C Data &H11 , &H1B , &H15 , &H11 , &H11 , &H11 , &H11 , &H00 ' &H4D Data &H11 , &H19 , &H15 , &H13 , &H11 , &H11 , &H11 , &H00 ' &H4E Data &H0E , &H11 , &H11 , &H11 , &H11 , &H11 , &H0E , &H00 ' &H4F Data &H1E , &H11 , &H11 , &H1E , &H10 , &H10 , &H10 , &H00 ' &H50 Data &H0E , &H11 , &H11 , &H11 , &H15 , &H12 , &H0D , &H00 ' &H51 Data &H1E , &H11 , &H11 , &H1E , &H12 , &H11 , &H11 , &H00 ' &H52 Data &H0E , &H11 , &H10 , &H0E , &H01 , &H11 , &H0E , &H00 ' &H53 Data &H1F , &H04 , &H04 , &H04 , &H04 , &H04 , &H04 , &H00 ' &H54 Data &H11 , &H11 , &H11 , &H11 , &H11 , &H11 , &H0E , &H00 ' &H55 Data &H11 , &H11 , &H11 , &H11 , &H11 , &H0A , &H04 , &H00 ' &H56 Data &H11 , &H11 , &H15 , &H15 , &H15 , &H15 , &H0A , &H00 ' &H57 Data &H11 , &H11 , &H0A , &H04 , &H0A , &H11 , &H11 , &H00 ' &H58 Data &H11 , &H11 , &H11 , &H0A , &H04 , &H04 , &H04 , &H00 ' &H59 Data &H1E , &H02 , &H04 , &H08 , &H10 , &H10 , &H1E , &H00 ' &H5A Data &H11 , &H04 , &H0A , &H11 , &H1F , &H11 , &H11 , &H00 ' &H5B Data &H11 , &H00 , &H0E , &H11 , &H11 , &H11 , &H0E , &H00 ' &H5C Data &H11 , &H00 , &H11 , &H11 , &H11 , &H11 , &H0F , &H00 ' &H5D Data &H04 , &H0A , &H11 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H5E Data &H00 , &H00 , &H00 , &H00 , &H60 , &H60 , &H7F , &H00 ' &H5F Data &H0C , &H0C , &H04 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H60 Data &H00 , &H00 , &H0E , &H01 , &H0F , &H11 , &H0F , &H00 ' &H61 Data &H10 , &H10 , &H1E , &H11 , &H11 , &H11 , &H1E , &H00 ' &H62 Data &H00 , &H00 , &H0E , &H11 , &H10 , &H11 , &H0E , &H00 ' &H63 Data &H01 , &H01 , &H0F , &H11 , &H11 , &H11 , &H0F , &H00 ' &H64 Data &H00 , &H00 , &H0E , &H11 , &H1E , &H10 , &H0E , &H00 ' &H65 Data &H06 , &H08 , &H08 , &H1E , &H08 , &H08 , &H08 , &H00 ' &H66 Data &H00 , &H00 , &H0F , &H11 , &H11 , &H0F , &H01 , &H0E ' &H67 Data &H10 , &H10 , &H1C , &H12 , &H12 , &H12 , &H12 , &H00 ' &H68 Data &H04 , &H00 , &H04 , &H04 , &H04 , &H04 , &H06 , &H00 ' &H69 Data &H02 , &H00 , &H06 , &H02 , &H02 , &H02 , &H12 , &H0C ' &H6A Data &H10 , &H10 , &H12 , &H14 , &H18 , &H14 , &H12 , &H00 ' &H6B Data &H04 , &H04 , &H04 , &H04 , &H04 , &H04 , &H06 , &H00 ' &H6C Data &H00 , &H00 , &H1A , &H15 , &H15 , &H11 , &H11 , &H00 ' &H6D Data &H00 , &H00 , &H1C , &H12 , &H12 , &H12 , &H12 , &H00 ' &H6E Data &H00 , &H00 , &H0E , &H11 , &H11 , &H11 , &H0E , &H00 ' &H6F Data &H00 , &H00 , &H1E , &H11 , &H11 , &H11 , &H1E , &H10 ' &H70 Data &H00 , &H00 , &H0F , &H11 , &H11 , &H11 , &H0F , &H01 ' &H71 Data &H00 , &H00 , &H16 , &H09 , &H08 , &H08 , &H1C , &H00 ' &H72 Data &H00 , &H00 , &H0E , &H10 , &H0E , &H01 , &H0E , &H00 ' &H73 Data &H00 , &H08 , &H1E , &H08 , &H08 , &H0A , &H04 , &H00 ' &H74 Data &H00 , &H00 , &H12 , &H12 , &H12 , &H16 , &H0A , &H00 ' &H75 Data &H00 , &H00 , &H11 , &H11 , &H11 , &H0A , &H04 , &H00 ' &H76 Data &H00 , &H00 , &H11 , &H11 , &H15 , &H1F , &H0A , &H00 ' &H77 Data &H00 , &H00 , &H12 , &H12 , &H0C , &H12 , &H12 , &H00 ' &H78 Data &H00 , &H00 , &H12 , &H12 , &H12 , &H0E , &H04 , &H18 ' &H79 Data &H00 , &H00 , &H1E , &H02 , &H0C , &H10 , &H1E , &H00 ' &H7A Data &H0A , &H00 , &H0E , &H01 , &H0F , &H11 , &H0F , &H00 ' &H7B Data &H0A , &H00 , &H00 , &H0E , &H11 , &H11 , &H0E , &H00 ' &H7C Data &H0A , &H00 , &H00 , &H11 , &H11 , &H11 , &H0E , &H00 ' &H7D Data &H0C , &H12 , &H14 , &H12 , &H11 , &H1E , &H10 , &H00 ' &H7E Data &H04 , &H0E , &H1B , &H11 , &H11 , &H1F , &H00 , &H00 ' &H7F