Skocz do zawartości

SAM7-EX256 - obsługa wyświetlacza graficznego


piotr_m

Pomocna odpowiedź

Na zajęciach dostałem zadanie, aby wyświetlić grafikę na wyświetlaczu a na tej grafice tekst. Najpierw tekst normalnie z ramką a później same literki bez ramki.

Mam problem, aby wyświetlić tekst bez ramki.

 

Program główny wygląda następująco:

#include <targets/AT91SAM7.h>
#include "lcd.h"

#define LCD_BACKLIGHT PIOB_SODR_P20 

__attribute__ ((section(".fast")))
void delay(int n) //procedura opoznienia 
{
	volatile int i;

	for(i=3000*n;i>0;i--)
	{
		__asm__("nop");
	}
}

int main()
{
	PMC_PCER=PMC_PCER_PIOB; //wlaczenie urzadzenia we/wy PIOB
	PIOB_OER=LCD_BACKLIGHT; //OUTPUT ENABLE
	PIOB_PER=LCD_BACKLIGHT; //PIO ENABLE 

	InitLCD(); //inicjalizacja LCD
	LCDSettings(); //ustawienie LCD
	LCDClearScreen();
	LCDWrite130x130bmp(); //wyswietlenie BMP (zdef w pliku bmp.h)
	LCDPutStr("Nazwisko", 50, 30, LARGE, BLACK, WHITE );
	
	while(1)
	{
		PIOB_SODR|=LCD_BACKLIGHT;  //ustawienie 1 
	}
	
	return 0;
}

Do wyświetlenia grafiki używam funkcji LCDWrite130x130bmp().

Do wyświetlenia tekstu posługuję się funkcją void LCDPutStr(char *pString, int x, int y, int Size, int fColor, int bColor):

void LCDPutStr(char *pString, int x, int y, int Size, int fColor, int bColor) 
{
	// loop until null-terminator is seen
	while (*pString != 0x00) {
		// draw the character
		LCDPutChar(*pString++, x, y, Size, fColor, bColor);
		// advance the y position
		if (Size == SMALL)
		y = y + 6;
		else if (Size == MEDIUM)
		y = y + 8;
		else
		y = y + 8;
		// bail out if y exceeds 131
		if (y > 131) break;
	}
}

Wywołuje ona funkcję void LCDPutChar(char c, int x, int y, int size, int fColor, int bColor):

void LCDPutChar(char c, int x, int y, int size, int fColor, int bColor) 
{
	extern const unsigned char FONT6x8[97][8];
	extern const unsigned char FONT8x8[97][8];
	extern const unsigned char FONT8x16[97][16];
	int i,j;
	unsigned int nCols;
	unsigned int nRows;
	unsigned int nBytes;
	unsigned char PixelRow;
	unsigned char Mask;
	unsigned int Word0;
	unsigned int Word1;
	unsigned char *pFont;
	unsigned char *pChar;
	unsigned char *FontTable[] = {(unsigned char *)FONT6x8, (unsigned char *)FONT8x8,
		(unsigned char *)FONT8x16};
	// get pointer to the beginning of the selected font table
	pFont = (unsigned char *)FontTable[size];
	// get the nColumns, nRows and nBytes
	nCols = *pFont;
	nRows = *(pFont + 1);
	nBytes = *(pFont + 2);
	// get pointer to the last byte of the desired character
	pChar = pFont + (nBytes * (c - 0x1F)) + nBytes - 1;
	// Row address set (command 0x2B)
	WriteSpiCommand(PASET);
	WriteSpiData(x);
	WriteSpiData(x + nRows - 1);
	// Column address set (command 0x2A)
	WriteSpiCommand(CASET);
	WriteSpiData(y);
	WriteSpiData(y + nCols - 1);
	// WRITE MEMORY
	WriteSpiCommand(RAMWR);
	// loop on each row, working backwards from the bottom to the top
	for (i = nRows - 1; i >= 0; i--) {
		// copy pixel row from font table and then decrement row
		PixelRow = *pChar--;
		// loop on each pixel in the row (left to right)
		// Note: we do two pixels each loop
		Mask = 0x80;
		for (j = 0; j < nCols; j += 2) {
			// if pixel bit set, use foreground color; else use the background color
			// now get the pixel color for two successive pixels
			if ((PixelRow & Mask) == 0)
			Word0 = bColor;
			else
			Word0 = fColor;
			//Mask = Mask >> 1;
			if ((PixelRow & Mask) == 0)
			Word1 = bColor;
			else
			Word1 = fColor;
			//Mask = Mask >> 1;
			// use this information to output three data bytes
			WriteSpiData((Word0 >> 4) & 0xFF);
			WriteSpiData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF));
			WriteSpiData(Word1 & 0xFF);
		}
	}
	// terminate the Write Memory command
	WriteSpiCommand(NOP);
}

 

Chciałbym, aby funkcja LCDPutChar() nie ustawiała pikseli tła, tylko same literki.

Domyślam się, że trzeba zmodyfikować ten fragment:

for (j = 0; j < nCols; j += 2) {
			// if pixel bit set, use foreground color; else use the background color
			// now get the pixel color for two successive pixels
			if ((PixelRow & Mask) == 0)
			Word0 = bColor;
			else
			Word0 = fColor;
			//Mask = Mask >> 1;
			if ((PixelRow & Mask) == 0)
			Word1 = bColor;
			else
			Word1 = fColor;
			//Mask = Mask >> 1;
			// use this information to output three data bytes
			WriteSpiData((Word0 >> 4) & 0xFF);
			WriteSpiData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF));
			WriteSpiData(Word1 & 0xFF);
		}

Uzyskuję efekt jak poniżej, a chciałbym się pozbyć żółtej/niebieskiej ramki. Jak się do tego zabrać?

image.thumb.png.94db5906d86255d31bbd699fe992636c.png 

W załączniku dokumentacja od wyświetlacza.

Nokia 6100 LCD Display Driver.pdf

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.