·
T-Bird panel és kapcsolási rajza a 2. verziónak.
· Expansion Board és a kapcsolási rajza.
·
·
Alap panel.
·
Expansion Board
·
Led 3-0
= PORTB 7-4
·
Led 7-4
= PORTD 7-4
·
Gomb4-0
= PORTG 4-0
(G port a memória címtartományban van.
STS kell OUT helyett és LDS az IN helyett)
·
PORTA vezérli.
Ezért DDRA=0xFF-el kell az A port bitjeit kifelé irányítani.
PORTA7 = 1 akkor a megcímzett (0…4) kijelzőt
bekapcsoltuk. (vilgítás engedélyezése)
PORTA6..4= 3 bites címe a kijelző
szegmenseknek. Értéke 0..4 lehet. (0..3 a szegmens,
PORTA3..0= kijelzett érték 4 biten.
Értéke 0..9 lehet.
· Jobb szélső szegmens: 0. cím
· Bal szélső szegmens: 3. cím
· Kettőspont: 4. cím
· Kijelezhető érték: 0…9
· Egy időben a 4 db hétszegmenses +1 db kettőspont kijelző közül csak 1 db világíthat. Ezért a kijelzést egymás után kell megvalósítani, 10-20 msec-on belül 1 teljes ciklust, hogy a szemünknek ne villóddzanak a számjegyek
· PORTC7=Piros --> ZÖLD az én panelemnél,
· PORTE2=Kék --> Kék
· PORTE3=Zöld --> PIROS az én panelemnél
· Pulzus szélesség (PWM) változtatással a szín és a fényerő változtatható.
· PORTC0= bill 0 oszlop input bal
· PORTC1= bill 1 oszlop input közép
· PORTC2= bill 2 oszlop input jobb
· PORTC3= bill 0. sor output 123
· PORTC4= bill 1. sor output 456
· PORTC5= bill 2. sor output 789
· PORTC6= bill 3. sor output *0#
· A lekérdezés ismétlése, amíg nincs lenyomott billentyű. while(1) {… if(x) break;….}
· A sorokra sor= 0..3 egymás után kiadom az aktív jelet. PORTC=(1<<(sor+3))
· Minden sor esetében beolvasom mindhárom oszlopot. x=(~PINC &7). ( a lenyomás ad 0-t. Ha ez nem 0, akkor: jobbra shifelek 0-ig. a Shiftek számából megvan az oszlop érték, ami 0..2.
· A teljes ciklusban 1 helyen lehet a beolvasott érték aktív. Ezért a Nem 0 esetben (x>0) kilépek a ciklusból.
· Az aktív jelhez tartozó sor és oszlopszám adja a billentyűzet scan kódját.
·
A scan kódokhoz rendelhetjük a billentyű ASCII
kódját.
A 12 db ASCII kódot egy 12 elemű tömbbe tehetjük. A tömb indexe i=3*sor +
oszlop.
|
sor=0; while(1) {PORTC=(1<<(sor+3));//Aktív
sor=1 szint. PORTC6..3 biteken. //A kiadott jel szintbeállásaihoz
kell egy kis idő…a beolvasás előtt. //A tranzisztor
kikapcsolása lassú. A következő sor vizsgálat csak ezután jöhet. x=(~PINC)&7; //A lenyomott=0 szint,
ezért negálok ~-el. if (x) break; //Találtam 1 db
lenyomott billentyűt sor++; if (sor==4) sor=0; //vagy
sor%=4; néggyel osztás maradéka. } oszlop=0; while((x=x>>1)) oszlop++; //x=1,2,4 -->Oszlop=0,1,2 ascii =t[3*sor+oszlop]; //Ahol t[] a szükséges ASCII (vagy más)
kódokkal feltöltött tömb. |
Meghajtója: EW16400YMY
chip
· PORTE7..4= 2x4 bites Adat/ Parancs (I/O) átvitel.
·
PORTF3
= Enable (Output) Író jelkor
latch enable, Olvasó jelként a 3 állapotú meghajtó engedélyezője
Lefutó élre veszi be az adatot.
Tehát, ha az adat felső és alsó 4 bitje azonos, akkor itt két lefutó él kell,
hogy a 2x4 bitnyi adatot átvigyük.
· PORTF2 = R/-W (Output) Olvasás=1; Irás=0;
· PORTF1 = RS (Output) Parancs=0; Karakter=1
· A laborunkban levő LCD panel vezérlője az EW16400YMY chip. kompatibilis (tehát csak hasonló!) a Hitachi HD44780 vezérlőjével.
· Az EW16400YMY chip 2 sor *40 karakteres displayt tud vezérelni.
· A mi LDC panelünk 4*16 karaktert tud megjeleníteni
· A vezérlő első sora az LCD 1. és 3. sorához van bekötve
· A vezérlő második sora az LCD 2. és 4. sorához van bekötve.
· A vezérlő a szabványos LCD vezérlők parancsait hajtja végre,
· A kijelző vezérlőjét az IR utasításregiszterbe írt bájtokkal utasítjuk.
· A vezérlő minden utasítást azonnal végrehajt.
·
Ha befejezte a végrehajtást, csak utána szabad
adnunk a következő utasítást, vagy adatot.
Parancs például: display törlése, kurzormozgatás, vagy memóriacím (AC) írása
stb.
·
A RAM (DDRAM)-ba írjuk a megjelenítendő
karakterek kódjait.
A RAM tartalmát egy karaktertáblázat alapján jeleníti meg a kijelző. Minden 1
bájtos adathoz a karaktergenerátor rendel egy 5x7 pixeles képet.
·
A RAM aktuális beírási címét az AC (címszámláló
regiszter) jelöli ki.
AC értéke adatbeírás után automatikusan inkrementálódik. (dekrementálódik a
jobbról balra ításhoz), parancstól függően.
AC értéke parancs módban írható.
Clear display parancsra AC=0 is történik.
AC értéke a CURSOR pozícióját (is) meghatározza.
· Display sorok kezdőcímei:
#define EGY 0x80 //LCD 1. sor
címe #define KETTO 0xC0 //LCD
2. sor címe #define HAROM 0x90 //LCD
3. sor címe #define
NEGY 0xD0 //LCD
4. sor címe |
·
DR adatregiszterbe írás után DR tartalma
automatikusan az AC regiszter által címzett RAM regiszterbe kerül, majd AC
automatikusan nő 1-el.
DR olvasásakor az AC által címzett RAM tartalmat olvassuk, majd AC 1-el nő..
·
BF (busy flag). Ha 1-ben van, akkor a következő
utasítás-adat nem írható, a belső működésnek még nincs vége.
A display inicializálás elején a BF még nem figyelhető, ilyenkor időzítés kell,
mely értéke a kijelzőt működtető órafrekvenviától és a parancs típusától függ!
(nézd az eredeti katalógust, ne a mások által ajánlott tuti módokat!)
·
A kódtáblát tanulmányozva vegyük észre:
Ha magyarítani akarunk, csak 8 kód áll rendelkezésre. (A szürke címterületen).
Ez jó az áéíóú űő –nek. Az ékezetes
nagybetűk ebben az esetben sem mennek.
·
Az LCD-nk kódtáblájában megvan az
ö=0xEF kóddal, és az
ü=0xF5 kóddal.
áéíóöőúüű 9 ékezetes magyar betű van. Kettő az ö és az ü megtalálható a gyári
karaktergenerátorban. 9-2=7 ékezetes betű képét nekünk kell definiálnunk.
· Tehát 1 karakterkép szabadon állítható a CGRA-ban akkor is ha az összes magyar kis ékezetes betűt meg akarjuk jeleníteni.
· Az olvashatóság érdekében, ha magyarítunk: Az ékezetes nagy betűk kódjait is, a kis ékezetes betűk kódjaival (0..7) jelenítsük meg.
typedef unsigned char u8; u8 cgram[] = {0x02,0x04,0x0E,0x01,0x0F,0x11,0x0F,0x00, //á 0x02,0x04,0x0E,0x11,0x1F,0x10,0x0E,0x00, //é 0x02,0x04,0x0C,0x04,0x04,0x04,0x0E,0x00, //í 0x02,0x04,0x0E,0x11,0x11,0x11,0x0E,0x00, //ó 0x02,0x04,0x11,0x11,0x11,0x13,0x0D,0x00, //ú 0x0A,0x00,0x11,0x11,0x11,0x13,0x0D,0x00, //ü 0x05,0x0A,0x11,0x11,0x11,0x13,0x0D,0x00, //ű 0x05,0x0A,0x0E,0x11,0x11,0x11,0x0E,0x00}; //ő |
·
·
Ez a
diagram nem a valós, de ezt találtam a NET-en. :-( Persze nem a gyártó forrása.
Sajna nem jellemző, hogy a pontos idődiagramokat publikálják.
· A T-Birtd expansion board LCD HD44780 meghajtója a EW16400YMY chip. Ha szétszedjük, a chip azonosítója csak akkor látható, rá van írva, alul.
· Visszatételnél ügyeljünk, hogy a csatlakozóba pontosan dugjuk be az összes tüskét. Sajnos lehetőség van 1-2 sorral eltolva bedugni a tüskéket, mely hatása feszültség ráhelyezés után jobb esetben, csak a biztosíték cseréjével jár… :-)
·
·
·
Oszlop: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Sor 1 80 81 82 83 84 85 86 87 88 89 8A 8B
Sor 2 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
Sor 3 90 91 92 93 94 95 96 97 98 99 9A 9B
Sor 4 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
Oszlop: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Sor 1 80 81 82 83 84 85 86 87 88 89 8A 8B
Sor 3 90 91 92 93 94 95 96 97 98 99 9A 9B
Rejtett: A0 A1 A2 A3 A4 A5 A6 A7
Sor 2 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
Sor 4 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
Rejtett: E0 E1 E2 E3 E4 E5 E6 E7
· A táblázat alapján látható AC automatikus inkrementálódásának módja:
//AC RAM címregiszter automatikus inkrementálódása: AC++; if (AC==0xA8) AC=0xC0; //40 karakter után //1. és
3. sor folyamatos írása (40 karakter) után //a 2.
sor elején folytatódik az adatbeírás if (AC==0xE8) AC=0x80; //40 karakter után //2. és
4. sor folyamatos írása (40 karakter) után //az 1.
sor elején folytatódik az adatbeírás |
LCD SOR |
EGY |
HAROM |
Rejtett |
|
KETTO |
NEGY |
Rejtett |
|
|
8 |
9 |
A |
B |
C |
D |
E |
F |
|
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
0 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
8 |
|
|
|
|
|
|
|
|
9 |
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
B |
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
E |
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SÁRGA: az első 40 karakterkód
RAM címe |
|
ZÖLD: a második 40 karakterkód
RAM címe |
||||||
Folyamatos beírás esetén |
a 0xA7 címet a 0xC0 követi |
|
|
|
|
|||
|
|
a 0xE7 címet a 0x80 követi |
|
|
|
|
· Az LCD vezérlője a EW14600 chip.
·
Kétsoros 2*40 karakteres megjelenítést támogat.
· AZ első 40 karaktert az LCD 1. és 3. sorában, a másogik 40 karaktert az LCD 2. és 4. sorában jeleníti meg.
· Shiftelésnél a vezérlő a 40 karakternyi „sorokat” shifteli körbe. Tehát az 1. és 3. sor betüi a 2. és 4. sorba nem kerülhetnek.
Parancs |
Hatása |
|
|
|
|
|
|