Stránka 2 z 2
Napsal: 16 lis 2009, 10:26
od nevim
Tak problem vyresen!!
kod je spravny, ale ja jak jsem si s tim hral a mel jsem 3 verze, tak header byl stale puvodni. pred chvilkou sem si toho vsilm, prepsal na 3 a jede to!!
Napsal: 16 lis 2009, 11:00
od Andrea
Klasická chyba mezi židlí a klávesnicí

Ale hlavně, že to funguje.
Napsal: 06 pro 2009, 18:29
od apam
mam taky to lcd a pokousim se ho rozjet v bascomu, zapnout ho dovedu ale zobrazit pixel a smazat ho tam kde chci se mi nedari...
co musim udelat kdyz chci zapsat treba pixel na souradnice (x , y) (10 , 20)
vyvod rst je trvale na +5v nejde pouzit knihovna z bascomu glcdks108.lib pac se dataport sklada ze dvou portu a navic nefacha na 16mhz s megou32.
dik za radu.
Napsal: 06 pro 2009, 21:40
od Andrea
Displej je rozdělený na dvě poloviny, jsou v něm dva řadiče, jeden pro pravou půlku jeden pro levou. Při zápisu (čtení) dat a instrukcí je tedy potřeba rozhodnout, pro který řadič jsou a do toho řadiče je zapsat (přečíst). Jsou to tedy jakoby dva samostatné displeje 64x64bodů vedle sebe. Svisle jsou organizované jako 8 stránek (0 až 7) pod sebou, každá stránka je 8 řádek (64 řádek celkem). Vodorovně mají 64 sloupců (0 až 63). Číslo stránky se nastavuje instrukcí Set Page (X Address) binárně 10111PPPb, číslo sloupce instrukcí Set Address (Y Address) binárně 01YYYYYYb. Data se zapisují/čtou vždy po 8-bitech, které reprezentují 8 bodů pod sebou v nastavené stránce a aktuálním sloupci. Bod na pozici 20 vodorovně a 10 svisle (počítáno od nuly) tedy odpovídá sloupci 20, stránce 1, bitu 2. Po zapsání/přečtení dat se automaticky inkrementuje číslo sloupce. Před zápisem příkazů a čtením/zápisem dat je potřeba otestovat čtením statusu (Status Read), zda je displej schopný příkaz/data přijmout, případně počkat.
Displej má ještě jeden registr, Display Start Line, který říká, která řádka (0-63) je zobrazená jako první shora. Dá se tak posouvat obsah displeje nahoru nebo dolu bez nutnosti přesouvat všechna data v paměti displeje. Pokud je číslo počáteční řádky nenulové, je nutno tento posun připočítat při výše uvedeném výpočtu svislé pozice bodu na displeji.
Napsal: 06 pro 2009, 22:21
od apam
aha no uz tomu rozumim, vlastne je to uplne jednoduche. diky moc za drahocenou radu.
Napsal: 08 pro 2009, 12:47
od apam
tak jsem zde něco vytvořil, problém je že když chci zapsat pixel na souřadnici 0,0 zapíše se až na 1,0 a 63,0 se zapíše jako 0,0 to samé i na druhé polovině lcd neví někdo čím to může být asi to bude nějak souviset s automatickou inkrementací v ose x nebo tak něco...asi.
Kód: Vybrat vše
'*******************************************************************************
'* Ovladani lcd s ks0108 + atmega32 16MHz **************************************
'* apam@seznam.cz **************************************************************
'*******************************************************************************
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
'$sim
'*******************************************************************************
'* LCD Konfigurace pinu ks108 **************************************************
'*******************************************************************************
Config Portc = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Porta.3 = Output
Config Portd.6 = Output
Dataport Alias Portc
Rs Alias Portd.1
Rw Alias Portd.2
E Alias Portd.3
Cs2 Alias Porta.3
Cs1 Alias Portd.6
'*******************************************************************************
'* Deklarace F-ce LCD **********************************************************
'*******************************************************************************
Declare Sub Ks_init()
Declare Sub Ks_cls(byval Cx As Byte)
Declare Sub Ks_pset(byval Lx As Byte , Byval Ly As Byte , Byval Lz As Byte)
'*******************************************************************************
'* Promenne ********************************************************************
'*******************************************************************************
Dim Horizontala As Byte 'posuv lcd
Dim A As Byte
'*******************************************************************************
'* Jina nastaveni **************************************************************
'*******************************************************************************
Horizontala = 192 ' 192 =0 pro posouvani obsahu lcd
'*******************************************************************************
'* Vlastni program *************************************************************
'*******************************************************************************
Call Ks_init()
Call Ks_cls(0)
Do
Call Ks_cls(0)
Wait 1
For A = 0 To 127 'nakresli horizontalni caru 0-127
Call Ks_pset(a , 10 , 1)
Waitms 10
Next
For A = 0 To 127 'smaze horizontalni caru 0-127
Call Ks_pset(a , 10 , 0)
Waitms 10
Next
Call Ks_pset(0 , 0 , 1) 'zapisuje pixelz podle souradnic
Call Ks_pset(0 , 63 , 1)
Call Ks_pset(63 , 0 , 1)
Call Ks_pset(63 , 63 , 1)
Call Ks_pset(64 , 0 , 1)
Call Ks_pset(64 , 63 , 1)
Call Ks_pset(127 , 0 , 1)
Call Ks_pset(127 , 63 , 1)
Wait 3
Loop
End 'end program
'*******************************************************************************
'*******************************************************************************
'* LCD INIT fce KS_INIT ********************************************************
'*******************************************************************************
Sub Ks_init()
Reset Rs
Reset Rw
Set Cs1
Set Cs2
Waitus 42
Dataport = &HC0 ' start line
Gosub Ecko
Waitus 42
Dataport = &H40 ' adresa
Gosub Ecko
Waitus 42
Dataport = &HB8 ' stranka
Gosub Ecko
Waitus 42
Dataport = &H3F ' zapnuti lcd
Gosub Ecko
Reset Cs1
Reset Cs2
End Sub
'*******************************************************************************
'* Clear LCD fce KS_cls(x), x=1=invert *****************************************
'*******************************************************************************
Sub Ks_cls(cx As Byte)
Local Ccx As Byte , Ccy As Byte
Ccy = 0
Set Cs1
Set Cs2
Reset Rw
Reset Rs
Dataport = Horizontala 'start line
Gosub Ecko
Dataport = 64 'adresa
Gosub Ecko
Dataport = 184 'stranka
Gosub Ecko
If Cx = 0 Then
For Ccy = 0 To 7
Dataport = Ccy + 184
Gosub Ecko
Set Rs
For Ccx = 0 To 63
Dataport = 0
Gosub Ecko
Next
Reset Rs
Next
Else
For Ccy = 0 To 7
Dataport = Ccy + 184
Gosub Ecko
Set Rs
For Ccx = 0 To 63
Dataport = 255
Gosub Ecko
Next
Reset Rs
Next
End If
Reset Rs
Reset Cs1
Reset Cs2
End Sub
'*******************************************************************************
'* PIXEL SET fce KS_PSET *******************************************************
'*******************************************************************************
Sub Ks_pset(lx As Byte , Ly As Byte , Lz As Byte)
Local Ylcd As Byte , Lcdram As Byte , Stranka As Byte
If Lx > 127 Then Lx = 127
If Ly > 63 Then Ly = 63
Stranka = Ly / 8
Ylcd = Ly Mod 8
If Lx < 64 Then
Set Cs1
Reset Cs2
Reset Rs
Reset Rw
Dataport = 64 + Lx
Gosub Ecko
Dataport = 184 + Stranka
Gosub Ecko
Dataport = 0
Set Rs
Set Rw
Lcdram = Dataport
Gosub Ecko
Reset Rs
Reset Rw
If Lz = 0 Then
Reset Lcdram . Ylcd
Else
Set Lcdram . Ylcd
End If
Set Rs
Dataport = Lcdram
Gosub Ecko
Else
Reset Cs1
Set Cs2
Reset Rs
Reset Rw
Dataport = Lx
Gosub Ecko
Dataport = 184 + Stranka
Gosub Ecko
Dataport = 0
Set Rs
Set Rw
Lcdram = Dataport
Gosub Ecko
Reset Rs
Reset Rw
If Lz = 0 Then
Reset Lcdram . Ylcd
Else
Set Lcdram . Ylcd
End If
Set Rs
Dataport = Lcdram
Gosub Ecko
End If
Reset Rs
Reset Cs1
Reset Cs2
End Sub
Ecko:
Waitus 1
Set E
Waitus 3
Reset E
Waitus 3
Return
Napsal: 08 pro 2009, 13:01
od Andrea
Nikde nevidím, že bys testoval Busy flag. Ten posun je způsoben tím, že před zápisem čteš, i čtení posouvá adresu sloupce. Navíc při čtení je potřeba číst dvakrát (viz datašít).
Napsal: 08 pro 2009, 13:14
od apam
a kdy se musi testovat busy flag? pred kazdym zapisem?, s tim posuvem mas pravdu uz jsem to opravil.zitra na to mrknu.