Transcript
Page 1: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 1 页

AN1136

引言

在普通设备上,图形界面的使用越来越广泛。在我们的日常活动中,越来越多的产品都已具备某种形式的图形界面。这种特征正在成为事实上的标准,这就使得以更低成本制造这些设备的需求变得很明显。 PIC® 单片机——在低风险产品开发、低系统总体成本解决方案以及快速上市方面享有盛誉——使得这一切成为可能。免费的 Microchip 图形库使得在应用中集成图形功能变得非常容易。本应用笔记将详细说明,如何使用 16 位单片机和图形库驱动支持 16 位色的 QVGA 显示器。

有关 PIC24F 系列单片机的详细信息,请参考《PIC24FJ128GA010 系列数据手册》(DS39747A_CN)。关于图形库 API 的细节,请参考包含在图形库安装程序中的“Microchip Graphics LibraryAPI”文档。

图形库概述

Microchip 的图形库针对范围宽广的显示设备控制器,设计为与PIC单片机配合使用;图形库提供应用编程接口(API),完成基本图形对象以及类似控件对象的绘制。 图形库也使得通过消息接口集成输入设备变得容易。 如果需要的话,使用图形库开发的应用程序也可以找到简单、直接的方法来改变显示设备。图形库的分层结构设计使得所有这一切成为可能。 Microchip 图形库的层次结构如图 1 所示。

图 1: 使用 MICROCHIP 图形库的典型系统

作者: Paolo TamayoAnton AlkhimenokMicrochip Technology Inc.

显示设备驱动程序(DDD)

(即PutPixel和GetPixel)

图形加速器

(可选)

绘绘图图函函数数11

((即即33DD按按钮钮))

绘绘图图函函数数22

((即即进进度度条条))

绘绘图图函函数数NN

应用层

消消息息接接口口

器件驱动程序层

图形元素函数

(非加速线、圆、条和输出文本等)

图形元素层

图形对象层

……

键盘

触摸屏鼠标

图形显示模块

应用 相关

通用 模块

设备 相关

如何使用 Microchip 图形库中的控件

Page 2: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 2页 2007 Microchip Technology Inc.

应用层是使用图形库的程序。图形对象层 (GraphicsObject Layer, GOL)生成控件,例如按钮、滑动条和窗口等等。在本文档中,控件(widget)指 GOL 对象或其他对象。 为了控制这些对象,GOL层具有一个消息

接口,接收从应用层来的消息。消息接口支持大量的输入设备,例如键盘、侧按钮、触摸屏和鼠标等。图形元素层实现基本绘图功能。这些基本功能完成图形对象的绘制,例如线、条和圆等。 显示设备驱动程序是图形库

结构的设备相关层。这一层直接与显示设备控制器对话。 对于每一种显示控制器,应单独开发对应的驱动程序。 Microchip 图形库提供了一系列显示控制器的驱动

程序,作为显示设备驱动层的一部分。如果选择的显示控制器不在此列,在使用图形库时,唯一的变动部分是开发或修改显示设备驱动程序。这样的机制使得图形库能够在显示设备之间进行移植。大量的 API 允许应用程

序访问图形库的任何一层。绘图和消息处理在内部进行,对应用程序保持透明。

图形库提供了两种配置(阻塞式和非阻塞式),在编译时进行设置。对于阻塞式配置,绘图函数将延迟程序的执行,直到绘图完成。对于非阻塞式配置,绘图函数不等待绘图完成,就把控制权释放给程序。因为程序能执行其他任务,而不必等待绘图任务完成绘制,从而使得单片机时间的使用更为高效。非阻塞式配置在系统具备硬件图形加速器和DMA时更有优势。从应用程序的角度

看,阻塞和非阻塞式配置的设置是透明的。

GOL控件使得创建复杂图形用户界面变得便捷而快速。

图形库 1.0 版支持下列各项:

1. 按钮

2. 滑动条

3. 窗口

4. 复选框

5. 单选按钮

6. 编辑框

7. 列表框

8. 组合框

9. 水平 / 垂直滚动条

10. 进度条

11. 静态文本

12. 图片

13. 仪表盘

14. 仪表

对于每种对象的描述请参考“Microchip GraphicsLibrary API”文档。

Page 3: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 3 页

AN1136对象状态

GOL 对象有两种类型的状态:属性状态和绘图状态 。属

性状态定义对象的行为和外观。而绘图状态指出在显示时对象是否需要被隐藏、部分重画或完全重画,一些常用的属性状态和绘图状态如表 1 所示。

每个对象有它自己唯一的属性和绘图状态。每种对象的状态请参考 API 文档。

表 1: 常用的对象状态

式样方案

所有对象都使用式样方案来定义所使用的字体和颜色。在创建对象时,对象可以使用用户定义的式样方案。如果不存在用户定义的方案,就将使用缺省的式样方案。表 2 概括了式样方案的组成部分。

表 2: 式样方案的组成

状态 类型 说明

OBJ_FOCUSED 属性 对象处在聚焦状态。通常用于表示对象被选中。有的对象没有此属性。

OBJ_DISABLED 属性 对象被禁止,忽略全部的消息。

OBJ_DRAW_FOCUS 绘图 聚焦应被重画的对象。

OBJ_DRAW 绘图 对象应被完全重画。

OBJ_HIDE 绘图 使用共同的背景色填充对象所占有的区域,把对象隐藏起来。这种状态在所有绘图状态中,优先级 高。当对象被设置成隐藏时,所有其他绘图状态将不再产生作用。

式样的组成部分 说明

EmbossDkColor 暗浮雕颜色,用于对象的三维效果。

EmbossLtColor 亮浮雕颜色,用于对象的三维效果。

TextColor0TextColor1

对象使用的一般文本颜色。随着对象的不同,在用法上可能有所变化。

TextColorDisabled 已经被禁止的对象所使用的文本颜色。

Color0Color1

对象绘制时使用的一般颜色。随着对象的不同,在用法上可能有所变化。

ColorDisabled 已经被禁止的对象绘制时使用的颜色。

CommonBkColor 对象的共同背景色。通常用于从屏幕中隐藏对象。

pFont 指向对象所使用的字体的指针。有些对象不使用文本。

Page 4: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 4页 2007 Microchip Technology Inc.

当对象处于禁止状态时,使用 TextColorDisabled 和ColorDisabled。否则,就使用 TextColor0、TextColor1、Color0 和 Color1。如果对象绘图状态被设定为隐藏,使用 CommonBkColor 填充对象所占据的区域。

使用式样方案带来的好处是:每种对象能被赋予一个唯一的式样方案。类型相同的两个或多个对象可以使用相同的式样方案。这样,在不同的应用程序中,为所使用的对象定制外观时,就拥有了一定的灵活性。

活动对象链表

图形库把当前正在显示和接收消息的对象放入一个链表中。任何时候,GOL 消息和绘图函数针对的都是这张链

表中的对象。新创建的对象将被自动地添加到当前链表中去。应用程序可以拥有多个对象链表,但在同一时刻,只能有一个对象链表处于活动状态。对于多重链表,从一个链表到另一个链表的切换管理将由应用程序来承担。这种机制,使得应用程序可以把每个链表当作显示页来处理,这也使得显示页的管理更为容易。在屏幕上只显示活动链表中的对象。关于此主题的细节请参阅“Microchip Graphics Library API” 。

绘图

为 了 绘 制 对 象,应 用 程 序 将 调 用 绘 图 管 理 器,

GOLDraw()。这个函数将解析活动链表,使用设置的绘图状态重画对象。当绘制完成后,对象的绘图状态自动清除。 先创建的对象将首先绘出。当前链表中的对象全部绘出后,GOLDraw() 调用 GOLDrawCallback()

函数。定制的绘图可以在 GOLDrawCallback() 函数中实现。

消息的接收和发送

可移植性是图形库的关键特性。图形库支持大量的输入设备。 图形库提供一个接口,用来接收来自输入设备的消息。所有的输入设备事件,都将采用 GOL 消息结构

体的方式发送到库里去。结构体定义如下:

例 1:

字段 type 定义输入设备的类型 ID。字段 event 表明行为的类型。字段 type 和 event 一道决定 param1 和param2 将被如何解释。某些情况下,仅使用 param1,而另一些情况下可能两个参数字段都需要。

为了说明GOL_MSG的用法,让我们以触摸屏模块为例。

GOL_MSG字段的定义如表 3:

表 3: 触摸屏消息定义

当屏幕被触摸时,应用程序必须先填充消息结构体,然

后把它传送给库中的消息处理函数 GOLMsg(GOL_MSG*pMsg)。对象(包括它的 x、y 位置),将根据目前的状态和事件,改变其状态。针对输入设备事件而定制的行为,可以放在 GOLMsgCallback() 函数中。一旦有对象收到有效的消息,这个函数就会被调用。

字段 说明

Type TYPE_TOUCHSCREEN

Event 可能的事件 ID 如下:EVENT_INVALIDEVENT_MOVEEVENT_PRESSEVENT_RELEASE

param1 触摸位置的 x 坐标

param2 触摸位置的 y 坐标

typedef struct {BYTE type;BYTE event;int param1;int param2;

} GOL_MSG;

Page 5: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 5 页

AN1136

图形库用法

图形库的设计,旨在使图形接口能够无缝地集成到应用程序中去。而使用已经定义好的对象,只需要极少量的编码。使用图形库提供的 API,可以很容易地创建、管理和消灭对象。通常,对象行为是通过图形库来进行管理的。通过使用前已述及的消息机制,这一切将更为方便。把收到的消息进行处理,根据消息的内容,改变受影响的对象状态。然后,图形库自动地重画对象,显示状态的改变。

图 2 展示的是使用图形库的简单流程。假定用户接口模块和显示驱动程序已被选择和加载,那么只需要 少量的编码。首先,调用 InitGraph(),复位显示设备控制器,把光标位置移动到 (0,0) ,然后初始化显示器成

全黑状态。接下来,调用 GOLCreateScheme(),定义用于对象的式样方案。如果式样方案无需改动的话,就使用默认的式样方案。在这种情况下,调用函数GOL_Init() 即可,它可完成 InitGraph() 和GOLCreateScheme()函数实现的功能。

图 2: 图形库使用的基本流程

初始化图形

创建式样方案

创建对象

绘制对象

获得用户输入

处理用户消息

GOL Init()

InitGraph()

GolCreateScheme()

ObjCreate( , , )

GOLDraw()

消息结构体

GOLMsg()

1

2

3

4

5

6

Page 6: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 6页 2007 Microchip Technology Inc.

如果要创建新的式样方案,下面的示例代码段说明如何设置颜色:

例 2:

下一步是创建要使用的对象。ObjCreate( , , )函

数表明要创建多个对象。这也可以是一条单独的BtnCreate( , , ) 调用,创建一个按钮对象;或者,

也可以是创建各种对象的若干函数调用。例如,要创建三个对象(两个按钮和一个滑动条),可以执行如下啊的 ObjCreate() 函数调用:

例 3:

图 2 中 ObjCreate() 代表了所有这些函数调用, Obj替换成 Btn 表示按钮,替换成 Sld表示滑动条。每种对

象在图形库里都有它自己的 ObjCreate() 函数。创建新对象后,创建函数返回一个指向新创建对象的指针。如果为对象分配内存失败,则回 NULL。如果内存分配

成功,新创建的对象将被自动地添加到前已述及的链表中去。

在对象创建之后,调用 GOLDraw() 函数绘制对象。

GOLDraw() 函数解析活动对象链表,检查对象的绘图状态。如果有任何对象的绘图状态被设置而且没有得到处理,就将重绘对象。比如,对于按钮而言,绘图状态是 BTN_DRAW,对滑动条而言则是 SLD_DRAW。在函数

GOLDraw()绘制对象后,它将复位未处理的绘图状态。

GOL_SCHEME* altScheme; // 声明替代式样方案

altScheme = GOLCreateScheme(); // 创建替代式样方案

altScheme->TextColor0 = BLACK; //设置文本颜色 0altScheme->TextColor1 = BRIGHTBLUE; //设置文本颜色 1

BtnCreate( ID_BTN1, // 第一个按钮的 ID20, 160, 150, 210, // 对象的尺寸大小

BTN_DRAW, // 设置对象的状态:

// 绘制对象 NULL, // 不使用位图

"LEFT", // 使用此文本

NULL); // 使用缺省的式样方案

BtnCreate( ID_BTN2, // 第二个按钮的 ID170, 160, 300, 210,BTN_DRAW,NULL,"RIGHT",NULL);

SldCreate( ID_SLD1, // 滑动条的 ID20, 105, 300, 150, // 对象的尺寸大小

SLD_DRAW, // 设置对象的状态: // 绘制对象

100, // 范围

5, // 步进增量 50, // 初始位置

NULL); // 使用缺省的式样方案

Page 7: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 7 页

AN1136对象状态的改变可通过输入设备来进行,如键盘、侧按

钮以及触摸屏等。在示例中,我们假设是触摸屏。只要用户在屏幕上有任何动作,触摸屏模块就会填充消息结构体。在图 2 的流程图中,表示为带阴影的任务框(步骤 5)。然后,通过调用 GOLMsg() 函数,图形库将对消息进行处理(图 2 中步骤 6)。 所有的对象将被解析,检查谁将会受到消息的影响。 受影响的对象将对消息进行处理,并根据消息里指明的行为改变对象状态。为了表明这种状态改变, 将再次调用 GOLDraw(),而这将使用新的状态来绘制对象。触摸时,按钮将会显示按压和释放动作;在触摸和移动时,滑动条将滑动它的滑动块。

应用集成

使用图形界面的主要目的 , 始终是要试图改善和增强用

户对设备的体验。除了使产品看上去更酷以外,对于用户操作的设备而言,图形界面还为用户提供了更多的操控能力、更好的反馈。比如,在居家安保系统中,可以用触摸屏显示来代替小键盘,从而能够减少按键(可能只需要两个按键, ON 和 OFF 即可)。这样,不仅不再需要复杂的按键和粗糙的字符显示,而且还能提供更多的功能,诸如状态、启动与设定等,从而进一步增强了系统的运用。其他例子见诸于居家自动化、工业控制和医疗设备等应用领域,图形显示中可以集成若干设备的控制,诸如电机、泵、压缩机和温度传感器等等。

这些外部设备的控制怎样才能集成到图形界面中去?如何控制电机的转速?如何实现实现数字小键盘? 下面

的章节将给出修改象行为、集成外部设备控制的简单步骤。通过回调函数的使用,我们将看到如何改变对象行为、如何设置控制外部设备的变量。

同时,我们还将能看到,如何使用 少的代码通过触摸

屏完全地操控三个对象。在某些情况下,要实现应用程序的意图,缺省的对象行为并不够。图形库提供了相关能力,可以增加高级的对象控制和行为,还能够把对象集成到应用程序中去,以便控制外部模块,如电机或LED 等。下一节将讨论这些高级主题。

涉及消息的用户定义动作

在前面的例子里,说明了如何使用很少量代码来创建和绘制对象。使用触摸屏模块时,对象的状态能被更改。

在应用程序中,我们如何使用功能性的对象?此外,我们如何改变对象的缺省行为?同样地为简单起见,将使用同样的例子,但将扩充代码,增加对象状态的中间处理代码。假设滑动条表示一个要加以控制的物理设备

(如电机转速)。除了滑动条基于滑动块的控制外,我们还希望有两个按钮,以固定的步长移动滑动条。“LEFT”按钮将使滑动条滑动块向左移动,“RIGHT”按钮将使滑动条滑动块向右移动。由于创建滑动条时步进增量设定为 5,每按一次按钮将使滑动条位置增加或减小 5 个单位。

图 3: 根据消息定制动作的示例

LEFT RIGHT

Page 8: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 8页 2007 Microchip Technology Inc.

为 了 实 现 这 样 的 功 能,要 使 用 消 息 回 调 函 数

GOLMsgCallback()。只 要 对 象 收 到 有 效 消 息,GOLMsg()函数就将调用回调函数。

例如,按下 ID 为 ID_BTN1的按钮,即,用户在屏幕上按钮图形所在位置按了一下。触摸屏模块检测到用户动作。应用层填充 GOL_Msg结构体(例 1),并调用消息处理函数 GOLMsg()。

为了处理这条消息, GOLMsg()解析对象链表,找到受影响的对象,然后调用 GOLMsgCallback()函数。 应用程序在这里有两个选择:或者定制事件行为,或者改变对象状态。从编码的角度看,应用程序能够决定GOLMsgCallback()返回0还是1。如果返回1,就执行

缺省的动作,改变受影响对象的状态。 如果返回的是0,

应用程序接受对象状态的任何改变,但不执行缺省的动作。 GOLDraw() 将对那些绘图状态改变的对象进行绘制。 在 GOLMsgCallback() 函数中,应用程序将接收到三个参数:未处理的 GOL 消息,已转换的消息以及指向对象的指针。未处理的 GOL 消息是一个指针,指向由

输入设备模块填充的原消息结构体。指向受到消息影响对象的指针,使得应用程序能够获得对象的所有信息并控制其状态。已转换的消息是一个由图形库返回的数字,它表明:对于受影响的对象,发生了何种事件。已转换的消息随对象的不同而不同。对于在演示代码中使用的两个对象,表 4 概略地对已转换消息进行了说明。

表 4: 滑动条和按钮的已转换消息 对象 已转换消息 说明

按钮 BTN_MSG_PRESSEDBTN-MSG_RELEASED

在按钮上设置当前用户动作。

滑动条 SLD_MSG_INCSLD_MSG_DEC

它们指出滑动块的移动方向。 对于垂直和水平方向,滑动条能以正负方向移动。

注: 要了解所有对象的已转换消息,请查阅 API 文档。

Page 9: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 9 页

AN1136回到例子中来。要使用按钮移动滑动条的滑动块,可以在消息回调函数中编写如下代码:

例 4:

这表明滑动条的绘图状态发生了改变。使用按钮,我们已经改变了滑动条的行为。每次按下按钮时,按钮 1 减小滑动条滑动块的位置,而按钮 2 则增大滑动块的位置。 消息回调函数始终返回 1,这样将执行按钮的缺省

动作,从而能够显示触摸屏的按下和释放效果,滑动条也将执行其缺省动作(把滑动块移动到触摸区域)。

WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){WORD objectID;SLIDER *pSldObj;

}

// 获得当前需要处理对象的 IDobjectID = GetObjID(pObj);

// 检查是消息是否来自第一个按钮if (objectID == ID_BTN1) {

// 消息来自第一个按钮

// 检查按钮是否被按下

// objMsg是来自对象的已转换消息if (objMsg == BTN_MSG_PRESSED) {

// 按钮被按下,减小滑动块的位置 // 获取滑动条指针,滑动条的识别码是 ID_SLD1pSldObj = (SLIDER*)GOLFindObject(ID_SLD1);

// 滑动块位置减小,减小的量是滑动条的当前步进增量SldDecPos(pSldObj);

//设置滑动块的重绘状态,以便反映出新的位置SetState(pSldObj, SLD_DRAW_THUMB);

}}

// 检查消息是否是来自第二个按钮if (objectID == ID_BTN2) {

// 消息来自第二个按钮

// 检查按钮是否被按下if (objMsg == BTN_MSG_PRESSED) {

// 按钮被按下,增大滑动块的位置 // 获取滑动条指针,滑动条的识别码是 ID_SLD2pSldObj = (SLIDER*)GOLFindObject(ID_SLD2);

// 滑动块位置增大,增大的量是滑动条的当前步进增量SldIncPos(pSldObj);

// 设置滑动块的重绘状态,以便反映出新的位置SetState(pSldObj, SLD_DRAW_THUMB);

}}

//这里,我们必须返回 1,以便更新按钮 (按下和释放效果)return 1;

Page 10: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 10页 2007 Microchip Technology Inc.

作为对象属性状态改变的例子,按钮按下和释放时,按钮的行为发生改变。 图 4 显示的是左按钮按下时的改变。按钮的表面将绘制位图,而文字LEFT则向右移动,给位图腾出地方。当按钮释放时,位图的外观回到图 3

所示的那样。 在当右边按钮按下和释放时,其属性将展示相似的变化。为了实现这种属性改变,消息回调函数应作如下修改:

图 4: 按钮改变

LEFT RIGHT LEFT

Page 11: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 11 页

AN1136例 5:

只要按钮被按下,这两个按钮的文本就将向左或向右对

齐, 这就改变了按钮的属性状态。另外,只要按钮被按下,按钮就将显示红色箭头的位图(详情请参阅附录A:“源代码”中例 A-2)。

// 对于要使用的位图,要作外部声明

extern BITMAP_FLASH redRightArrow;extern BITMAP_FLASH redLeftArrow;

WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){WORD objectID;SLIDER *pSldObj;

objectID = GetObjID(pObj);

if (objectID == ID_BTN1) {if (objMsg == BTN_MSG_PRESSED) {

// 设置要显示的位图

BtnSetBitmap(pObj, &redLeftArrow); // 文本设置为右对齐

SetState(pObj, BTN_TEXTRIGHT);pSldObj = (SLIDER*)GOLFindObject(ID_SLD1);SldDecPos(pSldObj);SetState(pSldObj, SLD_DRAW_THUMB);

}else {

//移去位图

BtnSetBitmap(pObj, NULL);// 在中间放置文本 ClrState(pObj, BTN_TEXTRIGHT);

}}

if (objectID == ID_BTN2) {if (objMsg == BTN_MSG_PRESSED) {

// 设置要显示的位图 BtnSetBitmap(pObj, &redRightArrow);// 文本设置为左对齐

SetState(pObj, BTN_TEXTLEFT);pSldObj = (SLIDER*)GOLFindObject(ID_SLD1);SldIncPos(pSldObj);SetState(pSldObj, SLD_DRAW_THUMB);

}else {

// 移去位图

BtnSetBitmap(pObj, NULL);// 在中间放置文本

ClrState(pObj, BTN_TEXTLEFT);}

}

return 1;}

Page 12: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 12页 2007 Microchip Technology Inc.

定制绘图

某些情况下,还需要在屏幕上添加定制的图形。如果图形库中没有对象能够提供所需图形的话,那么定制的图形通常要通过绘制来实现。有这样一个直观的例子,在应用程序中,使用一系列位图或简单图形来显示若干系统变量。在绘制用户定制图形时一个很重要的问题,是要保证图形库对象的绘制不能与定制图形的绘制发生冲突。 当 GOLDraw()绘制对象时,可能要设置一些绘图

参数,如当前使用的颜色、线的类型、线的大小、图形的光标位置和裁减区域等。 如果正在绘制某些对象时,

定制图形又对这些参数进行设置的话,就可能会导致不能正确地绘制出对象。图形库为应用程序进行定制图形的绘制提供了地方:定制图形的绘制必须放在函数GOLDrawCallback()中进行。

当活动链表中所有对象都已绘制完成时, GOLDraw()

将调用 GOLDrawCallback()。在这个函数内部,颜色、裁减区域、线类型和图形显示光标等,都能被定制绘图修改。回调函数可以选择把绘图控制返回给GOLDraw()。如果回调函数返回0,活动链表中 GOL对象的绘制将暂停。如果返回的是 1, GOLDraw() 将继续检查活动链表中对象的状态改变,对那些需要更新的对象进行绘制。

回到我们的例子,假定还有一个应用程序定义的图形对

象。对象通过一系列的矩形条来表示等级控制。当滑动条的值增大时(滑动块的位置向右移动),绘制矩形条,表示值的增大。当滑动条的值减小时 (滑动块的位置向

左移动),擦除相应的矩形条。图 5 显示了这个用户定义的图形对象。

图 5: 滑动条控制的用户定义对象

使用GOLDrawCallback()函数,将确保用户对象的绘

制不会影响到图形库对象的绘制。为了绘制等级控制,修改 GOLDrawCallback()函数,使之包含如下代码:

Page 13: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 13 页

AN1136例 6:

WORD value, y, x;// 滑动条位置变量

static WORD prevValue = 0;// 存放滑动条的原有值

if (update) {/* 用户定义的图形: 绘制一系列矩形条 (条形图),显示滑动条滑动块的值 /位置。矩形条的高度遵循抛物线方程

"(y-k)^2 = 4a(x-h),顶点 (k, h)在屏幕上位于 (60,100)。 4*a的值是常数 110。 x & y 根据滑动条滑动块的值来计算。矩形条的绘制范围在 x轴上是从 60到 260,在 y轴上是从 10到 100。 矩形条宽为 4象素,相互间隔为 6象素。

只绘制那些要添加或擦除的矩形条。这可能需要额外的计算。然而,这将致使数据的移动量显著减小。 于是,总体上看,定制图形的绘制更加高效。 */// 检查滑动条的值value = SldGetPos(pSld);

// 如果新值小于原有值,则擦除对应的矩形条SetColor(BLACK) if (value < prevValue) {

while (prevValue > value) {// 获取要擦除的矩形条的高度y = (prevValue*prevValue)/110;

// 矩形条宽为 4象素,相互间距为 6象素x = (prevValue*2);x = x - (x%6);

// 绘制黑色矩形条图,覆盖(从而擦除)目前绘制的矩形条Bar(x+60,100-y, x+64,100);// 减去 3,因为矩形条绘制的间隔是 6象素prevValue -= 3;

}}// 如果新值大于原有值,则绘制对应的矩形条else {

while (prevValue < value) {// 设置要绘制矩形条的颜色if (prevValue < 60) {

SetColor(BRIGHTGREEN); } else if ((prevValue < 80) && (prevValue >= 60)) {

SetColor(BRIGHTYELLOW); } else if (prevValue >= 80) {

SetColor(BRIGHTRED); }// 获取要绘制矩形条的高度y = (prevValue*prevValue)/110;

// 矩形条宽为 4象素,相互间距为 6象素x = (prevValue*2);x = x - (x%6);

// 绘制矩形条,显示值的增大Bar(x+60,100-y, x+64,100);// 增加 3,因为矩形条绘制的间隔是 6象素prevValue += 3;

}}// 在绘制或擦除矩形条之后, prevValue的值就是当前值//复位更新标志update = 0;

} return 1;}

Page 14: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 14页 2007 Microchip Technology Inc.

还要修改主函数代码,对于新的全局滑动条指针,增加其初始化代码。

例 7:

添加全局变量 update,仅仅是为了在需要时刷新条形图

(当按钮按下或滑动条移动时)。从而,如果消息不影响屏幕上的对象,绘图回调函数就会立刻返回 1。本例完整的代码清单见附录 A:“源代码”中的例 A-3。

编译选项

图形库提供的编译选项,可能会影响应用程序或系统需求。 为了节约程序存储空间占用,一些未用代码可能被

移除。例如,可能会移除未使用的控件或输入设备(触摸屏和小键盘等)。如果在显示控制器中有硬件加速器的话,可以通过修改显示驱动程序代码、禁止图形元素层代码,启用硬件加速器。关于编译选项的细节请参考

“Microchip Graphics Library API”文档。

// 全局变量声明

SLIDER *pSld; // 滑动条指针,全局变量

WORD update; // 图形更新标志,全局变量

// 在主函数代码中,修改滑动条的创建代码,增加用户图形更新标志初始化代码

pSld = SldCreate(ID_SLD1, // 滑动条 ID20, 105, 300, 150, // 对象的尺寸大小

SLD_DRAW, // 设置对象的状态:绘制对象

100, // 范围

5, // 步进增量 50, // 初始位置

NULL); // 使用默认的式样方案

update = 1; // 初始化用户图形更新标志

Page 15: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 15 页

AN1136

项目文件

项目文件的完整清单和目录结构,请参考 microchip 图

形库,可以在www.microchip.com/graphics中找到图形库。安装图形库时,也将安装本应用笔记中给出的示例。图形库安装后,目录结构与下面所列相似:

Microchip SolutionsAN1136 DemoMicrochip

GraphicsDocumentsUtilities

IncludeGraphics

本文档中叙述的演示应用程序的源代码,存放在子目录AN1136 Demo 中。这个目录可以作为项目目录,可以

添加应用程序代码,也可以与图形库一道被编译。Microchip 子目录下存放的是图形库的各组成部分。Graphics子目录存放C文件、文档和实用程序。Include子目录包含子目录 Graphics,其中有图形库的头文件。不要修改 Microchip 子目录下的任何子目录或文件。如果你的项目使用的 Microchip 库解决方案超过一个,这

个目录将包含你所安装的所有库文件。因而,维护这个目录里的文件就很重要。

Microchip Solution目录可以成为你的MyProjects目录,你的项目——用到各种 Microchip 解决方案的所有项目

——都可以放在此目录下。

小结

免费的 Microchip 图形库,针对的是 PIC 单片机。它为那些在界面中需要控件进行控制的应用程序提供了立等可用的对象。图形库的结构使得库独立于所使用的显示硬件,仅仅需要创建或修改一个设备驱动文件即可。这样,从一个显示设备移植到另一个显示设备将变得更加容易。消息机制的实现,也使得大量输入设备的集成更加方便。希望把图形界面集成到应用程序中的开发人员,必然会注意到图形库将如何缩短使用 PIC 单片机的

产品推向市场的时间。

Page 16: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 16页 2007 Microchip Technology Inc.

附录 A:源代码

A.1 示例

下面的示例说明在应用程序中如何使用 Microchip 图形库例程。

A.1.1 示例 1本示例展示的是图形库中 GOL 对象的一种非常简单的用法。示例中,将创建并绘制三个对象。假定有触摸屏界面,用

户在触摸屏上操作对象。假定图形库需要的所有其他头文件均已包括在项目里。

Page 17: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 17 页

AN1136例 A-1:

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

#define ID_BTN1 10#define ID_BTN211#define ID_SLD112

GOL_SCHEME* altScheme; // 声明替代的式样方案

int main(void){

GOL_MSG msg; // 与 GOL交互的 GOL消息结构体

TouchInit(); // 初始化触摸屏GOLInit(); // 初始化图形库并创建 GOL的缺省式样方案

altScheme = GOLCreateScheme(); // 创建替代的式样方案altScheme->TextColor0 = BLACK; // 设置文本颜色 0altScheme->TextColor1 = BRIGHTBLUE; // 设置文本颜色 1

BtnCreate( ID_BTN1, // 第一个按钮的 ID20, 160, 150, 210, // 对象的尺寸大小BTN_DRAW, // 设置对象状态:绘制对象 NULL, // 不使用位图"LEFT", // 使用此文本NULL); // 使用缺省的式样方案

BtnCreate( ID_BTN2, // 第二个按钮的 ID170, 160, 300, 210,BTN_DRAW,NULL,"RIGHT",NULL);

SldCreate( ID_SLD1, // 滑动条的 ID20, 105, 300, 150, // 对象的尺寸大小SLD_DRAW, // 设置对象状态:绘制对象 100, // 范围5, // 步进增量50, // 初始位置NULL); // 使用缺省的式样方案

while(1){

if (GOLDraw()){ // 绘制 GOL对象TouchGetMsg(&msg); // 获取来自触摸屏的消息GOLMsg(&msg); // 处理消息

}}

}

// 必须定义回调函数,返回值为 1,即便它们未被使用WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){

return 1;}

WORD GOLDrawCallback(){return 1;

}

Page 18: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 18页 2007 Microchip Technology Inc.

A.1.2 示例 2本示例修改了例 A-1 的 GOLMsgCallback()函数。修改后,滑动条滑动块的移动能被两个按钮控制,并且当按钮按下时将显示图像。

例 A-2:

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

// 使用的位图,应作外部声明

extern BITMAP_FLASH redRightArrow;extern BITMAP_FLASH redLeftArrow;

WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg){WORD objectID;SLIDER *pSldObj;

objectID = GetObjID(pObj);

if (objectID == ID_BTN1) {if (objMsg == BTN_MSG_PRESSED) {

// 设置要显示的位图

BtnSetBitmap(pObj, &redLeftArrow); // 文本设置为右对齐

SetState(pObj, BTN_TEXTRIGHT);pSldObj = (SLIDER*)GOLFindObject(ID_SLD1);SldDecPos(pSldObj);SetState(pSldObj, SLD_DRAW_THUMB);

}else {

//移去位图

BtnSetBitmap(pObj, NULL);// 在中间放置文本 ClrState(pObj, BTN_TEXTRIGHT);

}}

if (objectID == ID_BTN2) {if (objMsg == BTN_MSG_PRESSED) {

// 设置要显示的位图 BtnSetBitmap(pObj, &redRightArrow);// 文本设置为左对齐

SetState(pObj, BTN_TEXTLEFT);pSldObj = (SLIDER*)GOLFindObject(ID_SLD1);SldIncPos(pSldObj);SetState(pSldObj, SLD_DRAW_THUMB);

}else {

// 移去位图

BtnSetBitmap(pObj, NULL);// 在中间放置文本

ClrState(pObj, BTN_TEXTLEFT);}

}

return 1;}

Page 19: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 19 页

AN1136A.1.3 示例 3本示例对例 A-1 的 GOLMsgCallback()函数进行了修改,滑动条滑动块的移动控制作用户定义图形的绘制——用户定义图形表示着等级值。消息回调函数和例 A-2 相同。

例 A-3:

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

#define ID_BTN1 10#define ID_BTN2 11#define ID_SLD1 12

// 使用的位图,应作外部声明extern BITMAP_FLASH redRightArrow;extern BITMAP_FLASH redLeftArrow;

GOL_SCHEME* altScheme; // 声明替代的式样方案

// 全局变量声明SLIDER *pSld; // 滑动条指针,全局变量WORD update; // 更新标志,全局变量

int main(void){GOL_MSG msg; // 与 GOL交互的 GOL消息结构体

TouchInit(); // 初始化触摸屏GOLInit(); // 初始化图形库并创建 GOL 的缺省式样方案

altScheme = GOLCreateScheme(); // 创建替代的式样方案altScheme->TextColor0 = BLACK; // 设置文本颜色 0altScheme->TextColor1 = BRIGHTBLUE; // 设置文本颜色 1

BtnCreate( ID_BTN1, // 第一个按钮的 ID20, 160, 150, 210, // 对象的尺寸大小BTN_DRAW, // 设置对象状态:绘制对象NULL, // 不使用位图"LEFT", // 使用此文本NULL); // 使用缺省的式样方案

BtnCreate( ID_BTN2, // 第二个按钮的 ID170, 160, 300, 210,BTN_DRAW,NULL,"RIGHT",NULL);

SldCreate( ID_SLD1, // 滑动条的 ID20, 105, 300, 150, // 对象的尺寸大小SLD_DRAW, // 设置对象状态:绘制对象 100, // 范围5, // 步进增量50, // 初始位置NULL); // 使用缺省的式样方案

update = 1; // 初始化用户图形更新标志while(1){

if (GOLDraw()) { // 绘制 GOL对象TouchGetMsg(&msg); // 获取来自触摸屏的消息GOLMsg(&msg); // 处理消息

}}

}

Page 20: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

AN1136

DS01136A_CN 第 20页 2007 Microchip Technology Inc.

示例 A-3: (续)

WORD GOLDrawCallback(){

WORD value, y, x;// 滑动条位置变量 static WORD prevValue = 0;// 存放滑动条的原有值

if (update) {/* 用户定义的图形: 绘制一系列矩形条 (条形图),显示滑动条滑动块的值 /位置。矩形条的高度遵循抛物线方程

"(y-k)^2 = 4a(x-h),顶点 (k, h)在屏幕上位于 (60,100), 4*a的值是常数 110。 x & y 根据滑动条滑动块的值来计算。矩形条的绘制范围在 x轴上是从 60到 260,在 y轴上是从 10到 100。 矩形条宽为 4象素,相互间隔为 6象素。

只绘制那些要添加或擦除的矩形条。这可能需要额外的计算。然而,这将致使数据的移动量显著减小。 于是,总体上看,定制图形的绘制更加高效。 */// 检查滑动条的值value = SldGetPos(pSld);

// 如果新值小于原有值,则擦除对应的矩形条 SetColor(BLACK) if (value < prevValue) {

while (prevValue > value) {// 获取要擦除的矩形条的高度y = (prevValue*prevValue)/110;

// 矩形条宽为 4象素,相互间距为 6象素x = (prevValue*2);x = x - (x%6);

// 绘制黑色矩形条图,覆盖(从而擦除)目前绘制的矩形条Bar(x+60,100-y, x+64,100);// 减去 3,因为矩形条绘制的间隔是 6象素prevValue -= 3;

}}// 如果新值大于原有值,则添加对应的矩形条else {

while (prevValue < value) {// 设置要绘制矩形条的颜色if (prevValue < 60) {

SetColor(BRIGHTGREEN); } else if ((prevValue < 80) && (prevValue >= 60)) {

SetColor(BRIGHTYELLOW); } else if (prevValue >= 80) {

SetColor(BRIGHTRED); }// 获取要绘制矩形条的高度y = (prevValue*prevValue)/110;

// 矩形条宽为 4象素,相互间距为 6象素x = (prevValue*2);x = x - (x%6);

// 绘制矩形条,显示值的增大Bar(x+60,100-y, x+64,100);// 递增 3,因为矩形条绘制的间隔是 6象素prevValue += 3;

}}

}// 在绘制或擦除矩形条之后, prevValue的值就是当前值//复位更新标志update = 0;

} return 1;}

Page 21: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 21 页

AN1136

提供本文档的中文版本仅为了便于理解。请勿忽视文档中包含

的英文部分,因为其中提供了有关 Microchip 产品性能和使用

情况的有用信息。Microchip Technology Inc. 及其分公司和相

关公司、各级主管与员工及事务代理机构对译文中可能存在的任何差错不承担任何责任。建议参考 Microchip TechnologyInc. 的英文原版文档。

本出版物中所述的器件应用信息及其他类似内容仅为您提供便

利,它们可能由更新之信息所替代。确保应用符合技术规范,是您自身应负的责任。Microchip 对这些信息不作任何明示或

暗示、书面或口头、法定或其他形式的声明或担保,包括但不

限于针对其使用情况、质量、性能、适销性或特定用途的适用性的声明或担保。 Microchip 对因这些信息及使用这些信息而

引起的后果不承担任何责任。如果将 Microchip 器件用于生命

维持和 / 或生命安全应用,一切风险由买方自负。买方同意在

由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障Microchip 免于承担法律责任,并加以赔偿。在 Microchip 知识

产权保护下,不得暗中或以其他方式转让任何许可证。

商标

Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron、dsPIC、KEELOQ、KEELOQ 徽标、microID、MPLAB、PIC、PICmicro、 PICSTART、 PRO MATE、 rfPIC 和 SmartShunt均为 Microchip Technology Inc. 在美国和其他国家或地区的

注册商标。

AmpLab、 FilterLab、 Linear Active Thermistor、 Migratable Memory、 MXDEV、 MXLAB、 SEEVAL、 SmartSensor 和The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标。

Analog-for-the-Digital Age、 Application Maestro、CodeGuard、 dsPICDEM、 dsPICDEM.net、 dsPICworks、dsSPEAK、 ECAN、 ECONOMONITOR、 FanSense、FlexROM、 fuzzyLAB、 In-Circuit Serial Programming、ICSP、 ICEPIC、Mindi、MiWi、MPASM、MPLAB Certified徽标、MPLIB、MPLINK、PICkit、PICDEM、PICDEM.net、PICLAB、 PICtail、 PowerCal、 PowerInfo、 PowerMate、PowerTool、 REAL ICE、 rfLAB、 Select Mode、 Smart Serial、SmartTel、Total Endurance、UNI/O、WiperLock 和ZENA 均为 Microchip Technology Inc. 在美国和其他国家或地

区的商标。

SQTP 是 Microchip Technology Inc. 在美国的服务标记。

在此提及的所有其他商标均为各持有公司所有。

© 2007, Microchip Technology Inc. 版权所有。

请注意以下有关 Microchip 器件代码保护功能的要点:

• Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。

• Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中 安全的产品之一。

• 目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的操

作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。

• Microchip 愿与那些注重代码完整性的客户合作。

• Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是“牢不可破”的。

代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视

为违反了《数字器件千年版权法案(Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的软

件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。

Microchip 位于美国亚利桑那州 Chandler 和 Tempe 与位于俄勒冈州Gresham 的全球总部、设计和晶圆生产厂及位于美国加利福尼亚州和印度的设计中心均通过了 ISO/TS-16949:2002 认证。公司在 PIC®

MCU 与 dsPIC® DSC、KEELOQ® 跳码器件、串行 EEPROM、单片机外设、非易失性存储器和模拟产品方面的质量体系流程均符合 ISO/TS-16949:2002。此外, Microchip 在开发系统的设计和生产方面的质量体系也已通过了 ISO 9001:2000 认证。

Page 22: GOL - ww1.microchip.comww1.microchip.com/downloads/cn/AppNotes/01136A_CN.pdf · 2007 Microchip Technology Inc. DS01136A_CN 第3 页 AN1136 对象状态 GOL 对象有两种类型的状态:属性状态和绘图状态

2007 Microchip Technology Inc. DS01136A_CN 第 22 页

美洲公司总部 Corporate Office2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 1-480-792-7200 Fax: 1-480-792-7277技术支持:http://support.microchip.com网址:www.microchip.com亚特兰大 AtlantaDuluth, GA Tel: 678-957-9614 Fax: 678-957-1455波士顿 BostonWestborough, MA Tel: 1-774-760-0087 Fax: 1-774-760-0088芝加哥 ChicagoItasca, IL Tel: 1-630-285-0071 Fax: 1-630-285-0075达拉斯 DallasAddison, TX Tel: 1-972-818-7423 Fax: 1-972-818-2924底特律 DetroitFarmington Hills, MI Tel: 1-248-538-2250Fax: 1-248-538-2260科科莫 KokomoKokomo, IN Tel: 1-765-864-8360Fax: 1-765-864-8387洛杉矶 Los AngelesMission Viejo, CA Tel: 1-949-462-9523 Fax: 1-949-462-9608

圣克拉拉 Santa ClaraSanta Clara, CA Tel: 408-961-6444Fax: 408-961-6445加拿大多伦多 TorontoMississauga, Ontario, CanadaTel: 1-905-673-0699 Fax: 1-905-673-6509

亚太地区

亚太总部 Asia Pacific OfficeSuites 3707-14, 37th FloorTower 6, The GatewayHarbour City, KowloonHong KongTel: 852-2401-1200Fax: 852-2401-3431中国 - 北京Tel: 86-10-8528-2100 Fax: 86-10-8528-2104

中国 - 成都Tel: 86-28-8665-5511Fax: 86-28-8665-7889

中国 - 福州Tel: 86-591-8750-3506 Fax: 86-591-8750-3521

中国 - 香港特别行政区Tel: 852-2401-1200 Fax: 852-2401-3431

中国 - 南京Tel: 86-25-8473-2460Fax: 86-25-8473-2470

中国 - 青岛Tel: 86-532-8502-7355 Fax: 86-532-8502-7205

中国 - 上海Tel: 86-21-5407-5533 Fax: 86-21-5407-5066

中国 - 沈阳Tel: 86-24-2334-2829 Fax: 86-24-2334-2393

中国 - 深圳Tel: 86-755-8203-2660 Fax: 86-755-8203-1760

中国 - 顺德Tel: 86-757-2839-5507 Fax: 86-757-2839-5571

中国 - 武汉Tel: 86-27-5980-5300 Fax: 86-27-5980-5118

中国 - 西安Tel: 86-29-8833-7252 Fax: 86-29-8833-7256

台湾地区 - 高雄Tel: 886-7-536-4818Fax: 886-7-536-4803

台湾地区 - 台北Tel: 886-2-2500-6610 Fax: 886-2-2508-0102

台湾地区 - 新竹Tel: 886-3-572-9526Fax: 886-3-572-6459

亚太地区

澳大利亚 Australia - SydneyTel: 61-2-9868-6733 Fax: 61-2-9868-6755

印度 India - BangaloreTel: 91-80-4182-8400 Fax: 91-80-4182-8422

印度 India - New DelhiTel: 91-11-4160-8631Fax: 91-11-4160-8632

印度 India - PuneTel: 91-20-2566-1512Fax: 91-20-2566-1513

日本 Japan - YokohamaTel: 81-45-471- 6166 Fax: 81-45-471-6122韩国 Korea - DaeguTel: 82-53-744-4301Fax: 82-53-744-4302

韩国 Korea - SeoulTel: 82-2-554-7200 Fax: 82-2-558-5932 或82-2-558-5934

马来西亚 Malaysia - KualaLumpurTel: 60-3-6201-9857Fax: 60-3-6201-9859

马来西亚 Malaysia - PenangTel: 60-4-227-8870Fax: 60-4-227-4068

菲律宾 Philippines - ManilaTel: 63-2-634-9065Fax: 63-2-634-9069新加坡 SingaporeTel: 65-6334-8870 Fax: 65-6334-8850

泰国 Thailand - BangkokTel: 66-2-694-1351Fax: 66-2-694-1350

欧洲奥地利 Austria - WelsTel: 43-7242-2244-39Fax: 43-7242-2244-393丹麦 Denmark-CopenhagenTel: 45-4450-2828 Fax: 45-4485-2829法国 France - ParisTel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79德国 Germany - MunichTel: 49-89-627-144-0 Fax: 49-89-627-144-44意大利 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781荷兰 Netherlands - DrunenTel: 31-416-690399 Fax: 31-416-690340西班牙 Spain - MadridTel: 34-91-708-08-90Fax: 34-91-708-08-91英国 UK - WokinghamTel: 44-118-921-5869Fax: 44-118-921-5820

全球销售及服务网点

10/05/07


Top Related