atm12864d

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
nevim
Příspěvky: 19
Registrován: 15 lis 2009, 00:00

#16 Příspěvek 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!!
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#17 Příspěvek od Andrea »

Klasická chyba mezi židlí a klávesnicí :wink: Ale hlavně, že to funguje.
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

#18 Příspěvek 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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#19 Příspěvek 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.
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

#20 Příspěvek od apam »

aha no uz tomu rozumim, vlastne je to uplne jednoduche. diky moc za drahocenou radu.
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

#21 Příspěvek 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
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#22 Příspěvek 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).
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

#23 Příspěvek 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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“