Grafikus LCD

Hogyha sikeresen O/PLED illetve hagyományos alfanumerikus - esetleg tán grafikus kijelzővel gyűlik meg a baja valakinek:)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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.

:(
Avatar
solti_imre
DrótVégénSzéndarab
Hozzászólások: 22
Csatlakozott: 2010. december 2. csütörtök, 7:00

Hozzászólás Szerző: solti_imre »

kapu48 írta:De hamar elmentél!! ???
Hamar??? Tegnap látástól mikulásig a monitor előtt ültem! :-)
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.
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.

Ismételten nagyon köszönöm a segítséged, további jó hétvégét Neked!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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:

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
És a módosítót rutin „glcdKS108.lib” -ben:

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]
Remélem segítség lesz ez a kis módosítás!
:)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. november 23. péntek, 20:33-kor.
Avatar
joeharry
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2009. június 29. hétfő, 6:00

.bgf fájl

Hozzászólás Szerző: joeharry »

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.
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Szia!
Próbálj meg kisebb képet kirakni előbb.
Ha ez is torzul, akkor a konverternél a 6-8 váltót próbáld átváltani és a SED-et. Elvileg KS108-nál SED config van (annál meg létezik 6-bites logikai karakter is).
BMP szabványos? (én paint-el szoktam bizergálni).
JAni
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Milyen Bascom verzió?
Milyen AVR?
Avatar
joeharry
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2009. június 29. hétfő, 6:00

Hozzászólás Szerző: joeharry »

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!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szerintem még az m128def.dat 1384 sorból: PWM1B=$8A
is törölnöd kellene!
:wink:

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

8)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Bascomból a 2.0.7.5 a legfrissebb...
Avatar
onexer
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2009. július 18. szombat, 6:00

Re: Grafikus LCD

Hozzászólás Szerző: onexer »

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
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Re: Grafikus LCD

Hozzászólás Szerző: winnerbt »

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
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

Hozzászólás Szerző: holex »

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:

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 
    }
}
Van valakinek ötlete, hogy miért nem csinál semmit? A vezérlőchip KS0108
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

Hozzászólás Szerző: holex »

Közben rájöttem, hogy a szimulátorban pont fordított logikával működött a CS.
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

Hozzászólás Szerző: holex »

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?
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Grafikus LCD

Hozzászólás Szerző: holex »

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 
    }
}
Válasz küldése