【M4开发板Hanker试用狂】ddllxxrr之二:HELLO EEWORLD
[复制链接]
Stellaris 系列 M3/M4 之所以强大 , StellarisWare 软件库提供的快速软件开发解决方案功不可没 。 作为 TI StellarisWare 库的一部分 , StellarisWare 图形库提供了一套比较完整的 MCU 图形显示方案 , 即可以进行图形 、 文字的绘制 , 也可以轻松实现在 PC 机上常见的基于事件响应的控件。伴随着 Stellaris LM4F 系列的推出, StellarisWare 图形库也将进一步升级,内置汉字字库。ellarisWare 图形库,为我们的 MCU 世界增加更多美丽的应用 。
Stellaris 图形库分成了三层,分别是:
(1) 显示驱动层 (Display Driver Layer)
(2) 基本图形层 (Graphics Primitives Layer)
(3) 控件层 (Widget Layer)
显示驱动层提供了和硬件通信的基本功能,这层直接和硬件直接通信。提供了两类驱动,一个是图形输出驱动、第二个是用户输入驱动。分层的好处是方便移置。只动最底层而不用动高层。
(唉!干活地总是最下边的人!)
下边是最底层的数据结构:
//*****************************************************************************
//
//! This structure defines the characteristics of a display driver.
//
//*****************************************************************************
typedef struct
{
//
//! The size of this structure.
//
long lSize;
//
//! A pointer to display driver-specific data.
//
void *pvDisplayData;
//
//! The width of this display.
//
unsigned short usWidth;
//
//! The height of this display.
//
unsigned short usHeight;
//
//! A pointer to the function to draw a pixel on this display.
//
void (*pfnPixelDraw)(void *pvDisplayData, long lX, long lY,
unsigned long ulValue);
//
//! A pointer to the function to draw multiple pixels on this display.
//
void (*pfnPixelDrawMultiple)(void *pvDisplayData, long lX, long lY,
long lX0, long lCount, long lBPP,
const unsigned char *pucData,
const unsigned char *pucPalette);
//
//! A pointer to the function to draw a horizontal line on this display.
//
void (*pfnLineDrawH)(void *pvDisplayData, long lX1, long lX2, long lY,
unsigned long ulValue);
//
//! A pointer to the function to draw a vertical line on this display.
//
void (*pfnLineDrawV)(void *pvDisplayData, long lX, long lY1, long lY2,
unsigned long ulValue);
//
//! A pointer to the function to draw a filled rectangle on this display.
//
void (*pfnRectFill)(void *pvDisplayData, const tRectangle *pRect,
unsigned long ulValue);
//
//! A pointer to the function to translate 24-bit RGB colors to
//! display-specific colors.
//
unsigned long (*pfnColorTranslate)(void *pvDisplayData,
unsigned long ulValue);
//
//! A pointer to the function to flush any cached drawing operations on
//! this display.
//
void (*pfnFlush)(void *pvDisplayData);
}
tDisplay;
我们要用时只要给这个结构赋值就行:
const tDisplay g_slcd_320x240_ili932x =
{
sizeof(tDisplay),
0,
#if defined(PORTRAIT) || defined(PORTRAIT_FLIP)
LCD_VERTICAL_MAX,
LCD_HORIZONTAL_MAX,
#else
LCD_HORIZONTAL_MAX,
LCD_VERTICAL_MAX,
#endif
lcd_ili932x_pixel_draw,
lcd_ili932x_pixel_draw_multiple,
lcd_ili932x_line_draw_hor,
lcd_ili932x_line_draw_ver,
lcd_ili932x_rect_fill,
lcd_ili932x_color_translate,
lcd_ili932x_flush
};
底层定义后,要初始化一下,就是把参数传进去。
这里用了:GrContextInit(&g_sContext, &g_sLcdDisplay);这就是声明一下上下文。
而g_sContext 在程序的前边声明为:tContext g_sContext;
g_sLcdDisplay 也是在前边定义为:#define g_sLcdDisplay g_slcd_320x240_ili932x
可以知道就是定义的底层声明。
下边工作简单了:就是直接调用库中的函数就行了。
GrContextForegroundSet(&g_sContext,ClrLightCoral);
这句实际就是把g_sContext这个绘制上下文的前景颜色设置为ClrLightCoral。
颜色参考如下:
字体设置也是一样的道理。字体参考如下:
如我想设置为g_sFontCmss36i这种字体,那么我们只需要写一句:
GrContextFontSet(&g_sContext, &g_sFontCmss36i);这样就在g_sContext这个上下文中设置好了绘制的字体。
现在我们开始绘制。 调用函数void GrStringDraw(const tContext *pContext, const char *pcString, long lLength, long lX, long lY, unsigned long bOpaque);
形参意义如下: pContext:图形绘制的上下文。 *pcString,:要绘制的字符串指针 long lLength:要绘制的字符串长度,如果全部绘制的话那么设置为-1. long lX, long lY,为绘制的起始坐标。 bOpaque:这个参数决定了在绘制的时候是否绘制背景色。
以下是程序:它实现了HELLO EEWORLD 及DDLLXXRR的显示。
int
main(void)
{
FPUEnable();
FPULazyStackingEnable();
// Set the system clock to run at 50MHz from the PLL
Clock_Init();
//
GUI_Init();
GUI_Display_Heading("Hello Eeworld Demo");
GrContextForegroundSet(&g_sContext,ClrLightCoral);
GrContextBackgroundSet(&g_sContext,ClrWhite);
GrContextFontSet(&g_sContext, &g_sFontCmss36i);
DpyColorTranslate(&g_sLcdDisplay,ClrWhite);//清屏
//写字符
GrStringDraw(&g_sContext,"hello eeworld!",-1,10,120,true);
GrStringDraw(&g_sContext,"ddllxxrr",8,50,250,1);
lcd_ili932x_flush(&g_sContext);
//设置前景色
GrContextForegroundSet(&g_sContext,ClrLime);
//画填充圆
GrCircleFill(&g_sContext,250,60,50);
//设置前景色
GrContextForegroundSet(&g_sContext,ClrDarkOrange);
//画填充圆
GrCircleFill(&g_sContext,50,190,40);
// Set the touch screen event handler.
// Touch_Callback_Set(WidgetPointerMessage);
// Add the compile-time defined widgets to the widget tree.
//WidgetAdd(WIDGET_ROOT, (tWidget *)&g_sBntEqu);
// Paint the widget tree to make sure they all appear on the display.
//WidgetPaint(WIDGET_ROOT);
//WidgetMessageQueueProcess();
GUI_Bcaklight_On();
//GUI_Reflush();
//Touch_Init();
// Enable Interrupts
//IntMasterEnable();
// Loop forever, processing widget messages.
while(1)
{
// Process any messages from or for the widgets.
// WidgetMessageQueueProcess();
}
}
由于出差刚回照相机没到位,晚上上图哈!!!
压缩文件:
hello eeworld.rar
(614.01 KB, 下载次数: 167)
上图:
[ 本帖最后由 ddllxxrr 于 2012-6-5 18:04 编辑 ]
|