.NOLIST .INCLUDE .LIST .CSEG RESET: ldi r24,high(RAMEND) ;setze Stack Pointer out SPH,r24 ldi r24,low(RAMEND) out SPL,r24 ;****************************************************** ; KONSTANTEN .equ lcd_function_set = 0x38 ;vier zeilen, 8bit datenbus .equ lcd_init_cursor = 0x0F ;display ein cursor an, blinkt .equ lcd_entry_mode = 0x06 ;adresse autoincrement, cursor schieben .equ lcd_clear = 0x01 ;display loeschen .equ lcd_cursor_home = 0x02 ;cursor auf position 1 setzen ;steuerbus: .equ lcd_enable = 0 ;pinnummer am port des uP .equ lcd_rw = 1 ;pinnummer am port des uP .equ lcd_rs = 2 ;pinnummer am port des uP ;datenbus: .equ lcd_busy_flag = 7 ;pinnummer am port des uP .equ datenbus = PORTA .equ daten_ddr = DDRA .equ steuerbus = PORTC .equ steuer_ddr = DDRC .def lcd_data = r16 ;in diesem register stehen die daten die ;an das display gesendet werden sollen .def temp_0 = r17 .def temp_1 = r18 .def temp_2 = r19 .def temp_3 = r20 ; ENDE KONSTANTEN ;****************************************************** ;****************************************************** ; MAIN ; ausgabeports initialisieren ldi temp_0, 0xFF out daten_ddr,temp_0 ;datenbus out steuer_ddr,temp_0 ;steuerbus ldi temp_0, 0x00 out datenbus, temp_0 out steuerbus, temp_0 ;Display initialisieren rcall initLCD ;Daten können jetzt vom Display dargestellt werden ldi lcd_data, 0x66 rcall checkBusyFlag rcall writeData jmp Ende ; ENDE MAIN ;****************************************************** ;****************************************************** ; METHODEN initLCD: ;kurze verzoegerung nach einschalten des uP bis zum initialisieren ldi temp_3,10 iL_0_: rcall wait5Ms dec temp_3 brne iL_0_ ;dislpay reset ldi lcd_data, 0x30 rcall writeCommand rcall wait5Ms rcall wait5Ms rcall writeCommand nop nop nop rcall writeCommand ;function set ldi lcd_data, lcd_function_set rcall checkBusyFlag rcall writeCommand ;dislpay on ldi lcd_data, lcd_init_cursor rcall checkBusyFlag rcall writeCommand ;clear display ldi lcd_data, lcd_clear rcall checkBusyFlag rcall writeCommand ;entry mode ldi lcd_data, lcd_entry_mode rcall checkBusyFlag rcall writeCommand ;anfangsadresse im textspeicher setzen ldi lcd_data, 0x80 rcall checkBusyFlag rcall writeCommand ret ;------------------------------------------------------ writeCommand: sbi steuerbus, lcd_enable ;lcd_enable auf H schalten out datenbus, lcd_data nop nop nop cbi steuerbus, lcd_enable ;lcd_enable auf L schalten ret ;------------------------------------------------------ writeData: sbi steuerbus, lcd_rs ;lcd_rs auf H setzen nop nop nop sbi steuerbus, lcd_enable ;lcd_enable auf H schalten out datenbus, lcd_data nop nop nop cbi steuerbus, lcd_enable ;lcd_enable auf L schalten cbi steuerbus, lcd_rs ;lcd_rs auf L setzen ret ;------------------------------------------------------ wait5Ms: ;fuer 8MHz ldi temp_1,66 w5M_1_: ldi temp_0,200 w5M_0_: dec temp_0 brne w5M_0_ ;dekrementiere die 200 auf 0 dec temp_1 brne w5M_1_ ;dekrementiere die 66 auf 0 ret ;------------------------------------------------------ checkBusyFlag: ldi temp_0, 0x00 ;datenbus wird eingang out daten_ddr,temp_0 ; - || - sbi steuerbus, lcd_rw ;RW ist H cBF_0_: ;sbi steuerbus, lcd_enable nop ;cbi steuerbus, lcd_enable nop sbic datenbus, lcd_busy_flag jmp cBF_0_ ;wenn busyflag H wiederhole cbi steuerbus, lcd_rw ;RW ist L ldi temp_0, 0xFF ;datenbus wird ausgang out daten_ddr,temp_0 ; - || - ret ; ENDE METHODEN ;****************************************************** Ende: rjmp Ende