dobrý den
zkouším pripojit lcd WC1602A0-SFYLYNC06 k atmega 16
ale ukáže mě první řádek bílý a druhý černý asi jsem ho špatně nainicializoval zkoušel jsem ukázkový program z Práce s uC atmel avr od ben
displej sem kupaval tady tme.eu/cz/katalog/#cleanPara … szukaj%3D+
když k němu připojím napájení je celý bílý a když se ho pokusim inicializovat druhy radek ztmavne a hned jak se snazim do uC nahrat jiny program všechno zbělá zkoušel sem protahovat časy mezi daty vysílanými na lcd ale pořád stejný výsledek přikládám ukázkový program který sem tam nahrál
.NOLIST
.INCLUDE "m16def.inc"
.LIST
.DEF REG=R16 ;prac. registr
.DEF POC=R20 ;počítadlo
.CSEG ;kódový segment
;hlavní program:
START: LDI REG,LOW(RAMEND)
OUT SPL,REG ;nastavení SP
LDI REG,HIGH(RAMEND)
OUT SPH,REG ;na konec SRAM
;inicializace LCD:
RCALL LCDINI
;nastavení adresy textu:
LDI ZL,LOW(ADRZTX)
LDI ZH,HIGH(ADRZTX)
;smycka animace:
SMYCKA: ;příprava na první řádek:
LDI REG,$80
RCALL LCDWCM ;první řádek
LDI POC,16 ;počet sloupců
RADEK1: LPM REG,Z+ ;nahraj znak
RCALL LCDWDT ;zapiš znak
DEC POC ;konec řádku?
BRNE RADEK1
;příprava na druhý řádek:
LDI REG,$C0
RCALL LCDWCM ;druhý řádek
LDI POC,16 ;počet sloupců
RADEK2: LPM REG,Z+ ;nahraj znak
RCALL LCDWDT ;zapiš znak
DEC POC ;konec řádku?
BRNE RADEK2
;čekání 2 s:
RCALL CEK2S
;test konce animace:
CPI ZL,LOW(ADRKTX) ;porovná
LDI REG,HIGH(ADRKTX) ;Z s ADRKTX
CPC ZH,REG
BREQ START ;celé znovu
;příprava na další krok:
SBIW ZL,16 ;Z=Z-16
RJMP SMYCKA ;další krok
;text pro výpis:
ZTEXT: .DB " "
.DB " "
.DB "BEN uvadi: "
.DB "Udelejte si z PC"
.DB "Prace s ",$E4,"C ATMEL"
.DB "Cislicova tech. "
.DB "C++ Builder "
.DB "USB prakticky "
.DB "Prvni kroky sAVR"
.DB "LCD prakticky "
.DB " "
KTEXT: ;konec textu+1
.EQU ADRZTX=2*ZTEXT ;adresa začátku textu
.EQU ADRKTX=2*KTEXT ;adresa konce textu
;vložení rurin pro LCD:
.INCLUDE "ATLCDTX2.INC"
ATLCDTX2.INC
.DEF REG=R16 ;pracovní registr
.DEF CNT1=R17 ;čítače průchodů
.DEF CNT2=R18 ;pro čekací
.DEF CNT3=R19 ;rutiny
.EQU E=2 ;signály
.EQU RS=1 ;pro řízení
.EQU FL=0 ;LCD
.EQU DDR=DDRC ;řízení směru
.EQU PORT=PORTC ;port
;inicializace LCD
LCDINI: LDI REG,$00
OUT PORT,REG ;výchozí hodnoty
LDI REG,$7F
OUT DDR,REG ;výstup režim
RCALL CEK15M ;čekej 15ms
CBI PORT,RS ;RS=0
SBI PORT,E ;E=1
LDI REG,$1B ;DATA=$30
OUT PORT,REG
CBI PORT,E ;E=0
RCALL CEK4M1 ;počkej 4,1ms
SBI PORT,E ;E=1
CBI PORT,E ;E=0
RCALL CEK100 ;počkej 100us
SBI PORT,E ;E=1
CBI PORT,E ;E=0
RCALL CEK40 ;čekej 40us
LDI REG,$20 ;4bitová komunikace
RCALL LCDWCM
LDI REG,$28 ;nastavanení funkce
RCALL LCDWCM
LDI REG,$01 ;smazání displeje
RCALL LCDWCM
LDI REG,$08 ;vypnutí kurzoru
RCALL LCDWCM
LDI REG,$0C ;zapnutí displeje
RCALL LCDWCM
LDI REG,$06 ;režim inkrementace
RCALL LCDWCM
RET
;čeká CNT1*us
CEK: DEC CNT1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BRNE CEK
RET
;čeká 40us
CEK40: LDI CNT1,40
RCALL CEK
RET
;čeká 100us
CEK100: LDI CNT1,100
RCALL CEK
RET
;čeká CNT2*100us
CEKM: RCALL CEK100
DEC CNT2
BRNE CEKM
RET
;čeká 1,6ms
CEK1M6: LDI CNT2,16
RCALL CEKM
RET
;čeká 4,1ms
CEK4M1: LDI CNT2,41
RCALL CEKM
RET
;čeká 15ms
CEK15M: LDI CNT2,150
RCALL CEKM
RET
;čeká asi 2s
CEK2S: LDI CNT1,100
LDI CNT2,0
LDI CNT3,0
CEKV0: DEC CNT3
BRNE CEKV0 ;smyčka 1
DEC CNT2
BRNE CEKV0 ;smyčka 2
DEC CNT1
BRNE CEKV0 ;smyčka 3
RET
;zapíše data/příkaz REG
LCDWDT: SET ;T=1
SBI PORT,RS ;RS=1
RJMP LCDWR1
LCDWCM: CLT ;T=0
CBI PORT,RS ;RS=0
LCDWR1: MOV CNT2,REG ;schovej REG
SBI PORT,E ;E=1
ANDI REG,$F0 ;vymaskuj horní bity
LSR REG ;>>1
ORI REG,$04 ;přidej E=1
BLD REG,RS ;přidej RS(T)
OUT PORT,REG ;vystav
CBI PORT,E ;E=0
SBI PORT,E ;E=1
MOV REG,CNT2 ;obnov REG
ANDI REG,$0F ;vymaskuj dolní bity
SWAP REG ;dej na místo horních
LSR REG ;>>1
ORI REG,$04 ;přidej E=1
BLD REG,RS ;přidej RS(T)
OUT PORT,REG ;vystav
CBI PORT,E ;E=0
RCALL CEK40 ;počkej 40us
BRTS LCDWRE ;pokud T=1, konec
MOV REG,CNT2 ;obnov REG
ANDI REG,$03 ;pro $01, $02, $03
BRNE LCDWR2 ;čekej 1,6ms
LCDWRE: RET
LCDWR2: RCALL CEK1M6
RET
administrator: přejmenováno z "problem s lcd 1602"