Skocz do zawartości
piotr_m

SAM7-EX256 - obsługa wyświetlacza graficznego

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

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×