Файл: 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