实验十 数码管与LED点阵控制综合实验.docx
- 文档编号:6138078
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:23
- 大小:537.01KB
实验十 数码管与LED点阵控制综合实验.docx
《实验十 数码管与LED点阵控制综合实验.docx》由会员分享,可在线阅读,更多相关《实验十 数码管与LED点阵控制综合实验.docx(23页珍藏版)》请在冰豆网上搜索。
实验十数码管与LED点阵控制综合实验
实验十数码管与LED点阵控制综合实验
一、实验目的
1、掌握制作驱动程序和加载驱动的过程。
2、理解数码管和LED点阵的控制程序。
3、熟练的运用PlantformBuild5.0和EVC4.0。
二、实验内容
使用PlantformBuild5.0对其数码管和LED点阵的驱动程序进行编译,将重新编译的内核下载到实验平台内。
再通过EVC4.0制作出的图形界面对数码管和LED点阵进行控制。
三、预备知识
1、PlantformBuild5.0和EVC4.0软件的运用。
2、内核驱动的制作和加载过程。
3、对C++的编程理解。
四、实验设备及工具
硬件:
PC一台P3以上,UP-TECHS2410/P270DVP实验箱(包含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核心板:
0x10000110-0x10000112
点阵LED寄存器组
CPLD以动态扫描方式驱动8×8点阵LED,显示内容和寄存器组值对应。
CPLD内部包含在点阵LED上显示滚动效果的UPTECH字样的代码,此功能在系统复位后自动运行,在CPU首次写入点阵LED寄存器时停止,之后显示内容由所写内容决定。
点阵LED寄存器组共8个字节寄存器,地址A4A3A2A1=从0000到0111,按地址递增顺序分别对应点阵LED模块从左到右的8个列。
每个字节寄存器对应一列,字节寄存器内8个位对应该列的8个LED,从Bit0到Bit7分别对应从上到下的LED。
物理地址:
270核心板:
0x10000100、0x10000102、0x10000104。
。
。
。
。
0x1000011E
六、实验步骤
(一)定制并下载操作系统、导出SDK包
1.将自己定制的操作系统文件夹拷贝到C:
\WINCE500\PBWORKSPACE文件夹下
2.在PB中打开该工程
3.添加支持MFC、C++的下列组件:
COREOS\APPLICATIONSANDSERVER\C.LIBRARIESANDRUNTIMES\C++RuntimeSupportforExceptionHandlingandRuntimeTypeInformation
CORE\APPLICATIONSANDSERVER\C.LIBRARIESANDRUNTIMES\FullCRuntime
COREOS\APPLICATIONSANDSERVER\ComponentServices(COMandDCOM)\MicrosoftFoundationClasses(MFC)
在此先不用编译和下载
(二)编写数码管和点阵驱动程序
1、在PlatformBuilder中选择“File”->“NewProjectorFile”,创建一个“WindowsCEDynamiclinklibrary”项目,项目的名称填写“ArrayLed”(如下图所示)
2、按OK按钮,其他窗口选择默认设置。
在DLL的类型界面中(如图3-2所示)选中ASimpleWindowsCEDLLprojects,PlatformBuilder将生成DLL框架代码。
3、在PlatformBuilder中修改ArrayLed.cpp的DllMain函数.
4、对数码管和LED点阵驱动的程序进行编写。
(红色为手动增加)
驱动代码如下:
//ArrayLed.cpp:
DefinestheentrypointfortheDLLapplication.
//
#include"stdafx.h"
extern"C"
VirtualCopy(PVOID,PVOID,DWORD,DWORD);
#defineCOMMAND_INIT0x1
#defineCOMMAND_ARRAYSHOW0x2
#defineCOMMAND_LEDSHOW0x3
#defineCOMMAND_LEDOFF0x4
#defineCOMMAND_ARRAYOFF0x5
typedefstruct{
shortunsignedintled[8];
}LedArray;
typedefstruct{
shortunsignedinthigh;
shortunsignedintlow;
}Led;
LedArray*ledarr=NULL;
LedArray*temp=NULL;
Led*ledshow=NULL;
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
returnTRUE;
}
DWORDLED_Init(DWORDdwContext)
{
inti=0;
ledarr=(LedArray*)VirtualAlloc(0,sizeof(LedArray),MEM_RESERVE,PAGE_NOACCESS);
if(ledarr==NULL)
{
RETAILMSG(1,(TEXT("ForLED:
VirtualAllocfailed!
\r\n")));
return0;
}
else
{
if(!
VirtualCopy((PVOID)ledarr,(PVOID)(0x10000000>>8),sizeof(LedArray),PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG(1,(TEXT("ForLED:
VirtualCopyfailed!
\r\n")));
return0;
}
}
temp=ledarr;
temp=(LedArray*)((unsignedchar*)ledarr+0x100);
ledshow=(Led*)((unsignedchar*)ledarr+0x110);
for(i=0;i<8;i++)
{
temp->led[i]=0x0;
}
ledshow->high=0xf9;
ledshow->low=0xc0;
RETAILMSG(1,(TEXT("ForLED:
initisok!
\r\n")));
return1;
}
DWORDLED_Open(DWORDhDeviceContext,DWORDAccessCode,DWORDShareMode)
{
//LED_Init(hDeviceContext);
return1;
}
DWORDLED_Read(DWORDHandle,LPVOIDpBuffer,DWORDdwNumBytes)
{
return0;
}
BOOLLED_Close(DWORDHandle)
{
//VirtualFree(ledarr,0,MEM_RELEASE);
return1;
}//LED_Close
BOOLLED_Deinit(DWORDdwContext)
{
returnTRUE;
}
DWORDLED_Write(DWORDhOpenContext,LPCVOIDpBuffer,DWORDCount)
{
return0;
}
DWORDLED_Seek(DWORDhOpenContext,longAmount,DWORDType)
{
return0;
}
BOOLLED_IOControl(DWORDhOpenContext,
DWORDdwCode,
shortunsignedint*pBufIn,
DWORDdwLenIn,
PBYTEpBufOut,
DWORDdwLenOut,
PDWORDpdwActualOut)
{
LedArray*array_show=(LedArray*)pBufIn;
//Led*led_show=(Led*)pBufIn;
switch(dwCode)
{
caseCOMMAND_INIT:
RETAILMSG(1,(TEXT("ForLED:
initCE!
\r\n")));
temp->led[0]=0x01;
temp->led[1]=0x02;
temp->led[2]=0x04;
temp->led[3]=0x08;
temp->led[4]=0x10;
temp->led[5]=0x20;
temp->led[6]=0x40;
temp->led[7]=0x80;
ledshow->high=0xf9;
ledshow->low=0xa4;
break;
caseCOMMAND_ARRAYSHOW:
for(inti=0;i<8;i++)
temp->led[i]=array_show->led[i];
break;
caseCOMMAND_LEDSHOW:
RETAILMSG(1,(TEXT("ForLED:
APuseitandvalueis%x,%x!
\r\n"),*pBufIn,*(pBufIn+1)));
ledshow->high=*pBufIn;
ledshow->low=*(pBufIn+1);
break;
caseCOMMAND_LEDOFF:
ledshow->high=0xff;
ledshow->low=0xff;
break;
caseCOMMAND_ARRAYOFF:
for(inti=0;i<8;i++)
{
temp->led[i]=0x0;
}
break;
default:
break;
}
returnTRUE;
}
voidLED_PowerUp(void)
{
;
}
voidLED_PowerDown(void)
{
;
}
5、展开ParamterFiles,打开导出函数的定义文件ArrayLed.def。
增加内容如下:
LIBRARYLED
EXPORTS
LED_Init
LED_Open
LED_Close
LED_Deinit
LED_IOControl
LED_Read
LED_Write
LED_Seek
6、在Fileview中选中MyDriver工程点击右键,选择“BuildCurrentProject”编译工程,排除所有错误。
如下图所示
7、编译成功后选择菜单“BuildOS”->“OpenBuildReleaseDirectory”,然后输入命令:
dumpbin/exportsArrayLed.dll,确保驱动接口DLL函数被正确导出。
8、展开fileView,修改ParameterFiles选项下的ArrayLed.reg文件,增加如下内容:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ArrayLed]
"Prefix"="LED"
"Dll"="ArrayLed.dll"
"Index"=dword:
1
"Order"=dword:
1
"Ioctl"=dword:
1
9、点击“SYSGEN”重新编译
10、导出针对该平台的SDK包
11、将新建平台下载到实验箱中
12、安装SDK包
13、通过“RemoteProcessViewer”或超级终端查看驱动是否正确加载
(三)编写驱动程序测试程序
1、打开EVC4.0,新建一个MFC、基于Dialog的工程,注意选择CPU型号如下图
2、打开ResourceView页,对其图形的控制界面进行设计,如下图,该图形界面分别有两个“GroupBox”控件,分别命名为:
“LED”、“ArrayLed”,两个“EditBox”控件,四个Button按键,分别将其显示改为如下图
每个按钮的属性如下如
3、双击各个按键,针对各个按键编程,如下(红色为手动添加):
voidCLEDDlg:
:
OnButton1()//七段数码管显示
{
//TODO:
Addyourcontrolnotificationhandlercodehere
this->UpdateData();
if(hLed==INVALID_HANDLE_VALUE)//打开数码管设备
hLed=CreateFile(TEXT("LED1:
"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
show_led.high=LedData[m_show/10];//计算七段数码管高位
show_led.low=LedData[m_show%10];//低位
shortunsignedint*temp=(shortunsignedint*)(&show_led);
DeviceIoControl(hLed,COMMAND_IOCTRL_LED,temp,sizeof(show_led),NULL,NULL,NULL,NULL);//IoControl控制数码管显示,传递现实参数
}
voidCLEDDlg:
:
OnButton2()//关闭七段数码管
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(hLed==INVALID_HANDLE_VALUE)
hLed=CreateFile(TEXT("LED1:
"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
DeviceIoControl(hLed,COMMAND_IOCTRL_LEDOFF,NULL,NULL,NULL,NULL,NULL,NULL);
}
voidCLEDDlg:
:
OnButton3()//点阵数码管显示
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
inti=0,j=0;
for(i=0;i<4;i++)
show_array[i]=LedLetter[m_arrayshow/10][i];//计算高位
for(i=4;i<8;i++)
{
show_array[i]=LedLetter[m_arrayshow%10][j];//计算低位
j++;
}
DeviceIoControl(hLed,COMMAND_IOCTRL_ARRAYLED,show_array,sizeof(show_array),NULL,NULL,NULL,NULL);//设备iocontrol控制设备显示
}
voidCLEDDlg:
:
OnButton4()//关闭点阵数码管
{
//TODO:
Addyourcontrolnotificationhandlercodehere
DeviceIoControl(hLed,COMMAND_IOCTRL_ARRAYOFF,NULL,NULL,NULL,NULL,NULL,NULL);
}
4、在窗口中右键菜单中选择“ClassWizare”
5、如下图,从左边选择“DestoryWindow”到右边,点击“ADDFunction”,并编辑代码,红色为手动添加
BOOLCLEDDlg:
:
DestroyWindow()
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CloseHandle(hLed);
hLed=INVALID_HANDLE_VALUE;//销毁窗口是关闭设备句柄
returnCDialog:
:
DestroyWindow();
}
6、修改LedDlg.cpp文件,红色部分为手动添加
//LEDDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"LED.h"
#include"LEDDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
#defineCOMMAND_IOCTRL_ARRAYLED2
#defineCOMMAND_IOCTRL_LED3
#defineCOMMAND_IOCTRL_LEDOFF4
#defineCOMMAND_IOCTRL_ARRAYOFF5
HANDLEhLed=INVALID_HANDLE_VALUE;
struct{
shortunsignedinthigh;
shortunsignedintlow;
}show_led;//七段数码管传送参数
shortunsignedintLedData[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//七段数码管
shortunsignedintLedLetter[10][4]={//点阵数码管数字字模
{0xfe,0x82,0x82,0xfe},
{0x00,0x00,0x00,0xfe},
{0xf2,0x92,0x92,0x9e},
{0x92,0x92,0x92,0xfe},
{0x1e,0x10,0x10,0xfe},
{0x9e,0x92,0x92,0xf2},
{0xfe,0x92,0x92,0xf2},
{0x02,0x02,0x02,0xfe},
{0xfe,0x92,0x92,0xfe},
{0x9e,0x92,0x92,0xfe}
};
shortunsignedintshow_array[8];//点阵数码管传送参数
//LedLetter[0][]={0xfe,0x82,0x82,0xfe};
/////////////////////////////////////////////////////////////////////////////
//CLEDDlgdialog
CLEDDlg:
:
CLEDDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CLEDDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CLEDDlg)
m_show=0;
m_arrayshow=0;
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCLEDDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLEDDlg)
DDX_Text(pDX,IDC_EDIT1,m_show);
DDV_MinMaxInt(pDX,m_show,0,99);
DDX_Text(pDX,IDC_EDIT2,m_arrayshow);
DDV_MinMaxUInt(pDX,m_arrayshow,0,99);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLEDDlg,CDialog)
//{{AFX_MSG_MAP(CLEDDlg)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_BN_CLICKED(IDC_BUTTON3,OnButton3)
ON_BN_CLICKED(IDC_BUTTON4,OnButton4)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CLEDDlgmessagehandlers
BOOLCLEDDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
CenterWindow(GetDesktopWindow());//centertothehpcscreen
//TODO:
Addextrainitializationhere
if(hLed==INVALID_HA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验十 数码管与LED点阵控制综合实验 实验 数码管 LED 点阵 控制 综合