版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专业实验嵌入式系统实验指导书2025年3月王恒编-PAGE7-实验一嵌入式系统ARM驱动编程一、实验目的1.熟悉ARM环境,学会ARM仿真器的使用。使用ADS编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。2.掌握非嵌入式操作系统模式下的ARM编程。3.了解LCD基本概念与原理,熟悉用ARM内置的LCD控制器驱动LCD,掌握延时函数的使用方法,可以设计动态ARM程序。二、实验内容(2学时)1.本次实验使用ADS集成开发环境。学习ARM仿真器的使用和开发环境的设置。下载已经编译好的文件到嵌入式控制器中运行。学会在程序中设置断点,观察系统内存和变量,为调试应用程序打下基础。2.学习LCD显示器的基本原理,理解其驱动控制方法。掌握两种LCD驱动方式的基本原理和方法。并用编程实现控制LCD显示的ARM程序。三、预备知识C语言的基础知识、程序调试的基础知识和方法。四、实验设备及工具硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机。软件:PC机操作系统Win2000、ARMADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序五、实验原理1.ARM程序的在线仿真与调试ADS1.2可以进行ARM程序的编写和调试。打开ADS1.2的编辑界面后,可以以工程的方式编写和组织源代码。执行菜单Project|Make可对工程进行编译连接。在出现的错误/警告窗口中选择某错误/警告信息,ADS会自动打开相应源文件并用箭头指向出错的文本行。如果某个源文件被修改,重新编译时ADS会自动同步各文件的日期信息。ARM程序调试步骤如下:(1)在ADS中执行菜单Project|Debug启动ADS1.2的调试工具AXD。(2)在AXD中执行菜单Options|ConfigureTarget对AXD进行设置。如图1B-13所示。选择ADP即远程调试,点Configure按钮进一步设置具体参数,如图1B-14所示。(3)在图1B-14中点Select按钮选择远程连接为ARMethernetdriver,点Configure按钮输入仿真器的IP地址。如果用户使用的是并行口仿真器,请输入127.0.0.1即可。(4)等待程序装载完毕以后,通过Execute|Go菜单以及Execute|Stop(或者工具栏中的相应按钮)运行或暂停程序。程序暂停后在窗口中将显示出程序暂停的位置。(5)通过Execute|Step菜单(或者工具栏中的相应按钮)可以单步运行程序。也可以使用StepIn、StepOut菜单命令进入或者跳出函数的调用。RunToCursor命令运行到光标位置。(6)程序停止后可以通过ProcessorViews|Sources菜单查看源文件,并可在适当位置按F9设置端点。(7)使用在ProcessorView菜单下的Registers、Variables和Memory命令可以查看工作寄存器或者内存变量。可以逐一地尝试,以方便对程序进行调试。2.LCD的驱动方法市面上出售的LCD有两种驱动类型:一种是带有驱动电路的LCD显示模块,这种LCD可以方便地与各种低档单片机进行接口,如8051系列单片机,但是由于硬件驱动电路的存在,体积比较大。这种模式常常使用总线方式来驱动。另一种是LCD显示屏,没有驱动电路,需要与驱动电路配合使用。特点是体积小,但却需要另外的驱动芯片。也可以使用带有LCD驱动能力的高档MCU驱动,如ARM系列的S3C44BOX。S3C44B0X中具有内置的LCD控制器,它具有将显示缓存(在系统存储器中)中的LCD图象数据传输到外部LCD驱动电路的逻辑功能。S3C44B0X中内置的LCD控制器可支持灰度LCD和彩色LCD。在灰度LCD上,使用基于时间的抖动算法(time-basedditheringalgorithm)和FRC(FrameRateControl)方法,可以支持单色、4级灰度和16级灰度模式的灰度LCD。在彩色LCD上,可以支持256级彩色。对于不同尺寸的LCD,具有不同数量的垂直和水平象素、数据接口的数据宽度、接口时间及刷新率,而LCD控制器可以进行编程控制相应的寄存器值,以适应不同的LCD显示板。与ARM自带LCD驱动器有关的寄存器可参见S3C44B0X的数据手册。3.延时函数与嵌入式系统的主函数写法voidDelay(inttime)函数可以实现延时功能,(注意函数名中的字母D是大写),其中参数time是设定的延时值,单位为0.1ms。例如延时1s,可以调用:Delay(10000);即可实现。该延时函数的精度比较高,是采用S3C44B0X芯片内部的定时器来实现定时功能的。嵌入式系统的主函数一般是一个永不结束或返回的函数。在程序结构上,写成一个大循环。永远循环的两种写法:while(1){循环内容;}或for(;;){循环内容}LCD显示配合延时功能,可以实现各种动画功能。例如一个实现两幅图不停的切换的程序框架如下:main(){ 开发板及必要的初始化;while(1){ LCD_Cls();//清屏画第一幅图;LCD_Refresh();//刷新屏幕,只有调用该函数液晶屏才会真正显示所画内容;Delay(20000);//延时2sLCD_Cls();//清屏 画第二幅图;LCD_Refresh();Delay(20000);}}如果画面重画的速度比较快(例如每秒切换24张),人眼就不会看到重画过程,从而形成动画。清屏函数例子:voidLCD_Cls(){intx,y;for(x=0;x<320;x++)for(y=0;y<240;y++)LCDBuffer[y][x]=0x0;}六、实验步骤1.将“Exp1LCD驱动控制实验”整个文件夹复制到自己所建的目录下,将其改为英文名(ADS对中文目录的支持不好),然后双击exp1.mcp文件,便可以打开工程。2.查看LCD的驱动文件,包括(1)有关常量与宏(lcd320.h,lcd320.c)#defineLCDWIDTH320#defineLCDHEIGHT240U32*pLCDBuffer16=(U32*)0xc000000;//一级缓存指针U32LCDBuffer[LCDHEIGHT][LCDWIDTH];//二级缓存将其定义为32位是为了与RGB颜色兼容。(2)查看LCD初始化函数(lcd320.c):设置各功能寄存器,清空显示缓存区。(3)查看LCD刷新函数(lcd320.c)。此函数主要是将二级缓存LCDBuffer的数据由32位彩色图形信息转换成8位256色的图形信息,然后放到pLCDBuffer16指向的一级缓存。转换公式:pixcolor=(pbuf[0]&0xe0)|((pbuf[1]>>3)&0x1c)|(pbuf[2]>>6)。其中,pbuf[0]、pbuf[1]、pbuf[2]是一个象素的32位彩色数据的前24位,分别代表R、G、B。(4)查看主函数(main.c)在LCD上显示256色图形的关键是填充二级显示缓冲,将显示象素的24位颜色信息写入LCDBuffer。将RGB三种基本颜色按一定比例混合即可构成更复杂的颜色,每个象素的三种基本颜色分别占一个字节,可以方便的在程序里改写各基本颜色的数值,从而改变该象素的混合颜色。例如向位于(x,y)坐标的像素填充红色,对应代码为:LCDBuffer[x][y]=0xe0;屏幕的左上角为坐标原点,x轴向右依次增加到320,y轴向下依次增加到240.3.将示例程序下载到开发板上,调试并查看程序运行结果。4.在消化吸收示例程序的main.c文件的基础上,按照老师的现场要求,修改或重写main.c文件中的main函数,编写自己的ARM程序,实现LCD显示和ARM动态程序设计。5.编译、下载与调试自编程序。七、思考题1)ARM程序在线调试时主要进行哪些设置?2)写出ARM程序设计中main函数常用的程序框架。
实验二嵌入式操作系统程序设计一、实验目的1.了解µC/OS-Ⅱ内核的主要结构。2.掌握µC/OS-Ⅱ程序设计的基本方法。3.学习使用嵌入式系统绘图的API函数。理解绘图设备上下文(DC)在多任务操作系统中的作用。会使用绘图设备上下文(DC)在屏幕上绘制一个圆角矩形和一个圆。了解绘制动画防止闪烁的基本原理,可以实现无闪烁的动画。4.学习使用系统的消息循环。掌握如何通过系统的消息循环来响应键盘任务的消息,同时学会使用图形模式下的液晶屏文字显示函数。二、实验内容(4学时)1.学习µC/OS-Ⅱ的编程方法。2.编写几个简单任务,在超级终端上观察任务的切换。3.通过使用嵌入式系统的绘图API函数,首先,在屏幕上绘制一个圆角矩形和一个整圆。然后,再在屏幕上无闪烁的绘制一个移动的正弦波。4.通过使用消息队列接收键盘任务发出的按键消息,并把对应按键的字符显示在液晶屏和PC机的终端上。三、预备知识1.掌握在ADS1.2集成开发环境中编写和调试程序的基本过程。2.了解ARM7处理器的结构。3.了解µC/OS-Ⅱ系统结构。四、实验设备及工具硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机。软件:PC机操作系Win2000、ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。五、实验原理(一)µC/OS-Ⅱ程序编写基础为了使µC/OS-Ⅱ可以正常运行,硬件初始化和配置文件也是必须的。STARTUP目录下的文件还包括中断处理,时钟,串口通信等基本功能函数。在文件main.c中给出了应用程序的基本框架,包括初始化和多任务的创建,启动等。在µC/OS-Ⅱ中创建一个任务的步骤如下:1)在程序开头定义任务堆栈,任务函数声明和任务优先级:OS_STKTaskName_Stack[STACKSIZE]={0,};//任务堆栈voidTaskName(void*Id);//任务函数#defineTaskName_PrioN//任务优先级2)在main()函数中调用OSStart()函数之前用下列语句创建任务:OSTaskCreate(TaskName,(void*)0,(OS_STK*)&TaskName_Stack[STACKSIZE-1],TaskName_Prio);OSTaskCreate()函数的原型是:INT8UOSTaskCreate(void(*task)(void*pd),void*p_arg,OS_STK*ptos,INT8Uprio);需要将任务函数TaskName,任务堆栈TaskName_Stack,任务优先级TaskName_Prio三个参数传给OSTaskCreate()函数。根据任务函数的内容决定堆栈大小,宏STACKSIZE定义为4KB,可以在此基数上乘倍。任务优先级越高,TaskName_Prio值越小;µC/OS-Ⅱ可以管理64个任务,由OSInit()创建的空闲任务的优先级最低为63;µC/OS-Ⅱ保留4个最高和4个最低优先级,用户任务可以使用其余56个优先级值。3)编写任务函数内容:voidTaskName(void*Id){//添入任务初始化语句for(;;){//添入任务循环内容OSTimeDly(SusPendTime);//挂起一定时间,以使其他任务可以占用CPU}}µC/OS-Ⅱ至少要有一个任务,这里首先创建一个系统任务SYS_Task,其中由语句OSRunning=TRUE;//使能µC/OS-Ⅱ运行uHALr_InstallSystemTimer();启动系统时钟和多任务切换。为了验证µC/OS-Ⅱ多任务切换的进行,再编写两个简单的任务,分别在超级终端上输出runtask1和runtask2。可以参考main.c的结构创建多个不同功能的任务,观察个任务的切换。(二)完善的µC/OS-Ⅱ开发框架需要说明的是,µC/OS-Ⅱ作为一个实时操作系统只提供了多任务调度等基本功能,这在实际应用中显然是不够的。除了移植好的操作系统内核部分,还必须有文件系统,全部硬件的驱动程序,图形API,控件函数,综合提高的消息函数以及几个系统必须的基本任务,象键盘,触摸屏,LCD刷新等。有了这些,µC/OS-Ⅱ才能实现复杂的功能。特殊需求的地方还需要像USB通信协议,TCP/IP协议等更复杂的软件模块。实验系统提供的µC/OS-Ⅱ库文件中包含了上述大部分功能,基于库的开发变的非常简单,在基本的程序框架下应用实验系统提供的丰富API函数即可。实际开发中,用户的工程中无需包括µC/OS-Ⅱ的源代码,只需要包括库文件即可。当然,用户也可以了解库中部分代码的源文件,可以根据自己的需求就行重新编译,也可以对自己的一系列源文件生成一个专门的库,方便自己后续工作。µC/OS-Ⅱ的开发中,应用程序和操作系统是绑在一起编译的,所生成的system.bin文件是唯一的可执行文件,其中包括了所需要的µC/OS-Ⅱ代码和被用到的驱动程序等函数代码,以及应用程序的代码。system.bin文件是存放在平台的16MFLASH中的,在系统启动时由BIOS依靠文件系统从FLASH中读入到SDRAM中,然后把控制转移到该代码上,完成所谓的引导。而BIOS是存储在另外的ROM中的。本实验提供了基于库的µC/OS-Ⅱ开发框架,可以打开工程进行了解。图3-3是ADS环境下看到的该框架的文件组成,还可以展开各目录查看更多的文件信息。图3-3ADS下框架文件构成可以看出,STARTUP下的都是最基本的硬件初始化和配置文件;Ucos_lib.a是ADS环境下的库;SRC是用户编写的工程文件;µC/OS-Ⅱ下都是系统用到的头文件,其中ADD下是添加的基本系统任务和消息函数的相关头文件。INC下主要是硬件驱动程序的头文件。Init下的几个文件是ADS环境下配置存储器及堆栈的,和µC/OS-Ⅱ无直接关系。打开Main.c文件,可以看到一个应用工程的基本框架,在这个实验中,所谓的应用很简单,就是在LCD上显示“Helloworld!”,大部分代码都是框架。用户可以在这些代码的基础上进行应用开发,创建新任务,编写必要的函数。当然,如果针对特定的项目有相对独立并集中的一些函数则最好新建源文件和头文件,以方便管理,这些用户新建的源文件可以放到SRC目录下,在编译环境下用AddFiles命令加入对应位置。下面是Main()函数中的内容:intmain(void){ARMTargetInit();//开发板初始化OSInit();//操作系统初始化uHALr_ResetMMU();//复位MMULCD_Init();//初始化LCD模块LCD_printf("LCDinitializationisOK\n");//向液晶屏输出数据initOSGUI();//初始化图形界面LoadFont();//调Unicode字库LoadConfigSys();//使用config.sys文件配置系统设置LCD_printf("CreatetaskonµC/OS-Ⅱ...\n");OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);//创建系统任务OSAddTask_Init();//创建系统附加任务LCD_printf("StartingµC/OS-Ⅱ...\n");LCD_printf("Enteringgraphmode...\n");LCD_ChangeMode(DspGraMode);//变LCD显示模式为图形模式InitRtc();//初始化系统时钟Nand_Rw_Sem=OSSemCreate(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件OSStart();//操作系统任务调度开始//不会执行到这里return0;}main()函数中调用了必要的初始化函数,创建了系统任务和用户任务,然后启动系统任务调度。建议用户不要改动该函数中的初始化过程,但可以按本实验第一部分所述的任务创建方法来创建更多的任务,注意每个任务必须具有不同的优先级。(三)绘图的API函数请查阅附录API函数,在Display.h中定义了和绘图显示有关的数据类型和函数原型。在µC/OS-Ⅱ系统环境下,绘图必须通过使用绘图设备上下文(DC)来实现。绘图设备上下文(DC)中包括了与绘图相关的信息,比如:画笔的宽度、绘图的原点等等。这样,在多任务系统中,不同的任务通过不同的绘图设备上下文(DC)绘图才不会互相影响。绘图设备上下文(DC)的结构定义如下:typedefstruct{intDrawPointx;intDrawPointy;//绘图所使用的坐标点intPenWidth;//画笔宽度U32PenMode;//画笔模式COLORREFPenColor;//画笔的颜色intDrawOrgx;//绘图的坐标原点位置intDrawOrgy;intWndOrgx;//绘图的窗口坐标位置intWndOrgy;intDrawRangex;//绘图的区域范围intDrawRangey;structRECTDrawRect;//绘图的有效范围U8bUpdataBuffer;//是否更新后台缓冲区及显示U32Fontcolor;//字符颜色}DC,*PDC与绘图设备上下文(DC)有关的函数有:initOSDC()用来初始化系统的DC,为DC动态内存开辟空间;CreateDC()和DestoryDC(PDCpdc)分别用来创建和删除DC,前者返回所创建的DC指针,后者则释放DC的内存空间。和绘图有关的函数有TextOut(),LineTo(),FillRect(),Circle(),ShowBmp()等常见的图形函数,用户可以查看附录API函数显示部分,尝试使用这些函数。在µC/OS-Ⅱ操作系统中,液晶显示屏的刷新是通过Lcd_Fresh_Task任务完成的,该任务是在系统附加任务初始化函数OSAddTask_Init()中定义的,该函数开辟了LCD刷新任务,触摸屏任务,键盘任务等。绘图首先是在绘图缓冲区中完成的,然后系统自动(也可以通过设置绘图设备上下文参数,不让系统自动刷新)向Lcd_Fresh_Task发送更新消息。其流程图如图4-1所示:图4-1绘图流程因为绘图是在后台进行的,绘制完成之后,再更新到液晶屏上,所以,在绘图的时候不用担心反覆的擦除屏幕会引起屏幕的闪烁,这样,可以很方便的实现动画无闪烁的显示。绘制完一次图形以后,必须要使用OSTimeDly()给出一定时间的延时(推荐用200),同时使Main_Task任务主动让出对CPU的控制权,使Lcd_Fresh_Task任务可以完成刷新。(四)图形系统的消息循环通常在多任务操作系统中,任务之间的通讯是通过发送消息来实现的。消息队列是µC/OS-Ⅱ操作系统的一种通信机制,它可以使一个任务或者中断服务程序向另一个任务发送以指针方式定义的变量。µC/OS-Ⅱ操作系统提供了若干对消息队列进行操作的函数,例如OSQCreate(),OSQPend(),OSQPost()等,都定义在OS_Q.C中。但是,在将µC/OS-Ⅱ移植到本ARM嵌入式开发平台时,对消息队列相关函数又作了提高,使得程序中对消息队列的使用变得更加简单易行。请参考附录API函数系统消息部分,开发平台的消息队列相关函数定义在OSMessage.h中。程序中可以用OSCreateMessage()函数为某个控件创建消息,用SendMessage()函数将该消息发送到消息队列中,用WaitMessage()函数等待消息,用DeleteMessage()函数删除消息。消息的数据结构定义如下:typedefstruct{POS_CtrlpOSCtrl;//消息所发到的窗口(控件),为NULL时指桌面U32Message;//消息类型U32WParam;//消息参数U32LParam;//消息参数}OSMSG,*POSMSG;下面是平台的基本消息类型定义:#defineOSM_KEY1//键盘消息#defineOSM_TOUCH_SCREEN2//触摸屏消息#defineOSM_SERIAL100//串口收到数据的消息#defineOSM_LISTCTRL_SELCHANGE1001//列表框的选择被改变的消息#defineOSM_LISTCTRL_SELDBCLICK1002//列表框的选择双击消息#defineOSM_BUTTON_CLICK1003//单击按钮消息下面是各基本消息类型的参数说明:MessageWParamLParamOSM_KEY键盘扫描码OSM_TOUCH_SCREEN低16位=触摸点x坐标值高16位=触摸点y坐标值触摸动作OSM_LISTCTRL_SELCHANGECtrlIDCurrentSelOSM_LISTCTRL_SELDBCLICKCtrlIDCurrentSelOSM_BUTTON_CLICKCtrlID对于键盘消息来说其类型pMsg->Message=OSM_KEY,参数pMsg->WParam则是按键的键码(pMsg是指向该消息结构体的指针)。键盘中断服务程序只向键盘邮箱(邮箱是µC/OS-Ⅱ的另一种通信机制)中发送一个消息,通知键盘扫描任务发生按键事件:voidISR_Key(){OSMboxPost(Key_MailBox,(void*)1);}当键盘扫描任务等到该邮箱的消息后就会从键盘扫描芯片读取扫描码,继而将该扫描码对应的键码用键盘消息发送到消息队列:voidKey_Scan_Task(void*Id)//键盘扫描任务{U32key;INT8Uerr;POSMSGpmsg;Uart_Printf("beginkeytask\n");for(;;){OSMboxPend(Key_MailBox,0,&err);key=ZLG7289_ReadKey();if(key>=64)continue;pmsg=OSCreateMessage(NULL,OSM_KEY,KeyBoard_Map[key],0);if(pmsg)SendMessage(pmsg);}}所谓的系统消息循环如图4-2所示:图4-2系统的消息循环应用程序在Main_Task任务中等待消息,并对该消息进行判断和处理,如果是键盘消息则提取出键码,变换为对应字符,然后将其显示到液晶屏上。在图形模式下,液晶屏的文字输出函数是TextOut(),实际是通过在图形方式下绘图完成文字显示的。此函数输出的字符数组必须是基于双字节Unicode编码的。在程序中可以使用Int2Unicode()和strChar2Unicode()两个函数分别将整形数或ASCII字符转换为Unicode字符串。这部分内容请参考附录API函数,在Ustring.h定义。六、实验步骤(一)嵌入式操作系统基本程序设计1.查看实验示例程序,学习µC/OS-Ⅱ任务创建和延时的程序编写方法。2.编写多任务程序,要求实现:任务1不停的向串口打印“Task1”,任务2向不同的串口打印“Task2”,任务3不停的向串口打印“Task3”。打印的规律为:121213,循环打印。效果如下:Task1Task2Task1Task2Task1Task33.编译、调试所编写的程序。(二)绘图的API函数1、新建工程,将“Exp4-1绘图的API函数”中的文件加入工程。2、编辑Main.c文件,在Main_Task任务中加入代码。使用操作系统的绘图API函数,绘制出如图4-3所示的图形。图4-3绘制的图形提示:1)绘制整个圆可以用Circle函数,绘制直线用LineTo函数,绘制圆弧用ArcTo函数。调试的过程中可以在每次调用绘图函数之后调用OSTimeDly()函数,使系统更新显示,输出到液晶屏上。2)为方便绘图,可使用SetDrawOrg函数设置绘图的原点。3)因为本次实验不用系统的字符显示,所以,可以去掉Main()函数中LoadFont()函数,以节省系统启动的时间。3、用ADS1.2编译、下载并调试上述程序,检查运行结果。4、在屏幕上无闪烁的绘制一个移动的正弦波。提示:1)绘制正弦波等有数学表达式的曲线时,可以根据平面几何的知识通过数学计算得到曲线上点的坐标,然后用线段连起来构成整个曲线。两帧画面之间可以清屏擦掉原来图形,然后重画新图形。2)因为绘图需要使用sin()函数,所以需要在main.c中加入#include<math.h>。5、用ADS1.2编译、下载并调试上述程序,检查运行结果。(三)图形系统的消息循环7、新建工程,将“Exp4-2系统的消息循环”中的文件加入工程。8、编辑Main_Task任务中的代码,理解如何实现消息循环。即:等待消息、处理(响应)消息、删除消息。提示:1)使用WaitMessage(0)接收消息,通常等待时间设置为无限长。2)系统的消息循环是一个无限循环。3)收到消息以后(即WaitMessage()函数返回后),通过判断消息结构中Message成员来判断消息类型。如果是键盘消息,则Message的值为OSM_KEY,WParam参数存储的是按键的键码,LParam参数存储的是同时按下的功能键(如果没有,则为0)。4)开始等待下一条消息之前必须使用DeleteMessage删除消息,释放系统的内存空间。9、编写键盘消息响应函数onKey(),处理键盘的消息。当有键盘消息收到的时候,把按键字符显示在液晶屏上,同时,发送给PC机的终端。提示:1)通过Uart_Printf()函数向串行口发送键面字符串。10、用ARMADS1.2编译、下载并调试上述程序,检查运行结果。12、在学习和调试上述例子程序的基础上,按照教师现场的要求,编写一个结合进程通信和绘图函数的综合程序,要求最终程序能够通过开发板自启动运行。七、思考题1.若循环打印出序列121213,各任务的循环周期和优先级应如何设置?2.结合自己实验种的体会,谈一下µC/OS-Ⅱ有什么优势?
附录嵌入式系统应用编程API函数1.显示部分Display.h相关结构:typedefstruct{intDrawPointx;intDrawPointy;//绘图所使用的坐标点intPenWidth;//画笔宽度U32PenMode;//画笔模式COLORREFPenColor;//画笔的颜色intDrawOrgx;//绘图的坐标原点位置intDrawOrgy;intWndOrgx;//绘图的窗口坐标位置intWndOrgy;intDrawRangex;//绘图的区域范围intDrawRangey;structRECTDrawRect;//绘图的有效范围U8bUpdataBuffer;//是否更新后台缓冲区及显示U32Fontcolor;//字符颜色}DC,*PDCtypedefstruct{intleft;inttop;intright;intbottom;}structRECT相关函数:initOSDC定义:voidinitOSDC()功能:初始化系统的绘图设备上下文(DC),为DC的动态分配开辟内存空间CreateDC定义:PDCCreateDC()功能:创建一个绘图设备上下文(DC),返回指向DC的指针DestoryDC定义:voidDestoryDC(PDCpdc)功能:删除绘图设备上下文(DC),释放相应的资源参数说明:pdc:指向绘图设备上下文(DC)的指针SetPixel定义:voidSetPixel(PDCpdc,intx,inty,COLORREFcolor)功能:设置指定点的像素颜色到LCD的后台缓冲区,LCD范围以外的点将被忽略参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:指定的像素座标color:指定的像素的颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。SetPixelOR定义:voidSetPixelOR(PDCpdc,intx,inty,COLORREFcolor)功能:设置指定点的像素颜色和LCD的后台缓冲区的对应点或运算,LCD范围以外的点将被忽略参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:指定的像素座标color:指定的像素的颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。SetPixelAND定义:voidSetPixelAND(PDCpdc,intx,inty,COLORREFcolor)功能:设置指定点的像素颜色和LCD的后台缓冲区的对应点与运算,LCD范围以外的点将被忽略参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:指定的像素座标color:指定的像素的颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。SetPixelXOR定义:voidSetPixelXOR(PDCpdc,intx,inty,COLORREFcolor)功能:设置指定点的像素颜色和LCD的后台缓冲区的对应点异或运算,LCD范围以外的点将被忽略参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:指定的像素座标color:指定的像素的颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。GetFontHeight定义:intGetFontHeight(U8fnt)功能:返回指定字体的高度参数说明:fnt:输出字体的大小型号,可以是表1-1数值中的一种:表1-1字体大小字体的型号数值说明FONTSIZE_SMALL1小字体模式,12x12字符FONTSIZE_MIDDLE2中字体模式,16x16字符FONTSIZE_BIG3大字体模式,24x24字符TextOut定义:voidTextOut(PDCpdc,intx,inty,U16*ch,U8bunicode,U8fnt)功能:在LCD屏幕上显示文字参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:所输出文字左上角的屏幕坐标ch:指向输出文字字符串的指针bunicode:是否为Unicode编码,如果是TRUE,表示ch指向的字符串为Unicode字符集;如果为FALSE,表示表示ch指向的字符串为GB字符集。fnt:指定字体的大小型号,可以是表1-1数值中的一种或上表1-2的数值:表1-2字的显示方式显示模式数值说明FONT_NORMAL0正常显示FONT_TRANSPARENT4透明背景FONT_BLACKBK8黑底白字TextOutRect定义:voidTextOutRect(PDCpdc,structRECT*prect,U16*ch,U8bunicode,U8fnt,U32outmode)功能:在指定矩形的范围内显示文字,超出的部分将被裁减参数说明:pdc:指向绘图设备上下文(DC)的指针prect:所输出文字的矩形范围ch:指向输出文字字符串的指针bunicode:是否为Unicode编码,如果是TRUE,表示ch指向的字符串为Unicode字符集;如果为FALSE,表示表示ch指向的字符串为GB字符集。fnt:指定字体的大小型号,可以是表1-1数值中的一种或表1-2的数值outmode:指定矩形中文字的对齐方式,可以是表1-3中的数值表1-3矩形中文字的对齐方式对齐方式数值说明TEXTOUT_LEFT_UP0文字从左上角开始TEXTOUT_MID_X1水平居中TEXTOUT_MID_Y2垂直居中MoveTo定义:voidMoveTo(PDCpdc,intx,inty)功能:把绘图点移动到指定的坐标参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:移动画笔到绘图点的屏幕坐标LineTo定义:voidLineTo(PDCpdc,intx,inty)功能:在屏幕上画线。从当前画笔的位置画直线到指定的坐标位置,并使画笔停留在当前指定的位置参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:直线绘图目的点的屏幕坐标DrawRectFrame定义:voidDrawRectFrame(PDCpdc,intleft,inttop,intright,intbottom)功能:在屏幕上绘制指定大小的矩形方框。参数说明:pdc:指向绘图设备上下文(DC)的指针left:绘制矩形的左边框位置right:绘制矩形的右边框位置top:绘制矩形的上边框位置bottom:绘制矩形的下边框位置DrawRectFrame2定义:voidDrawRectFrame2(PDCpdc,structRECT*rect)功能:在屏幕上绘制指定大小的矩形方框。参数说明:pdc:指向绘图设备上下文(DC)的指针rect:绘制矩形的位置及大小FillRect定义:voidFillRect(PDCpdc,intleft,inttop,intright,intbottom,U32DrawMode,COLORREFcolor)功能:在屏幕上填充指定大小的矩形。参数说明:pdc:指向绘图设备上下文(DC)的指针left:绘制矩形的左边框位置right:绘制矩形的右边框位置top:绘制矩形的上边框位置bottom:绘制矩形的下边框位置DrawMode:矩形的的填充模式和颜色,它的数值可以是表1-4中的一种和表1-5中的或运算的结果color:填充的颜色值,高8位为空,接下来的24位分别对应RGB颜色的8位码。表1-4绘图模式绘图模式数值说明GRAPH_MODE_NORMAL0x00普通绘图模式GRAPH_MODE_OR0x10或绘图模式GRAPH_MODE_AND0x20与绘图模式GRAPH_MODE_XOR0x30异或绘图模式表1-5前景颜色图形显示模式数值说明COLOR_BLACK1黑色前景色COLOR_WHITE0白色前景色FillRect2定义:voidFillRect2(PDCpdc,structRECT*rect,U32DrawMode,COLORREFcolor)功能:在屏幕上填充指定大小的矩形。参数说明:pdc:指向绘图设备上下文(DC)的指针rect:绘制矩形的位置及大小DrawMode:矩形的的填充模式和颜色,它的数值可以是表1-4中的一种和表1-5中的或运算的结果。color:填充的颜色值,高8位为空,接下来的24位分别对应RGB颜色的8位码。ClearScreen定义:voidClearScreen()功能:清除整个屏幕的绘图缓冲区,即:清空LCDBuffer2SetPenWidth定义:U8SetPenWidth(PDCpdc,U8width)功能:设置画笔的宽度,并返回以前的画笔宽度参数说明:pdc:指向绘图设备上下文(DC)的指针width:画笔的宽度,默认值是1,即一个像素点宽SetPenMode定义:voidSetPenMode(PDCpdc,U32mode)功能:设置画笔画图的模式参数说明:pdc:指向绘图设备上下文(DC)的指针mode:绘图的更新模式,可以是表1-4数值中的一种Circle定义:voidCircle(PDCpdc,intx0,inty0,intr)功能:绘制指定圆心和半径的圆参数说明:pdc:指向绘图设备上下文(DC)的指针x0,y0:圆心坐标r:圆的半径ArcTo定义:voidArcTo(PDCpdc,intx1,inty1,U8arctype,intR)功能:绘制圆弧,从画笔的当前位置绘制指定圆心的圆弧到给定的位置参数说明:pdc:指向绘图设备上下文(DC)的指针x1,y1:绘制圆弧的目的位置arctype:圆弧的方向可以是表1-6参数中的一种:R:圆弧的半径表1-6圆弧的方向园弧绘制模式数值说明GRAPH_ARC_BACKWARD0逆时针画圆GRAPH_ARC_FORWARD1顺时针画圆SetLCDUpdata定义:U8SetLCDUpdata(PDCpdc,U8isUpdata)功能:设定绘图的时候是否及时的更新LCD的显示,返回以前的更新模式参数说明:pdc:指向绘图设备上下文(DC)的指针isUpdata:是否更新LCD的显示,可以为TRUE或者FALSE。如果选择及时更新则每调用一次绘图的函数都要更新LCD的后台缓冲区并把后台缓冲区复制到前台,虽然可以保证绘图的实时性,但是,总体来讲,是降低了绘图的效率。Draw3DRect定义:voidDraw3DRect(PDCpdc,intleft,inttop,intright,intbotton,COLORREFcolor1,COLORREFcolor2)功能:绘制指定大小和风格的3D边框的矩形参数说明:pdc:指向绘图设备上下文(DC)的指针left:绘制矩形的左边框位置right:绘制矩形的右边框位置top:绘制矩形的上边框位置bottom:绘制矩形的下边框位置color1:左和上的边框颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。color2:右和下的边框颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。Draw3DRect2定义:voidDraw3DRect2(PDCpdc,structRECTrect,COLORREFcolor1,COLORREFcolor2)功能:绘制指定大小和风格的3D边框的矩形参数说明:pdc:指向绘图设备上下文(DC)的指针rect:绘制矩形的位置及大小color1:左和上的边框颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。color2:右和下的边框颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。GetPenWidth定义:U8GetPenWidth(PDCpdc)功能:返回当前绘图设备上下文(DC)画笔的宽度参数说明:pdc:指向绘图设备上下文(DC)的指针GetPenMode定义:U32GetPenMode(PDCpdc)功能:返回当前绘图设备上下文(DC)画笔的模式参数说明:pdc:指向绘图设备上下文(DC)的指针SetPenColor定义:U32SetPenColor(PDCpdc,U32color)功能:设定画笔的颜色,返回当前绘图设备上下文(DC)画笔的颜色参数说明:pdc:指向绘图设备上下文(DC)的指针color:画笔的颜色,高8位为空,接下来的24位分别对应RGB颜色的8位码。GetPenColor定义:U32GetPenColor(PDCpdc)功能:返回当前绘图设备上下文(DC)画笔的颜色参数说明:pdc:指向绘图设备上下文(DC)的指针GetBmpSize定义:voidGetBmpSize(charfilename[],int*Width,int*Height)功能:取得指定位图文件位图的大小参数说明:filename[]:位图文件的文件名Width:位图的宽Height:位图的高ShowBmp定义:voidShowBmp(PDCpdc,charfilename[],intx,inty)功能:显示指定的位图(Bitmap)文件,到指定的坐标参数说明:pdc:指向绘图设备上下文(DC)的指针filename[]:显示的位图(Bitmap)文件名x,y:显示位图的左上角坐标SetDrawOrg定义:voidSetDrawOrg(PDCpdc,intx,inty,int*oldx,int*oldy)功能:设置绘图设备上下文(DC)的原点参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:设定的新原点oldx,oldy:返回的以前原点的位置SetDrawRange定义:voidSetDrawRange(PDCpdc,intx,inty,int*oldx,int*oldy)功能:设置绘图设备上下文(DC)的绘图范围参数说明:pdc:指向绘图设备上下文(DC)的指针x,y:设定的横向、纵向绘图的范围,如果x(或者y)为1,则表示x(或者y)方向的比例随着y(或者x)方向的范围按比例缩放。如果参数为-1,表示方向相反oldx,oldy:返回的以前横向、纵向绘图的范围LineToDelay定义:voidLineToDelay(PDCpdc,intx,inty,intticks)功能:在屏幕上画线。从当前画笔的位置画直线到指定的坐标
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年供电所从业人员专业培训试题库变电运维附答案
- 2024年度公司薪酬结构改革方案报告
- 美容院管理制度及标准
- 进货查验和记录制度
- 2026年天津城市建设管理职业技术学院单招职业适应性测试题库附参考答案详解(考试直接用)
- 国网公司请假制度
- 菜刀安全管理制度及流程
- 内部机构管理制度
- 班级请假规章制度
- 药品入库员奖惩制度
- 定陶区287.5MW风力发电项目配套220kV升压站工程报告表
- 实习护士第三方协议书
- 水利工程施工安全生产管理工作导则
- 民宿委托经营管理协议合同书
- 四川省森林资源规划设计调查技术细则
- 《论文写作基础教程》课件
- 2024-2025学年鲁教版(五四学制)(2024)初中英语六年级下册(全册)知识点归纳
- 化工总控工-仪表自动化知识考试题库
- 大大服装厂 SOP 作业指导书
- 【课件】书画同源+课件-2024-2025学年高中美术人教版+(2019)+选择性必修2+中国书画
- GB/T 19973.2-2025医疗产品灭菌微生物学方法第2部分:用于灭菌过程的定义、确认和维护的无菌试验
评论
0/150
提交评论