Файл: Embedded system development and labs for ARM (R. Muresan, 2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.06.2025

Просмотров: 2346

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Embedded Systems Development and Labs; The English Edition

L1

D1

47uH

MBR0540

C8

U1

1

8

22u

nSHDN

VCC

C7

R8

2

7

FOL

LX

3

6

C6

680K

REF

GND

C5

4

5

0.1u

150P

FB

ISET

0.1u

MAX629

R9

R10

39K

100K

C1

C2

C3

C4

0.1u

0.1u

0.1u

0.1u

1

7

8

14

VEE

U2A

U2B

U2C

U2D

4

11

LM324

LM324

LM324

LM324

3

2

5

6

10

9

12

13

R3

R4

R5

R6

R7

VEE

15K

180K

15K

15K

15K

Figure 5-11 Power Supply and Bias Voltage Supply Circuit

2. Software Design

The Lab implementation includes 3 parts: display rectangles, characters and bit maps. 1) A Thought on Design

The basic principle of LCD display is pixel control. The pixel storage and transfer determines the effect obtained on the display. As a result, the graphics can be displayed by controlling the pixels. Storing the pixels in some order can display characters such as ASCII characters, language characters, etc.

Embest ARM development system for pixel control functions are the following: /**************************************************************************

*S3CEV40 LCD pixel display micro definition

*LCD LCD_PutPixel(x, y, c) – Send the pixel to the virtual buffer

*LCD_Active_PutPixel(x, y, c) – Send the pixel to the display buffer (directly drive LCD) /************************************************************************** #define LCD_PutPixel(x, y, c) \

(*(INT32U *)(LCD_VIRTUAL_BUFFER+ (y) * SCR_XSIZE / 2 + ( (x)) / 8 * 4)) = \ (*(INT32U *)(LCD_VIRTUAL_BUFFER+ (y) * SCR_XSIZE / 2 + ( (x)) / 8 * 4)) & \ (~(0xf0000000 >> ((( (x))%8)*4))) |((c) << (7 - ( (x))%8) * 4)

#define LCD_Active_PutPixel(x, y, c) \

(*(INT32U *)(LCD_ACTIVE_BUFFER + (y) * SCR_XSIZE / 2 + (319 - (x)) / 8 * 4)) = \ (*(INT32U *)(LCD_ACTIVE_BUFFER + (y) * SCR_XSIZE / 2 + (319 - (x)) / 8 * 4)) & \ (~(0xf0000000 >> (((319 - (x))%8)*4))) |((c) << (7 - (319 - (x))%8) * 4)

201


Embedded Systems Development and Labs; The English Edition

2) Rectangle Display

The rectangle consists of two horizon lines and two vertical lines. Drawing a rectangle on the LCD is accomplished by calling the line draw function. The line draw function is alternately calling the pixel control function.

3) Character Display

Characters can be displayed using many fonts. The font size is W x H or H x W such as 8 x 8, 8 x 16, 16 x 16, 16 x 24, 24 x 24, etc. The users can make use of different character libraries for displaying different fonts. For example, the Lab system uses the 8 x 16 font to display ASCII characters. In order to display an ASCII character first we have to access the look up predefined character table. This table, used for storing characters, is called ASCII library.

The function call for the ASCII library is:

Const INIT8U g_auc_Ascii8x16[]={ //ASCII table}

The storage of ASCII table is an array that uses the value of ASCII character as its index. The relationship between the width/height and the library will be extracted during the process of the pixel-controlled drawing. The ASCII library consists of 256 ANSI ASCII characters. For detailed information, please refer to the sample programs of the Lab project.

4) Bit Map Display

Bit map display is used to convert a bitmap file into an array and store it in a data structure. Like displaying characters, displaying bit map also needs to be controlled by pixel drawing functions and transfer display data to the display buffer.

The Embest ARM development system provides the following functions that can be used for bit map display: Const INT8U ucMouseMap[] = {//Bit Map File Data}

Bit map display (please refer to the sample program) function is the following:

Void BitmapView(INT16U x, INT16U y, STRU_BITMAP Stru_Bitmap);

Bit map action (please refer to the sample program) functions are the following:

Void BitmapPush(INT16U x, INT16U y, STRU_BITMAP Stru_Bitmap);

Void BitmapPop(INT16U x, INT16U y, STRU_BITMAP Stru_Bitmap);

5.1.6 Operation Steps

(1)Prepare the Lab environment. Connect the Embest Emulator to the target board. Connect the target board UART0 to PC serial port using the serial cable that comes with the Embest development system.

(2)Run the PC Hyper Terminal (set to 115200 bits per second, 8 data bits, none parity, 1 stop bits, none flow control).

(3)Connect the Embest Emulator to the target board. Open the BMP_Display.ews project file in the BMP_Display sub directory of the Example directory. After compiling and linking, connect to the target board

202

Embedded Systems Development and Labs; The English Edition

and download the program.

(4)The hyper terminal should display the followings: Please press on one key on keyboard and look at LED… Embest 44B0X evaluation board (S3CEV40)

LCD display test example (please look at LCD screen)

(5)Watch the LCD screen and you will see many rectangles, ASCII characters, mouse bitmap, etc.

(6)After understanding the details of the lab, finish the Lab exercises.

5.1.7 Sample Programs

1. Initialization Program

/* screen color */

#define M5D(n)

((n) & 0x1fffff)

#define BLACK

0xf

#define WHITE

0x0

/* S3C44B0X LCD control register addresses*/

#define rLCDCON1

(*(volatile unsigned *)0x1f00000)

#define rLCDCON2

(*(volatile unsigned *)0x1f00004)

#define rLCDCON3

(*(volatile unsigned *)0x1f00040)

#define rLCDSADDR1

(*(volatile unsigned *)0x1f00008)

#define rLCDSADDR2

(*(volatile unsigned *)0x1f0000c)

#define rLCDSADDR3

(*(volatile unsigned *)0x1f00010)

#define rREDLUT

(*(volatile unsigned *)0x1f00014)

#define rGREENLUT

(*(volatile unsigned *)0x1f00018)

#define rBLUELUT

(*(volatile unsigned *)0x1f0001c)

#define rDP1_2

(*(volatile unsigned *)0x1f00020)

#define rDP4_7

(*(volatile unsigned *)0x1f00024)

#define rDP3_5

(*(volatile unsigned *)0x1f00028)

#define rDP2_3

(*(volatile unsigned *)0x1f0002c)

#define rDP5_7

(*(volatile unsigned *)0x1f00030)

#define rDP3_4

(*(volatile unsigned *)0x1f00034)

#define rDP4_5

(*(volatile unsigned *)0x1f00038)

#define rDP6_7

(*(volatile unsigned *)0x1f0003c)

#define rDITHMODE

(*(volatile unsigned *)0x1f00044)

/* screen size */

#define MLCD_320_240

(3)

#define LCD_TYPE

MLCD_320_240

#define SCR_XSIZE

(320)

#define SCR_YSIZE

(240)

#define LCD_XSIZE

(320)

203


Embedded Systems Development and Labs; The English Edition

#define LCD_YSIZE

(240)

/* Micro definition*/

#define MODE_GREY16

(16)

#define CLKVAL_GREY16

(12)

#define HOZVAL

(LCD_XSIZE/4-1)

#define LINEVAL

(LCD_YSIZE -1)

#define MVAL

(13)

/* LCD buffer */

#define ARRAY_SIZE_GREY16

(SCR_XSIZE/2*SCR_YSIZE)

#define LCD_BUF_SIZE

(SCR_XSIZE*SCR_YSIZE/2)

#define LCD_ACTIVE_BUFFER (0xc300000)

#define LCD_VIRTUAL_BUFFER (0xc300000 + LCD_BUF_SIZE)

/***********************************************************************

* name:

Lcd_Init()

* func:

Initialize LCD Controller

* para:

none

* ret:

none

*modify:

*comment:

*********************************************************************/

void Lcd_Init(void)

{

rDITHMODE=0x1223a; rDP1_2 =0x5a5a; rDP4_7 =0x366cd9b; rDP3_5 =0xda5a7; rDP2_3 =0xad7; rDP5_7 =0xfeda5b7; rDP3_4 =0xebd7; rDP4_5 =0xebfd7; rDP6_7 =0x7efdfbf;

rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x0<<8)|(0x0<<10)|(CLKVAL_GREY16<<12); rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);

rLCDSADDR1=

(0x2<<27)

|

(

((LCD_ACTIVE_BUFFER>>22)<<21

)

|

M5D(LCD_ACTIVE_BUFFER>>1));

rLCDSADDR2=

M5D(((LCD_ACTIVE_BUFFER+(SCR_XSIZE*LCD_YSIZE/2))>>1))

|

(MVAL<<21);

204

Embedded Systems Development and Labs; The English Edition

rLCDSADDR3= (LCD_XSIZE/4) | ( ((SCR_XSIZE-LCD_XSIZE)/4)<<9 ); // enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,

rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_GREY16<<12); rBLUELUT=0xfa40;

//Enable LCD Logic and EL back-light. rPDATE=rPDATE&0x0e;

}

2. Control Functions

1) Clear Screen Functions

/*****************************************************************

* name:

Lcd_Active_Clr()

* func:

clear virtual screen

* para:

none

* ret:

none

*modify:

*comment:

********************************************************************/

void Lcd_Clr(void)

{

INT32U i;

INT32U *pDisp = (INT32U *)LCD_VIRTUAL_BUFFER;

for( i = 0; i < (SCR_XSIZE*SCR_YSIZE/2/4); i++ )

{

*pDisp++ = WHITE;

}

}

/********************************************************************

* name:

Lcd_Active_Clr()

* func:

clear LCD screen

* para:

none

* ret:

none

*modify:

*comment:

******************************************************************/

void Lcd_Active_Clr(void)

{

INT32U i;

INT32U *pDisp = (INT32U *)LCD_ACTIVE_BUFFER;

205


Embedded Systems Development and Labs; The English Edition

for( i = 0; i < (SCR_XSIZE*SCR_YSIZE/2/4); i++ )

{

*pDisp++ = WHITE;

}

}

2) Draw Line Functions

/***********************************************************************

* name:

Lcd_Draw_HLine()

* func:

Draw horizontal line with appointed color

* para:

usX0,usY0 -- line's start point coordinate

*usX1 -- line's end point X-coordinate

*ucColor -- appointed color value

*usWidth -- line's width

* ret:

none

*modify:

*comment:

********************************************************************/

void Lcd_Draw_HLine(INT16 usX0, INT16 usX1, INT16 usY0, INT8U ucColor, INT16U usWidth)

{

INT16 usLen;

if( usX1 < usX0 )

{

GUISWAP (usX1, usX0);

}

while( (usWidth--) > 0 )

{

usLen = usX1 - usX0 + 1; while( (usLen--) > 0 )

{

LCD_PutPixel(usX0 + usLen, usY0, ucColor);

}

usY0++;

}

}

/*********************************************************************

* name:

Lcd_Draw_VLine()

206

Embedded Systems Development and Labs; The English Edition

* func:

Draw vertical line with appointed color

* para:

usX0,usY0 -- line's start point coordinate

*usY1 -- line's end point Y-coordinate

*ucColor -- appointed color value

*usWidth -- line's width

* ret:

none

*modify:

*comment:

*********************************************************************/

void Lcd_Draw_VLine (INT16 usY0, INT16 usY1, INT16 usX0, INT8U ucColor, INT16U usWidth)

{

INT16 usLen;

if( usY1 < usY0 )

{

GUISWAP (usY1, usY0);

}

while( (usWidth--) > 0 )

{

usLen = usY1 - usY0 + 1; while( (usLen--) > 0 )

{

LCD_PutPixel(usX0, usY0 + usLen, ucColor);

}

usX0++;

}

}

3) Bit Map Display Function

/************************************************************************

* name:

BitmapView()

* func:

display bitmap

* para:

x,y -- pot's X-Y coordinate

*Stru_Bitmap -- bitmap struct

*ret: none

*modify:

*comment:

**********************************************************************/

void BitmapView (INT16U x, INT16U y, STRU_BITMAP Stru_Bitmap)

{

207


Embedded Systems Development and Labs; The English Edition

INT32U i, j;

INT8U ucColor;

for (i = 0; i < Stru_Bitmap.usHeight; i++)

{

for (j = 0; j <Stru_Bitmap.usWidth; j++)

{

if ((ucColor = *(INT8U*)(Stru_Bitmap.pucStart + i * Stru_Bitmap.usWidth + j)) != TRANSPARENCY)

{

LCD_PutPixel(x + j, y + i, ucColor);

}

}

}

}

4) DMA Transfer Display Data Function

/************************************************************************

* name:

Lcd_Dma_Trans()

* func:

dma transport virtual LCD screen to LCD actual screen

* para:

none

* ret:

none

*modify:

*comment:

***********************************************************************/

void Lcd_Dma_Trans(void)

{

INT8U err;

ucZdma0Done=1;

//#define LCD_VIRTUAL_BUFFER

(0xc400000)

//#define LCD_ACTIVE_BUFFER

(LCD_VIRTUAL_BUFFER+(SCR_XSIZE*SCR_YSIZE/2))

//DMA ON

//#define LCD_ACTIVE_BUFFER

LCD_VIRTUAL_BUFFER

//DMA OFF

//#define LCD_BUF_SIZE

(SCR_XSIZE*SCR_YSIZE/2)

//So

the

Lcd

Buffer

Low

area

is

from

LCD_VIRTUAL_BUFFER

to

(LCD_ACTIVE_BUFFER+(SCR_XSIZE*SCR_YSIZE/2)) rNCACHBE1=(((unsigned)(LCD_ACTIVE_BUFFER)>>12)

<<16 )|((unsigned)(LCD_VIRTUAL_BUFFER)>>12); rZDISRC0=(DW<<30)|(1<<28)|LCD_VIRTUAL_BUFFER; // inc

208