Witam
Mecze sie z inicjalizacja lcd juz troche czasu i za nic nie moge dojsc co jest nie tak w tym programie, na symulacji wszstko dziala jak powinno ale wyswietlacz nie jest zainicjalizowany po wrzuceniu programu. Moglbys ktos spojrzec i ewentualnie znalezc blad.
Z gory dziekuje
.include "m16def.inc"
.EQU SYS_FREQ = 1 ; czŕstotliwoťŠ pracy w MHz
.equ rs = 0
.equ rw = 1
.equ en = 2
.equ d4 = 4
.equ d5 = 5
.equ d6 = 6
.equ d7 = 7
.equ k_lcd = ddra
.equ wy_lcd = porta
.equ znak_konca = 255
.cseg
.org 0
jmp reset
powitanie: .db "Inicjalizacja", znak_konca
Reset:
ldi r17, high(ramend)
ldi r16, low(ramend)
out sph, r17
out spl, r16
sbi ddra, rs
sbi ddra, en
sbi ddra, d4
sbi ddra, d5
sbi ddra, d6
sbi ddra, d7
cbi porta, rs
cbi porta, en
ldi r24, 45 ;czekaj 45ms
ldi r25, 1
rcall czekaj_ms
sbi porta, en ;wyslanie 3 do wyswietlacza
sbi porta, d4
sbi porta, d5
cbi porta, d6
cbi porta, d7
nop
nop
cbi porta, en
ldi r24, 5 ;czekaj 5ms
ldi r25, 1
rcall czekaj_ms
sbi porta, en ;wyslanie 3 do wyswietlacza
nop
nop
cbi porta, en
ldi r24, 5 ;czekja 5ms
ldi r25, 1
rcall czekaj_ms
sbi porta, en ;wyslanie 3 do wyswietlacza
nop
nop
cbi porta, en
ldi r24, 5
ldi r25, 1
rcall czekaj_ms
sbi porta, en
cbi porta, d4 ;wyslanie 2 do wyswietlacza
ldi r24, 1
rcall czekaj_us
cbi porta, en
ldi r16, 0b00101000 ;interfejs 4 bitowy 2 linie znak 5x7
rcall instrukcja_lcd
ldi r16, 0b00001000 ;wylacz lcd, wlacz kursor, wylacz mruganie
rcall instrukcja_lcd
ldi r16, 0b00000001 ;czysc lcd
rcall instrukcja_lcd
ldi R24, 180
rcall Czekaj_us ; opoznienie o 1,8 ms
ldi r16, 0b00000110 ;bez przesuwania w prawo
rcall instrukcja_lcd
ldi r16, 0b00001111 ;wlacz lcd, kursor, mruganie
rcall instrukcja_lcd
rcall czysc_lcd
ldi ZH, high(Powitanie<<1)
ldi ZL, low(Powitanie<<1)
rcall Pokaz_ciag_LCD ; wyťwietlenie powitania
koniec:rcall koniec
;***************************************************************
; PROCEDURA CZYSZCZąCA WYîWIETLACZ LCD
;
Czysc_LCD:
push R16
ldi R16, (1<<0)
rcall Instrukcja_LCD ; czyszczenie wyťwietlacza i
; powrˇt kursora do pozycji
; pocz¦tkowej
ldi R24, 180
rcall Czekaj_us ; opˇčnienie o 1,8 ms
pop R16
ret
Instrukcja_LCD:
cbi porta, RS ; przesy-ane wartoťci bŕd¦ instrukcjami
rcall Zapisz_LCD ; przeťlij instrukcjŕ zawart¦ w R16
sbi porta, RS ; przesy-ane wartoťci bŕd¦ danymi
ret
;***************************************************************
; PROCEDURA PRZESYLAJąCA BAJT
;
; Parametry:
; R16 - dane do wys-ania (np. kod wyťwietlanego znaku)
;
Zapisz_LCD:
sbi porta, EN ; linia EN w stanie wysokim
cbi porta, D4
cbi porta, D5
cbi porta, D6
cbi porta, D7 ; linie DB7..4 w stanie niskim
sbrc R16, 7
sbi porta, D7
sbrc R16, 6
sbi porta, D6
sbrc R16, 5
sbi porta, D5
sbrc R16, 4
sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
nop
// sbi porta, en ; ktˇrym odpowiadaj¦ wysokie wartoťci
nop ; bitˇw 7..4 z rejestru R16
cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
; (przes-anie starszego pˇ-bajtu)
nop
nop ; opˇčnienie o dwa takty zegarowe
ldi r24,5
rcall czekaj_us
sbi porta, EN
cbi porta, D4
cbi porta, D5
cbi porta, D6
cbi porta, D7
sbrc R16, 3
sbi porta, D7
sbrc R16, 2
sbi porta, D6
sbrc R16, 1
sbi porta, D5
sbrc R16, 0
sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
nop ; ktˇrym odpowiadaj¦ wysokie wartoťci
//sbi porta, en
nop ; bitˇw 3..0 z rejestru R16
cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
; (przes-anie m-odszego pˇ-bajtu)
ldi R24, 5
rcall Czekaj_us ; opˇčnienie o 50 us
ret
Pokaz_ciag_LCD:
push R16
push R17
Pok_c_LCD_1: ; pŕtla wyťwietlaj¦ca kolejne znaki -a˝cucha
lpm R16, Z+ ; odczytaj znak z pamiŕci programu, spod adresu
; wskazywanego przez rejestr indeksowy Z
cpi R16, ZNAK_KONCA
breq Pok_c_LCD_2 ; jeťli znak jest znakiem ko˝ca, to zako˝cz,
rcall Zapisz_LCD ; w przeciwnym razie wyťwietl go na LCD
rjmp Pok_c_LCD_1 ; i przejdč do odczytywania kolejnego znaku
Pok_c_LCD_2:
pop R17
pop R16
ret
.include "czekaj_ms.inc"
.include "czekaj_us.inc"
Mecze sie z inicjalizacja lcd juz troche czasu i za nic nie moge dojsc co jest nie tak w tym programie, na symulacji wszstko dziala jak powinno ale wyswietlacz nie jest zainicjalizowany po wrzuceniu programu. Moglbys ktos spojrzec i ewentualnie znalezc blad.
Z gory dziekuje
.include "m16def.inc"
.EQU SYS_FREQ = 1 ; czŕstotliwoťŠ pracy w MHz
.equ rs = 0
.equ rw = 1
.equ en = 2
.equ d4 = 4
.equ d5 = 5
.equ d6 = 6
.equ d7 = 7
.equ k_lcd = ddra
.equ wy_lcd = porta
.equ znak_konca = 255
.cseg
.org 0
jmp reset
powitanie: .db "Inicjalizacja", znak_konca
Reset:
ldi r17, high(ramend)
ldi r16, low(ramend)
out sph, r17
out spl, r16
sbi ddra, rs
sbi ddra, en
sbi ddra, d4
sbi ddra, d5
sbi ddra, d6
sbi ddra, d7
cbi porta, rs
cbi porta, en
ldi r24, 45 ;czekaj 45ms
ldi r25, 1
rcall czekaj_ms
sbi porta, en ;wyslanie 3 do wyswietlacza
sbi porta, d4
sbi porta, d5
cbi porta, d6
cbi porta, d7
nop
nop
cbi porta, en
ldi r24, 5 ;czekaj 5ms
ldi r25, 1
rcall czekaj_ms
sbi porta, en ;wyslanie 3 do wyswietlacza
nop
nop
cbi porta, en
ldi r24, 5 ;czekja 5ms
ldi r25, 1
rcall czekaj_ms
sbi porta, en ;wyslanie 3 do wyswietlacza
nop
nop
cbi porta, en
ldi r24, 5
ldi r25, 1
rcall czekaj_ms
sbi porta, en
cbi porta, d4 ;wyslanie 2 do wyswietlacza
ldi r24, 1
rcall czekaj_us
cbi porta, en
ldi r16, 0b00101000 ;interfejs 4 bitowy 2 linie znak 5x7
rcall instrukcja_lcd
ldi r16, 0b00001000 ;wylacz lcd, wlacz kursor, wylacz mruganie
rcall instrukcja_lcd
ldi r16, 0b00000001 ;czysc lcd
rcall instrukcja_lcd
ldi R24, 180
rcall Czekaj_us ; opoznienie o 1,8 ms
ldi r16, 0b00000110 ;bez przesuwania w prawo
rcall instrukcja_lcd
ldi r16, 0b00001111 ;wlacz lcd, kursor, mruganie
rcall instrukcja_lcd
rcall czysc_lcd
ldi ZH, high(Powitanie<<1)
ldi ZL, low(Powitanie<<1)
rcall Pokaz_ciag_LCD ; wyťwietlenie powitania
koniec:rcall koniec
;***************************************************************
; PROCEDURA CZYSZCZąCA WYîWIETLACZ LCD
;
Czysc_LCD:
push R16
ldi R16, (1<<0)
rcall Instrukcja_LCD ; czyszczenie wyťwietlacza i
; powrˇt kursora do pozycji
; pocz¦tkowej
ldi R24, 180
rcall Czekaj_us ; opˇčnienie o 1,8 ms
pop R16
ret
Instrukcja_LCD:
cbi porta, RS ; przesy-ane wartoťci bŕd¦ instrukcjami
rcall Zapisz_LCD ; przeťlij instrukcjŕ zawart¦ w R16
sbi porta, RS ; przesy-ane wartoťci bŕd¦ danymi
ret
;***************************************************************
; PROCEDURA PRZESYLAJąCA BAJT
;
; Parametry:
; R16 - dane do wys-ania (np. kod wyťwietlanego znaku)
;
Zapisz_LCD:
sbi porta, EN ; linia EN w stanie wysokim
cbi porta, D4
cbi porta, D5
cbi porta, D6
cbi porta, D7 ; linie DB7..4 w stanie niskim
sbrc R16, 7
sbi porta, D7
sbrc R16, 6
sbi porta, D6
sbrc R16, 5
sbi porta, D5
sbrc R16, 4
sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
nop
// sbi porta, en ; ktˇrym odpowiadaj¦ wysokie wartoťci
nop ; bitˇw 7..4 z rejestru R16
cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
; (przes-anie starszego pˇ-bajtu)
nop
nop ; opˇčnienie o dwa takty zegarowe
ldi r24,5
rcall czekaj_us
sbi porta, EN
cbi porta, D4
cbi porta, D5
cbi porta, D6
cbi porta, D7
sbrc R16, 3
sbi porta, D7
sbrc R16, 2
sbi porta, D6
sbrc R16, 1
sbi porta, D5
sbrc R16, 0
sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
nop ; ktˇrym odpowiadaj¦ wysokie wartoťci
//sbi porta, en
nop ; bitˇw 3..0 z rejestru R16
cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
; (przes-anie m-odszego pˇ-bajtu)
ldi R24, 5
rcall Czekaj_us ; opˇčnienie o 50 us
ret
Pokaz_ciag_LCD:
push R16
push R17
Pok_c_LCD_1: ; pŕtla wyťwietlaj¦ca kolejne znaki -a˝cucha
lpm R16, Z+ ; odczytaj znak z pamiŕci programu, spod adresu
; wskazywanego przez rejestr indeksowy Z
cpi R16, ZNAK_KONCA
breq Pok_c_LCD_2 ; jeťli znak jest znakiem ko˝ca, to zako˝cz,
rcall Zapisz_LCD ; w przeciwnym razie wyťwietl go na LCD
rjmp Pok_c_LCD_1 ; i przejdč do odczytywania kolejnego znaku
Pok_c_LCD_2:
pop R17
pop R16
ret
.include "czekaj_ms.inc"
.include "czekaj_us.inc"