



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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 (個位)位76543210定義DPGFEDCBA讀出值與寫入值相同。數碼管各筆畫位置以及數字符號的段碼查其他文檔。物理地址:270 核心板:0x1000 0110 0x1000 0112點陣LED寄存器組CPLD
3、 以動態掃描方式驅動8×8 點陣 LED ,顯示內容和寄存器組值對應。CPLD 內部包含在點陣 LED 上顯示滾動效果的 UPTECH 字樣的代碼,此功能在系統復位后自動運行,在 CPU 首次寫入點陣 LED 寄存器時停止,之后顯示內容由所寫內容決定。點陣 LED 寄存器組共 8 個字節寄存器, 地址 A4A3A2A1= 從 0000 到 0111,按地址遞增順序分別對應點陣 LED 模塊從左到右的 8 個列。每個字節寄存器對應一列,字節寄存器內8 個位對應該列的8 個 LED ,從 Bit0到 Bit7分別對應從上到下的LED 。r01234567eeeeeeeeetttttttt
4、tsyyyyyyyyigBBBBBBBBeRb0b0b0b0b0b0b0b0b1b1b1b1b1b1b1b1b2b2b2b2b2b2b2b2b3b3b3b3b3b3b3b3b4b4b4b4b4b4b4b4b5b5b5b5b5b5b5b5b6b6b6b6b6b6b6b61b7b7b7b7b7b7b7b701010101A:00110011400001111A00000000物理地址:270 核心板:0x1000 0100 、 0x1000 0102、 0x1000 0104 。 0x1000 011E六、實驗步驟(一) 定制并下載操作系統、導出SDK 包1.將自己定制的操作系統文件夾拷貝到C:W
5、INCE500PBWORKSPACE文件夾下2. 在 PB 中打開該工程3. 添加支持 MFC 、的下列組件:CORE OSAPPLICA TIONSAND SERVERC.LIBRARIESANDC+Runtime Support for Exception Handling and Runtime Type InformationCOREAPPLICATIONSANDSERVERC.LIBRARIESANDFullCRuntimeCOREOSAPPLICA TIONSANDSERVERComponentServices(COMandDCOM) Microsoft Foundation Cl
6、asses (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 將生成 DLL 框架代碼。3、在 Platform Builder中修
7、改 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_INIT0x1#define COMMAND_ARRAYSHOW0x2#define COMMAND_LEDSHOW0x3#def
8、ine COMMAND_LEDOFF0x4#define COMMAND_ARRAYOFF0x5typedef 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_call,LPVOID lpReserved
9、)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;elseif (!VirtualCopy(PVOID)ledarr, (PVOID)(0x10000000>>8), sizeof(Le
10、dArray),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;i<8;i+)temp->ledi=0x0;ledshow->high=0xf9;ledshow->
11、;low=0xc0;RETAILMSG(1,(TEXT("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,
12、 MEM_RELEASE); return 1;/LED_CloseBOOL 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,DWOR
13、D dwLenIn,PBYTE pBufOut,DWORD dwLenOut,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->le
14、d4=0x10;temp->led5=0x20;temp->led6=0x40;temp->led7=0x80;ledshow->high=0xf9;ledshow->low=0xa4;break;case COMMAND_ARRAYSHOW:for(int i=0;i<8;i+)temp->ledi=array_show->ledi;break;case COMMAND_LEDSHOW:RETAILMSG(1,(TEXT("For LED: AP use it and valueis %x,%x!rn"),*pBufIn,*
15、(pBufIn+1);ledshow->high=*pBufIn;ledshow->low=*(pBufIn+1);break;case COMMAND_LEDOFF:ledshow->high=0xff;ledshow->low=0xff;break;case COMMAND_ARRAYOFF:for(int i=0;i<8;i+)temp->ledi=0x0;break;default :break;return TRUE;void LED_PowerUp(void);void LED_PowerDown(void);5、展開 Paramter File
16、s,打開導出函數的定義文件ArrayLed.def 。增加內容如下:LIBRARY LEDEXPORTSLED_InitLED_OpenLED_CloseLED_DeinitLED_IOControlLED_ReadLED_WriteLED_Seek6、在 Fileview 中選中 MyDriver工程點擊右鍵, 選擇 “ Build Current Project ”編譯工程, 排除所有錯誤。如下圖所示7、編譯成功后選擇菜單 “Build OS ”->“ Open Build Release Directory ”,然后輸入命令: dumpbin /exports ArrayLed.d
17、ll ,確保驅動接口 DLL 函數被正確導出。8、展開 fileView,修改 Parameter Files選項下的ArrayLed.reg文件,增加如下內容:HKEY_LOCAL_MACHINEDriversBuiltInArrayLed"Prefix"="LED""Dll"="ArrayLed.dll""Index"=dword:1"Order"=dword:1"Ioctl"=dword:19、點擊“ SYSGEN ”重新編譯10、導出針對該平臺的S
18、DK 包11、將新建平臺下載到實驗箱中12、安裝 SDK 包13、通過“ Remote Process Viewer”或超級終端查看驅動是否正確加載(三) 編寫驅動程序測試程序1、打開 EVC4.0 ,新建一個MFC 、基于 Dialog 的工程,注意選擇CPU 型號如下圖2、打開ResourceView 頁,對其圖形的控制界面進行設計,如下圖,該圖形界面分別有兩個“ Group Box ”控件,分別命名為: “ LED ”、“ ArrayLed ”,兩個“ Edit Box ”控件,四個Button 按鍵,分別將其顯示改為如下圖每個按鈕的屬性如下如3、雙擊各個按鍵,針對各個按鍵編程,如下(紅
19、色為手動添加):void CLEDDlg:OnButton1() /七段數碼管顯示/ TODO: Add your control notification handler code here this->UpdateData();if(hLed=INVALID_HANDLE_VALUE) /打開數碼管設備hLed=CreateFile(TEXT("LED1:"),GENERIC_READGENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);show_led.high=LedDatam_show/10;/計算七段數碼管高位show_led.l
20、ow=LedDatam_show%10;/ 低位|short unsigned int *temp=(short unsigned int*)(&show_led); DeviceIoControl(hLed,COMMAND_IOCTRL_LED,temp,sizeof(show_led),NULL,NULL,NULL,NULL); /IoControl控制數碼管顯示,傳遞現實參數void CLEDDlg:OnButton2()/關閉七段數碼管/ TODO: Add your control notification handler code here if(hLed=INVALID_
21、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);void CLEDDlg:OnButton3() /點陣數碼管顯示/ TODO: Add your control notification handler code here UpdateData();int i=0,j=0;for(
22、i=0;i<4;i+)show_arrayi=LedLetterm_arrayshow/10i;/ 計算高位for(i=4;i<8;i+)show_arrayi=LedLetterm_arrayshow%10j;/ 計算低位j+;DeviceIoControl(hLed,COMMAND_IOCTRL_ARRAYLED,show_array,sizeof(show_array),NULL,NULL,NULL,NULL); /設備iocontrol控制設備顯示void CLEDDlg:OnButton4() / 關閉點陣數碼管/ TODO: Add your control notif
23、ication handler code hereDeviceIoControl(hLed,COMMAND_IOCTRL_ARRAYOFF,NULL,NULL,NULL,NULL,N ULL,NULL);4、在窗口中右鍵菜單中選擇“ClassWizare”5、如下圖,從左邊選擇“ DestoryWindow ”到右邊,點擊“ ADD Function ” ,并編輯代碼,紅色為手動添加BOOL CLEDDlg:DestroyWindow()/ TODO: Add your specialized code here and/or call the base class CloseHandle(h
24、Led);hLed=INVALID_HANDLE_V ALUE; / 銷毀窗口是關閉 設備句柄return CDialog:DestroyWindow();6、修改 LedDlg.cpp 文件,紅色部分為手動添加/ LEDDlg.cpp : implementation file/#include "stdafx.h" #include "LED.h" #include "LEDDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE =
25、 _FILE_;#endif#define COMMAND_IOCTRL_ARRAYLED2#define COMMAND_IOCTRL_LED3#define COMMAND_IOCTRL_LEDOFF4#define COMMAND_IOCTRL_ARRAYOFF5HANDLE hLed=INV ALID_HANDLE_V ALUE;structshort unsigned int high;short unsigned int low;show_led;/七段數碼管傳送參數shortunsignedLedData=0xc0,0xF9,0xA4,0xB0,0x99 ,0x92,0x82,0
26、xF8,0x80,0x90,0x88 ,0x83,0xC6,0xA1,0x86,0x8E;/ 七段數碼管short unsigned int LedLetter104=/ 點陣數碼管數字字模int0xfe,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;sh
27、ort unsigned int show_array8; / 點陣數碼管傳送參數/LedLetter0=0xfe,0x82,0x82,0xfe;/ CLEDDlg dialogCLEDDlg:CLEDDlg(CWnd* pParent /*=NULL*/): CDialog(CLEDDlg:IDD, pParent)/AFX_DATA_INIT(CLEDDlg)m_show = 0;m_arrayshow = 0;/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hI
28、con = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void CLEDDlg: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_MA
29、PBEGIN_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_MAPEND_MESSAGE_MAP()/ CLEDDlg message handlersBOOL CLEDDlg:OnInitDialog()CDialog:OnIni
30、tDialog();/ Set the icon for this dialog.The framework does this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small iconCenterWindow(GetDesktopWindow(); / center to the hpc screen/ TODO: Add extra initializati
31、on hereif(hLed=INVALID_HANDLE_VALUE)/打開設備hLed=CreateFile(TEXT("LED1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);return TRUE;/ return TRUEunless you set the focus to a control7、修改 LEDDlg.h 文件,紅色字體為手動添加#if !defined(AFX_LEDDLG_H_51CB7AF0_707A_4CC5_982F_7CBA0C2E11C5_INCLUDED_)#define AFX_LEDDLG_H_51CB7AF0_707A_4CC5_982F_7CBA0C2E11
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國褥墊行業市場發展現狀及投資戰略咨詢報告
- 2022-2027年中國蛋白飲料行業市場深度分析及發展戰略規劃報告
- 棕剛玉砂輪項目投資可行性研究分析報告(2024-2030版)
- 中國鋁焊條行業市場調查報告
- 中國位置大數據行業投資潛力分析及行業發展趨勢報告
- 2025年 河南信陽申信發展投資集團有限公司招聘考試筆試試題附答案
- 中國智慧養老行業發展前景及投資戰略咨詢報告
- 精粗紡針織毛紗項目投資可行性研究分析報告(2024-2030版)
- 中國非快充客車行業市場調研分析及投資戰略規劃報告
- 腹腔鏡可行性研究報告
- 雙重預防機制工作實施方案
- 智慧農旅綜合體項目可行性研究報告(參考范文)
- 2025年標準離婚協議書范本完整版
- 四川2024年11月四川南充市人民政府辦公室遴選(考調)工作人員3人國家公務員考試消息筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 2025年云南省保山市隆陽區小升初模擬數學測試卷含解析
- 跨國知識產權爭議解決的國際合作與協調
- 2024年鄭州市公安機關招聘警務輔助人員筆試真題
- 火災解封申請書
- 2025年江蘇鹽城市燕舞集團有限公司招聘筆試參考題庫含答案解析
- 對發生爆炸及發現可疑爆炸物品事件的防范與處理預案
- 整體施工勞務服務方案
評論
0/150
提交評論