Grafikus LCD
De hamar elmentél!! ???
Most jött volna az eddig megszerzett ismeretek alkalmazása.
Az eredeti „_gpixel:” rutint kiegészítettük volna 2 utasítással.
Hogy „Pset” utasítás után visszakapjuk az előző Pixel állapotát, és a Bit – Byte belüli helyzetét.
Ezáltal Pset után jöhetne az ütközés vizsgálat!
Így elhagyható lenne a Pset előtti Pixelolvasás.
Most jött volna az eddig megszerzett ismeretek alkalmazása.
Az eredeti „_gpixel:” rutint kiegészítettük volna 2 utasítással.
Hogy „Pset” utasítás után visszakapjuk az előző Pixel állapotát, és a Bit – Byte belüli helyzetét.
Ezáltal Pset után jöhetne az ütközés vizsgálat!
Így elhagyható lenne a Pset előtti Pixelolvasás.
- solti_imre
- DrótVégénSzéndarab
- Hozzászólások: 22
- Csatlakozott: 2010. december 2. csütörtök, 7:00
Hamar??? Tegnap látástól mikulásig a monitor előtt ültem!kapu48 írta:De hamar elmentél!! ???
Igen, ilyesmikre gondoltam én is, ezért is írtam a tegnapi utolsó hozzászólásomban, hogy már csak a maszkolás és a vizsgálatok vannak hátra - remélem a jövő héten lesz egy kis időm rá, hogy az ezzel kapcsolatos asm utasításokat átnézzem.kapu48 írta: ...
Az eredeti „_gpixel:” rutint kiegészítettük volna 2 utasítással.
Hogy „Pset” utasítás után visszakapjuk az előző Pixel állapotát, és a Bit – Byte belüli helyzetét.
Ezáltal Pset után jöhetne az ütközés vizsgálat!
Így elhagyható lenne a Pset előtti Pixelolvasás.
Ismételten nagyon köszönöm a segítséged, további jó hétvégét Neked!
Játék programba kellett ütközés vizsgálatot megvalósítani.
Számunkra még ismeretlen HW és SW környezetben.
A téma kezdete: solti_imre Elküldve: 2012. Július 26. Csütörtök, 16:01
A Fenti 2 oldalon keresztül folytatott kísérletezés eredménye összefoglalva.
SBN6400G-D+SBN0064G-D -vel szerelt 128x64-es LCD kijelző.
A használt : „glcdKS108.lib”
Kiindulási alapnak vettük a lib-ben levő Pontrajzoló rutint. ( 3 hsz-el feljebb.)
Amit kiegészítettünk 2 utasítással.
Így elértük, hogy a grafikus „Pset” parancsból visszatéréskor benne lesznek a „Gbyteread” változóban az Pset előtti Pixel értékek amit megvizsgálva eldönthetjük, hogy történt e ütközés?
Használat:
És a módosítót rutin „glcdKS108.lib” -ben:
Remélem segítség lesz ez a kis módosítás!
Számunkra még ismeretlen HW és SW környezetben.
A téma kezdete: solti_imre Elküldve: 2012. Július 26. Csütörtök, 16:01
A Fenti 2 oldalon keresztül folytatott kísérletezés eredménye összefoglalva.
SBN6400G-D+SBN0064G-D -vel szerelt 128x64-es LCD kijelző.
A használt : „glcdKS108.lib”
Kiindulási alapnak vettük a lib-ben levő Pontrajzoló rutint. ( 3 hsz-el feljebb.)
Amit kiegészítettünk 2 utasítással.
Így elértük, hogy a grafikus „Pset” parancsból visszatéréskor benne lesznek a „Gbyteread” változóban az Pset előtti Pixel értékek amit megvizsgálva eldönthetjük, hogy történt e ütközés?
Használat:
Kód: Egész kijelölése
' Az ASM-nak átadandó változókat előre kell létrehozni, Nem lehet a Sub rutinokban
'grafikus "Pset" parancsból visszatéréskor benne lesznek a "Gbyteread" változóban az
'Pset előtti Pixel értékek amit megvizsgálva eldönthetjük, hogy történt e ütközés?
Dim Gbyteread As Byte
' Az aktuális bite maszkja
Dim Pixelbit As Byte
' $lib "glcdSBN6400.lib"
$lib "glcdKS108.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portd , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5
Cls
Pset X , Y, 1
If Gbyteread.Pixelbit = 1 Then
’Üközés történt
End if
Kód: Egész kijelölése
[_GPIXEL]
$external _div8 , _glocate , _adjust_pin
; set or reset a single pixel
; X=R20 , Y=R21 , R25 is on/off
_gpixel:
Push r0
Push r1
Push r2
Push r3
Push r16
Push r25 ; menti a Pixel művelet H/L jelzőt
Push r20 ; menti X értékét
Mov r16,r21 ; row
Ldi R20 , 8 ; 8 Bits In Byte
call _Div8 ; r16 tartalmazza a megfelelő Y-cím sort most contains proper Y/row address now
Mov r0, r24 ; save remainder
; Itt bővítettük a rutint. Elmentve az Byte.bit számítás eredményét
* sts {Pixelbit},r24 ; Elmentjük a Bit Sorszámát
Pop r20 ; get X back
Mov r21,r16 ; y data location
mov r2,r20 ; save for later
mov r3,r21 ; X, Y Adatokból grafikus memória cím számítás, és be írása a cím regiszterekbe
rcall _setcol ; use the code from locate
; GLCD Memoria olvasás
rcall _gread_data ; return data in r1
rcall _gread_data ; return data in r1 DO NOT REMOVE !!!
; Itt bővítettük a rutint. Elmentve az pixelmódosítás előtti állapotot
* sts {Gbyteread},r1 ; Elmentjük a kiolvasót Bytet
mov r20,r2 ; X, Y címek frissítése
mov r21,r3
rcall _setcol ; use the code from locate
Mov r24,r0 ; Maradék számítás remainder
call _Adjust_pin ; Bit maszk számítás ???
Pop r16 ;param r25
tst r16 ; Test for Zero
breq _gpixel_clear ; Ugrás ha zéró Branch if Equal
; r1-ben van az eredeti Byte értéke, r24-ben a változtatni kívánt Bit maszk
or r1,r24 ; Pixel Set, Logical OR
rjmp _gpixel_set
_gpixel_clear: ; Pixel Törlés
and r1,r25 ; Logical AND
_gpixel_set:
mov r24,r1
rcall _GWrite_data ; write data
Pop r16 ; Regiszterek visszatöltése
Pop r3
Pop r2
Pop r1
Pop r0
ret
[END]
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. november 23. péntek, 20:33-kor.
.bgf fájl
Sziasztok! Napok óta szívok egy grafikus kijelzővel. KS 108 alapú 128*64, semmi különös. Bascom alatt próbálom működése bírni, nagyrészt sikerrel. A SAMPLES \LCDGRAPH könyvtáras alapprogramok mennek szépen, de én új bgf fájlt szerettem volna megjeleníteni.. na itt van a gond. A tools-ban van egy segédprogram:Graphic Converter (gondolom nem mondtam újat), ezzel próbáltam egy egyszerű keretet konvertálni. Elvileg sikerült, megvan a keret.bgf fájl, de amikor ezt illesztem be a példaprogramba, csak kozmikus zavar leképezését jeleníti meg, nem az óhajtott keretet... SZóval teleszemeteli a kijelzőt pontokkal és per jelekkel..
Esetleg 5let, hol szúrhattam el a konvertálást?
A bmp fájlt photosop-al készítettem 1 bites 128x64 kivitelben.
Esetleg 5let, hol szúrhattam el a konvertálást?
A bmp fájlt photosop-al készítettem 1 bites 128x64 kivitelben.
Jani, Király vagy! SED beállítás kell!
Valamiért ezt direkt nem pipáltam ki, úgy emlékeztem rá, hogy ez nem a ks107/108 -hoz való.. de mégis..
@Robert, ATMEGA1284 , Bascom 2.0.7.1
egyébként ez amit vettem, P nélküli, és nem is szerepel a dat állományban. Csináltam egy másolt datot, és itt átírtam a DEVID-t 1E9706-ra (eredeti 1E9705)
Köszi mégegyszer!
Valamiért ezt direkt nem pipáltam ki, úgy emlékeztem rá, hogy ez nem a ks107/108 -hoz való.. de mégis..
@Robert, ATMEGA1284 , Bascom 2.0.7.1
egyébként ez amit vettem, P nélküli, és nem is szerepel a dat állományban. Csináltam egy másolt datot, és itt átírtam a DEVID-t 1E9706-ra (eredeti 1E9705)
Köszi mégegyszer!
Szerintem még az m128def.dat 1384 sorból: PWM1B=$8A
is törölnöd kellene!
Ezek a különbségek a 2 állomány között:
m1284Pdef.dat:
1: [DEVICE]
2: FILE=M1284PDEF.DAT ; file name
3: pdf=ATmega1284P.pdf
4: pdfurl=http://www.atmel.com/Images/doc8059.pdf
5: device = ATMEGA1284P
6: UP = M1284P ; shortname for micro
7: RAMSTART = $100 ; start of SRAM memory
37: DEVID=1E9705 ; device ID
1384: PWM1B=$8A
m1284def.dat:
1: [DEVICE]
2: FILE=M1284PDEF.DAT ; file name
3: pdf=ATmega1284.pdf
4: pdfurl=http://www.atmel.com/Images/doc8059.pdf
5: device = ATMEGA1284
6: UP = M1284 ; shortname for micro
7: RAMSTART = $100 ; start of SRAM memory
37: DEVID=1E9706 ; device ID
is törölnöd kellene!
Ezek a különbségek a 2 állomány között:
m1284Pdef.dat:
1: [DEVICE]
2: FILE=M1284PDEF.DAT ; file name
3: pdf=ATmega1284P.pdf
4: pdfurl=http://www.atmel.com/Images/doc8059.pdf
5: device = ATMEGA1284P
6: UP = M1284P ; shortname for micro
7: RAMSTART = $100 ; start of SRAM memory
37: DEVID=1E9705 ; device ID
1384: PWM1B=$8A
m1284def.dat:
1: [DEVICE]
2: FILE=M1284PDEF.DAT ; file name
3: pdf=ATmega1284.pdf
4: pdfurl=http://www.atmel.com/Images/doc8059.pdf
5: device = ATMEGA1284
6: UP = M1284 ; shortname for micro
7: RAMSTART = $100 ; start of SRAM memory
37: DEVID=1E9706 ; device ID
Re: Grafikus LCD
Sziasztok.
Segítséget szeretnék kérni egy bizonyos GMS márkájú "msg12864a" tipusú lcd bekötésével kapcsolatban. http://lcd-systeme.com/downloads/goods_ ... 000214.pdf
A fenti linken látjátok az infókat.
Egy arduino mega 2560 -as hoz szeretném kötni és onnan vezérelni, de nem tudom pontosan, hogy melyiket hova kössem.
Élőre is köszönöm aki tud segíteni!!!
Üdv Dani
Segítséget szeretnék kérni egy bizonyos GMS márkájú "msg12864a" tipusú lcd bekötésével kapcsolatban. http://lcd-systeme.com/downloads/goods_ ... 000214.pdf
A fenti linken látjátok az infókat.
Egy arduino mega 2560 -as hoz szeretném kötni és onnan vezérelni, de nem tudom pontosan, hogy melyiket hova kössem.
Élőre is köszönöm aki tud segíteni!!!
Üdv Dani
Re: Grafikus LCD
Szia!
Úgy, mint bármely másik KS108-szerű LCD-t.
D0-D7 egy portra, a többi vezérlőjel egy másik port bitjeire, tetszőlegesen.
Különféle kijelzőknél, ahol 2db ChipSelect van, néha felcserélik a jobb/bal oldal CS-t, de ez hamar kiderül.
Config Graphlcd = 120 * 64sed , Dataport = Porta , Controlport = Portd , Ce = 5 , Ce2 = 7 , Cd = 3 , Rd = 4
Persze, hogy az adott kontroller melyik meglévővel kompatibilis, azt hirtelen nem tudom... ahhoz
megfelelő LIB-et kell alátenni.
JAni
Úgy, mint bármely másik KS108-szerű LCD-t.
D0-D7 egy portra, a többi vezérlőjel egy másik port bitjeire, tetszőlegesen.
Különféle kijelzőknél, ahol 2db ChipSelect van, néha felcserélik a jobb/bal oldal CS-t, de ez hamar kiderül.
Config Graphlcd = 120 * 64sed , Dataport = Porta , Controlport = Portd , Ce = 5 , Ce2 = 7 , Cd = 3 , Rd = 4
Persze, hogy az adott kontroller melyik meglévővel kompatibilis, azt hirtelen nem tudom... ahhoz
megfelelő LIB-et kell alátenni.
JAni
Re: Grafikus LCD
Sziasztok, grafikus LCD-t szeretnék működésre bírni, de egyelőre nem sok életjelet ad azon kívül, hogy tudom változtatni a kontrasztot.
Arduino Mega 2560-am van, így kötöttem be a kijelzőt (a szám azt jelenti, hogy az arduino panel melyik lábára kötöttem):
4. RS - 35
5. RW - 33
6. E - 34
7. DB0 - 22
8. DB1 -23
9. DB2 - 24
10. DB3 - 25
11. DB4 - 26
12. DB5 - 27
13. DB6 - 28
14. DB7 - 29
15. CSA - 37
16. CSB - 36
17. RST - +5V
Ha egy pixel kirajzolna azzal már elégedett lennék, de nem csinál semmit. A kód:
Van valakinek ötlete, hogy miért nem csinál semmit? A vezérlőchip KS0108
Arduino Mega 2560-am van, így kötöttem be a kijelzőt (a szám azt jelenti, hogy az arduino panel melyik lábára kötöttem):
4. RS - 35
5. RW - 33
6. E - 34
7. DB0 - 22
8. DB1 -23
9. DB2 - 24
10. DB3 - 25
11. DB4 - 26
12. DB5 - 27
13. DB6 - 28
14. DB7 - 29
15. CSA - 37
16. CSB - 36
17. RST - +5V
Ha egy pixel kirajzolna azzal már elégedett lennék, de nem csinál semmit. A kód:
Kód: Egész kijelölése
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
void GLCD_On(){
DDRA=0xFF;
DDRC=0xFF;
PORTA=0x3F;
PORTC=0b00001000;
_delay_ms(3);
PORTC=0;
}
void GLCD_Pixel (){
PORTA=0x04;
PORTC=0b1110;
_delay_ms(3);
PORTC=0;
}
int main(void)
{
GLCD_On();
_delay_ms(3);
GLCD_Pixel();
while(1)
{
//TODO:: Please write your application code
}
}
Re: Grafikus LCD
Közben rájöttem, hogy a szimulátorban pont fordított logikával működött a CS.
Re: Grafikus LCD
Ha LCD-n át akarok állítani egy pixelt, de úgy, hogy a többi ne változzon azt, hogy tehetem meg? Gondolom be kell olvasni az LCD-ről azt az 1x8-as oszlopot az LCD-ről, átírni az egyik pixelt, majd visszaírni. De ha LCD-ről akarok olvasni, akkor az adat portot az AVR-en át kell állítanom bemenetnek, ez eddig rendben. De hogy tudom visszaírni az adatot a kijelzőre? Ha előbb visszaállítom kimenetnek a portot, akkor az LCD is kimenet lesz meg az AVR portja is, abból gondolom nem sok jó sül ki. Mi erre a megoldás?
Re: Grafikus LCD
Mi a hiba? Azt akarom, hogy írja végig a kijelzőt sorról sorra fekete pixelekkel, de benne marad egy egy pixel, ami minden sorváltásnál jobbra tolódik.
Kód: Egész kijelölése
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define LCD_CMD_PORT PORTC // Command Output Register
#define LCD_CMD_DIR DDRC // Data Direction Register for Command Port
#define LCD_DATA_IN PINA // Data Input Register
#define LCD_DATA_PORT PORTA // Data Output Register
#define LCD_DATA_DIR DDRA // Data Direction Register for Data Port
#define RS 2 // D/I Bit Number
#define RW 4 // R/W Bit Number
#define EN 3 // EN Bit Number
#define CSA 1 // CS1 Bit Number
#define CSB 0 // CS2 Bit Number
#define RST 5 // RESET
#define GLCD_ON 0x3F
#define GLCD_OFF 0x3E
#define BEIRAS LCD_CMD_PORT&=~(1<<EN)
#define BLACK 0xFF
#define WHITE 0
#define DATA_TO_A 1<<CSA | 1<< RS | 1<<EN | 1<<RST
#define DATA_TO_B 1<<CSB | 1<< RS | 1<<EN | 1<<RST
#define DATA_TO_BOTH 1<<CSA | 1<<CSB | 1<<RS | 1<<EN | 1<<RST
#define INSTR_TO_A 1<<CSA | 1<<EN | 1<<RST
#define INSTR_TO_B 1<<CSB | 1<<EN | 1<<RST
#define INSTR_TO_BOTH 1<<CSA | 1<<CSB | 1<<EN | 1<<RST
#define SET_COL 0x40
#define SET_PAGE 0b10111000
#define READ_DSP_A 1<<CSA | 1<<EN | 1<<RST | 1<<RS | 1<<RW
#define READ_DSP_B 1<<CSB | 1<<EN | 1<<RST | 1<<RS | 1<<RW
uint8_t i,j;
void beir(){
_delay_us(10);
BEIRAS;
_delay_us(10);
}
void GLCD_Init(uint8_t szin){
LCD_DATA_DIR=0xFF;
LCD_CMD_DIR=0xFF;
LCD_CMD_PORT&=~(0<<RST);
_delay_us(10);
LCD_DATA_PORT=GLCD_ON;
LCD_CMD_PORT=INSTR_TO_BOTH;
beir();
LCD_DATA_PORT=SET_COL; //Y address
LCD_CMD_PORT=INSTR_TO_BOTH;
beir();
for(j=0;j<8;j++){
LCD_DATA_PORT=SET_PAGE+j;
LCD_CMD_PORT=INSTR_TO_BOTH;
beir();
for(i=0;i<64;i++){
LCD_DATA_PORT=szin;
LCD_CMD_PORT=DATA_TO_BOTH;
beir();
}
}
LCD_DATA_PORT=SET_COL;
LCD_CMD_PORT=INSTR_TO_BOTH;
beir();
LCD_DATA_PORT=SET_PAGE;
LCD_CMD_PORT=INSTR_TO_BOTH;
beir();
}
void GLCD_SetPixel (uint8_t x, uint8_t y, uint8_t szin){
uint8_t sor=y%8;
uint8_t page=y/8;
uint8_t tmpdata=0x00;
LCD_DATA_PORT=SET_PAGE | page;
if(x<64){
LCD_CMD_PORT=INSTR_TO_A;
beir();
LCD_DATA_PORT=SET_COL | x;
LCD_CMD_PORT=INSTR_TO_A;
beir();
LCD_DATA_DIR=0;
LCD_CMD_PORT=READ_DSP_A;
_delay_us(10);
tmpdata=LCD_DATA_IN;
beir();
LCD_DATA_DIR=0xFF;
LCD_DATA_PORT=SET_COL | x;
LCD_CMD_PORT=INSTR_TO_A;
beir();
if (szin) LCD_DATA_PORT=(tmpdata|(1<<sor));
else LCD_DATA_PORT=(tmpdata&~(1<<sor));
LCD_CMD_PORT=DATA_TO_A;
beir();
}
else{
LCD_CMD_PORT=INSTR_TO_B;
beir();
LCD_DATA_PORT=SET_COL | (x-64);
LCD_CMD_PORT=INSTR_TO_B;
beir();
LCD_DATA_DIR=0;
LCD_CMD_PORT=READ_DSP_B;
_delay_us(10);
tmpdata=LCD_DATA_IN;
beir();
LCD_DATA_DIR=0xFF;
LCD_DATA_PORT=SET_COL | (x-64);
LCD_CMD_PORT=INSTR_TO_B;
beir();
if (szin) LCD_DATA_PORT=tmpdata|(1<<sor);
else LCD_DATA_PORT=tmpdata&~(1<<sor);
LCD_CMD_PORT=DATA_TO_B;
beir();
}
}
int main(void)
{
GLCD_Init(WHITE);
_delay_ms(1);
for(j=0;j<8;j++)
for(i=0;i<8;i++){
GLCD_SetPixel(i,j,BLACK);
_delay_ms(500);}
while(1)
{
//TODO:: Please write your application code
}
}