$asm Display_ports_initialisieren: cbi control_bus_rs_ddr,RS ' Auf Eingang stellen cbi Control_bus_rw_ddr,RW cbi Control_bus_e_ddr,E cbi Control_bus_cs_ddr,CS cbi Control_bus_r_ddr,R sbi control_bus_rs,RS ' Pullups einschalten sbi Control_bus_rw,RW sbi Control_bus_e,E sbi Control_bus_cs,CS sbi Control_bus_r,R sbi control_bus_rs_ddr,RS ' Auf Ausgang stellen sbi Control_bus_rw_ddr,RW sbi Control_bus_e_ddr,E sbi Control_bus_cs_ddr,CS sbi Control_bus_r_ddr,R cbi Control_bus_e,E ' Enable, 0 = passiv sbi Control_bus_cs,CS ' CS, 1 = passiv sbi Control_bus_r,R ' Reset = passiv ret Reset_an_display_senden: cbi Control_bus_r,R ' Reset = aktiv ldi Temp_1, 255 Reset_an_display_senden_10: ' etwas abwarten dec Temp_1 Brne Reset_an_display_senden_10 sbi Control_bus_r,R ' Reset = passiv Reset_an_display_senden_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 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_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 Write_2_byte: push Temp_1 cbi Control_Bus_cs,CS 'Chip select aktivieren rjmp Write_2_Byte_20 Write_2_byte_10: cbi Control_Bus_e,E 'Enable-Puls beenden nop 'warten nop 'warten nop nop ' ---------- nop 'warten für 16 Mhz nop ' E passiv = 600ns nop Nop nop ' ----------- Write_2_byte_20: sbi Control_Bus_e,E 'Enable-Puls beginnt nop 'warten nop 'warten nop 'warten ' ---------- nop 'warten für 16 Mhz nop ' E aktiv = 600ns nop ' ----------- sbic Daten_Bus_in, Bussy 'Fertisch ? rjmp Write_2_Byte_10 nop cbi Control_Bus_e,E 'Enable-Puls beenden cbi Control_Bus_rw,RW 'Write Signal aktivieren nop ' ---------- nop 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 nop sbi Control_Bus_e,E 'ins Befehl-Register schreiben nop 'warten nop nop nop nop nop 'warten ' ---------- nop 'warten für 16 Mhz nop nop ' ----------- cbi Control_Bus_e,E 'Enable-Puls beenden ' ---------- nop 'warten für 16 Mhz nop ' E aktiv = 600ns nop nop nop ' ----------- 'Mode-Temp_1 in Grafikcontroller schreiben cbi Control_Bus_rs,RS !out Daten_Bus_out, Daten 'Mode-Temp_1 aufv Bus legen nop sbi Control_Bus_e,E 'ins Mode-Register schreiben nop nop nop 'warten nop nop ' ---------- 'warten nop nop nop 'warten für 16 Mhz nop ' ----------- '... und warten cbi Control_Bus_e,E 'Enable-Puls beenden nop 'Ruhepegel wieder herstellen sbi Control_Bus_cs,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,RW 'Read Signal deaktivieren sbi Control_Bus_rs,RS Write_2_byte_99: pop Temp_1 ret $end Asm