1、实验十 数码管与 LED 点阵控制综合实验一、实验目的1、掌握制作驱动程序和加载驱动的过程。2、理解数码管和 LED点阵的控制程序。3、熟练的运用 Plantform Build 5.0 和 EVC4.0。二、实验内容使用 Plantform Build 5.0 对其数码管和 LED 点阵的驱动程序进行编译,将重新编译的内核下载到实验平台内。再通过 EVC4.0 制作出的图形界面对数码管和 LED 点阵进行控制。三、预备知识1、Plantform Build 5.0 和 EVC4.0 软件的运用。2、内核驱动的制作和加载过程。3、对 C+的编程理解。四、实验设备及工具硬件:PC 一台 P3以上
2、,UP-TECH S2410/P270 DVP 实验箱(包含 270核心板、串口线、并口线、USB 从口线、网线、电源、光盘等)一台。软件:PC 机操作系统 WinXP,EVC4.0 开发环境,WinCE500五、实验原理及说明数码管寄存器CPLD 以静态方式驱动 2 个 7 段数码管,显示内容和寄存器值对应。默认值 0xFF 熄灭 地址 A4A3A2A1=1000(十位) 1001(个位)位 7 6 5 4 3 2 1 0定义 DP G F E D C B A读出值与写入值相同。数码管各笔画位置以及数字符号的段码查其他文档。物理地址:270 核心板: 0x1000 01100x1000 01
3、12点阵 LED 寄存器组CPLD 以动态扫描方式驱动 88 点阵 LED,显示内容和寄存器组值对应。CPLD 内部包含在点阵 LED 上显示滚动效果的 UPTECH 字样的代码,此功能在系统复位后自动运行,在 CPU 首次写入点阵 LED 寄存器时停止,之后显示内容由所写内容决定。点阵 LED 寄存器组共 8 个字节寄存器,地址 A4A3A2A1=从 0000 到 0111,按地址递增顺序分别对应点阵 LED 模块从左到右的 8 个列。每个字节寄存器对应一列,字节寄存器内 8 个位对应该列的 8 个 LED,从 Bit0 到 Bit7 分别对应从上到下的 LED。b0b1b2b3b4b5b6
4、b7b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7b0b1b2b3b4b5b6b7Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte700000001001000110100010101100111A4:A1Register物理地址:270 核心板: 0x1000 0100、0x1000 0102、0x1000 0104。 。 。 。 。 0x1000 011E六、实验步骤(一) 定制并下载操作系统、导出 SDK 包1.
5、将自己定制的操作系统文件夹拷贝到 C:WINCE500PBWORKSPACE 文件夹下2. 在 PB 中打开该工程3. 添加支持 MFC、的下列组件:CORE OSAPPLICATIONS AND SERVERC.LIBRARIES AND RUNTIMESC+ Runtime Support for Exception Handling and Runtime Type InformationCOREAPPLICATIONS AND SERVERC.LIBRARIES AND RUNTIMESFull C RuntimeCORE OSAPPLICATIONS AND SERVER Compo
6、nent Services (COM and DCOM) Microsoft Foundation Classes (MFC)在此先不用编译和下载(二) 编写数码管和点阵驱动程序1、在 Platform Builder 中选择“File”-“New Project or File”,创建一个“Windows CE Dynamic link library”项目,项目的名称填写“ArrayLed” (如下图所示)2、按 OK按钮,其他窗口选择默认设置。在 DLL的类型界面中(如图 3-2所示)选中 A Simple Windows CE DLL projects,Platform Builder
7、 将生成 DLL 框架代码。3、在 Platform Builder 中修改 ArrayLed.cpp 的 DllMain 函数.4、对数码管和 LED点阵驱动的程序进行编写。(红色为手动增加)驱动代码如下:/ ArrayLed.cpp : Defines the entry point for the DLL application./#include “stdafx.h“extern “C“VirtualCopy(PVOID,PVOID,DWORD,DWORD);#define COMMAND_INIT 0x1#define COMMAND_ARRAYSHOW 0x2#define COM
8、MAND_LEDSHOW 0x3#define COMMAND_LEDOFF 0x4#define COMMAND_ARRAYOFF 0x5typedef structshort unsigned int led8;LedArray;typedef structshort unsigned int high;short unsigned int low;Led;LedArray *ledarr=NULL;LedArray *temp=NULL;Led *ledshow=NULL;BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for
9、_call, LPVOID lpReserved)return TRUE;DWORD LED_Init(DWORD dwContext)int i=0;ledarr = (LedArray *)VirtualAlloc(0, sizeof(LedArray), MEM_RESERVE, PAGE_NOACCESS);if (ledarr = NULL) RETAILMSG(1,(TEXT(“For LED : VirtualAlloc failed!rn“);return 0;else if (!VirtualCopy(PVOID)ledarr, (PVOID)(0x100000008), s
10、izeof(LedArray), PAGE_PHYSICAL|PAGE_READWRITE | PAGE_NOCACHE) RETAILMSG(1,(TEXT(“For LED: VirtualCopy failed!rn“);return 0;temp=ledarr;temp=(LedArray *)(unsigned char *)ledarr+0x100);ledshow=(Led *)(unsigned char *)ledarr + 0x110);for(i=0;iledi=0x0;ledshow-high=0xf9;ledshow-low=0xc0;RETAILMSG(1,(TEX
11、T(“For LED: init is ok!rn“);return 1;DWORD LED_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)/ LED_Init(hDeviceContext);return 1;DWORD LED_Read(DWORD Handle,LPVOID pBuffer,DWORD dwNumBytes)return 0;BOOL LED_Close(DWORD Handle)/ VirtualFree(ledarr, 0, MEM_RELEASE);return 1;/LED_CloseBOOL
12、 LED_Deinit(DWORD dwContext)return TRUE;DWORD LED_Write(DWORD hOpenContext,LPCVOID pBuffer,DWORD Count) return 0;DWORD LED_Seek(DWORD hOpenContext,long Amount ,DWORD Type) return 0;BOOL LED_IOControl(DWORD hOpenContext,DWORD dwCode ,short unsigned int* pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenO
13、ut,PDWORD pdwActualOut) LedArray *array_show=(LedArray *)pBufIn;/ Led *led_show=(Led *)pBufIn;switch(dwCode)case COMMAND_INIT:RETAILMSG(1,(TEXT(“For LED: init CE!rn“);temp-led0=0x01;temp-led1=0x02;temp-led2=0x04;temp-led3=0x08;temp-led4=0x10;temp-led5=0x20;temp-led6=0x40;temp-led7=0x80;ledshow-high=
14、0xf9;ledshow-low=0xa4;break;case COMMAND_ARRAYSHOW:for(int i=0;iledi=array_show-ledi;break;case COMMAND_LEDSHOW:RETAILMSG(1,(TEXT(“For LED: AP use it and value is %x,%x!rn“),*pBufIn,*(pBufIn+1);ledshow-high=*pBufIn;ledshow-low=*(pBufIn+1);break;case COMMAND_LEDOFF:ledshow-high=0xff;ledshow-low=0xff;
15、break;case COMMAND_ARRAYOFF:for(int i=0;iledi=0x0;break;default :break;return TRUE;void LED_PowerUp(void);void LED_PowerDown(void);5、展开 Paramter Files,打开导出函数的定义文件 ArrayLed.def。增加内容如下:LIBRARY LEDEXPORTSLED_InitLED_OpenLED_CloseLED_DeinitLED_IOControlLED_ReadLED_WriteLED_Seek6、在 Fileview 中选中 MyDriver
16、工程点击右键,选择“Build Current Project”编译工程,排除所有错误。如下图所示7、编译成功后选择菜单“Build OS”-“Open Build Release Directory”,然后输入命令:dumpbin /exports ArrayLed.dll,确保驱动接口 DLL 函数被正确导出。8、展开 fileView,修改 Parameter Files选项下的 ArrayLed.reg文件,增加如下内容:HKEY_LOCAL_MACHINEDriversBuiltInArrayLed“Prefix“=“LED“Dll“=“ArrayLed.dll“Index“=dword:1“Order“=dword:1“Ioctl“=dword:1