$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_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 $end Asm