版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 嵌入式控制系統(tǒng)課程設計</p><p><b> ------計算器</b></p><p> 學院: 自動化學院 </p><p> 班級: 自1103 </p><p> 2014年7月12日</p><p><b&g
2、t; 摘要</b></p><p> 本設計在Embedded Visual C++集成開發(fā)環(huán)境下編寫程序,通過鍵盤或觸摸</p><p> 屏的輸入,實現(xiàn)計算器的順序計算并且實現(xiàn)判斷優(yōu)先級計算,自動判斷數(shù)據(jù)的正</p><p> 確性(不多于小數(shù)點、數(shù)字以0 開頭、左右括號前出現(xiàn)數(shù)字)及合理性(被除數(shù)</p><p>
3、 為0、單個數(shù)據(jù)超過10 位),在4 位LED 上面輪流顯示8 位計算結果,控制LED</p><p> 燈和驅動LED 數(shù)碼管的應用程序,并在WinCE 平臺下運行,實現(xiàn)在PXA270 實</p><p> 驗箱的數(shù)碼管上和對話框的數(shù)字顯示控件上同步顯示手動輸入的數(shù)字、數(shù)碼管按</p><p> 照預設頻率循環(huán)顯示數(shù)字等功能。</p><
4、p> 關鍵詞:WinCE 操作系統(tǒng)EVC 集成開發(fā)環(huán)境PXA270 實驗箱LED GPIO</p><p><b> 對話編輯框</b></p><p><b> Abstract</b></p><p> This application is attempted implement a calculato
5、r which has the ability to orderly calculate and judge the priority of the calculation, as well as to test the validity and the rationality of the data. It is triggered by the input from the keyboard or the touch screen
6、and programmed in Embedded Visual C++ integrated development environment. Besides, with the Wince platform, it could use 4 LED to indicate the 8-bit outcome of the calculator circularly, control the 4 LED and drive the a
7、pplicatio</p><p> program of the digital LED, so as to complete the mission which aims to show the number keyed by the operator both on the LED of the PXA270 experimental box and the edit box of the screen
8、simultaneously. The application also owns the function to change the color of the number showed in the edit box of the screen in a constant frequency.</p><p> Key words: WinCE OS EVC IDE PXA270 experiment b
9、ox LED</p><p> GPIO Dialogue edit box</p><p><b> 目錄</b></p><p><b> 1 設計目的1</b></p><p> 2 設計功能與設計特色1</p><p> 2.1 設計功能1</p
10、><p> 2.2 設計特色2</p><p> 3 功能模塊設計3</p><p> 3.1 計算器模塊3</p><p> 3.1.1 任務要求3</p><p> 3.1.2 設計思路3</p><p> 3.1.3 程序部分4</p><p>
11、 3.2 顯示模塊(LED 數(shù)碼管)11</p><p> 3.2.1 任務要求11</p><p> 3.2.2 設計思路12</p><p> 3.2.3 程序實現(xiàn)12</p><p><b> 3.3 其他12</b></p><p> 4 使用手冊與測試結果性能分析
12、13</p><p> 4.1 使用手冊13</p><p> 4.2 測試結果性能分析16</p><p><b> 5 小結16</b></p><p> 6 小組中承擔的任務17</p><p><b> 1 設計目的</b></p>&
13、lt;p> (1)通過理論學習、查閱資料、軟件設計、系統(tǒng)調試等環(huán)節(jié),鞏固和提高</p><p> 所學的知識和應用水平,進一步學習和領悟嵌入式程序開發(fā)的方法和流程。全面</p><p> 綜合的應用所學基礎知識,建立起一個完整的嵌入式系統(tǒng)開發(fā)過程的概念。</p><p> ?。?)了解WinCE 操作系統(tǒng)的概念。學會在Embedded Visual C+
14、+集成開發(fā)</p><p> 環(huán)境中開發(fā)應用程序。</p><p> ?。?)通過做實驗,測試應用程序功能,直觀的了解PXA270 實驗設備的組</p><p> 成部分,尤其是課程設計中經(jīng)常用的一些外部設備。</p><p> ?。?)通過課程設計,了解嵌入式編程的特點,并且通過自己的實踐,解決</p><p>
15、 嵌入式編程的各種問題。</p><p> (5)通過完成這個課程設計,要培養(yǎng)分析問題和解決問題的能力;實際動</p><p> 手操作的能力;查閱中外文獻的能力;制定設計方案的能力;計算機應用的能力;</p><p> 設計計算和繪圖的能力;語言文字表達的能力;團隊合作的能力,并能從中得到</p><p><b> 一定
16、的收獲與啟發(fā)。</b></p><p> 2 設計功能與設計特色</p><p><b> 2.1 設計功能</b></p><p> 本次嵌入式控制系統(tǒng)課程設計試圖將老師提供的課程設計題目綜合在一起,</p><p> 以對話框為主界面,利用EVC 編程,盡可能的實現(xiàn)一個集多種功能于一體的綜<
17、/p><p> 合小設計。其功能包括:</p><p> (1)創(chuàng)建了一個計算器,可以實現(xiàn)順序計算與判別優(yōu)先級計算;可以自動</p><p> 判斷數(shù)據(jù)的正確性(如:參加計算的數(shù)不多于10 位,否則提示“數(shù)據(jù)溢出”);</p><p> 提示“算術邏輯錯誤”,在一些常見的錯誤方面,如:數(shù)字以0 開頭,被除數(shù)為</p><
18、;p> 0;有括號優(yōu)先級運算。</p><p> (2)創(chuàng)建文本編輯框,用于顯示運算式及輸出結果,并將文本框的背景色</p><p> 設置為黑色。設置“清零”按鈕控件,用來清除輸入框內容,以便重新輸入新的</p><p> 內容;設置“清除”按鈕控件,用來將前一步輸錯的內容刪除,可以接著輸入正</p><p><b>
19、; 確的內容。</b></p><p> ?。?)創(chuàng)建了一個LED 數(shù)字顯示控件,該控件可以顯示輸入框內輸入的內容</p><p> 及計算器輸出結果,此外結合PXA270 八段數(shù)碼管,將計算內容同時顯示在數(shù)碼</p><p> 管上。創(chuàng)建了一個循環(huán)模塊,其功能是將計數(shù)器的計算結果在PXA270 的4 個八</p><p>
20、 段數(shù)碼管上循環(huán)顯示。循環(huán)方式為右循環(huán),設置循環(huán)間隔時間為任意輸入值。</p><p><b> 2.2 設計特色</b></p><p> 本次設計不僅能夠完成課程設計題目的其中計算機的基本要求,并且我們小</p><p> 組精益求精,將3 項要求結合在一塊,并在原有功能的基礎上進行了修改和完善,</p><p&
21、gt; 實現(xiàn)了更為理想的功能,實現(xiàn)了計算器的各種功能,我們主要的設計特色有:</p><p> (1)本設計功能豐富,分模塊進行,分為計算器、顯示、顏色三個模塊,界面設計以Group Box 控件劃分,界面顯得清楚明了且整齊大方。</p><p> ?。?)在顯示模塊中,含有“清除”、“清零”按鈕,可以方便重新輸入新的</p><p> 內容,而不必關閉對話框
22、再打開輸入,同時這也是考慮到PXA270 實驗箱上鍵盤</p><p> 部分沒有清除鍵而增加的。</p><p> ?。?)在顏色模塊中,用戶通過改變是三個滑條的值,來改變計算機顯示文</p><p> 本框中數(shù)字的顏色。在改變滑動條的同時,可以在右邊的編輯框中顯示當前紅、</p><p> 綠、藍三原色各自的數(shù)值,這樣可以十分準確的
23、改變顏色為用戶需要的顏色。程</p><p> 序設計時分別編寫有改變字體顏色的函數(shù)和改變背景顏色的函數(shù)(已注釋),通</p><p> 過簡單修改即去除注釋,也可完成改變背景顏色的功能,或者同時使用兩種功能。</p><p> ?。?)在數(shù)碼管顯示模塊,可以輪流顯示多于四位的的內容和小數(shù)點,且循</p><p> 環(huán)間隔的時間都不是固
24、定的,可以進行修改,這樣更加有利于用戶在使用時,當</p><p> 不滿足其需求時可以方便修改。</p><p> ?。?)為了處理異常情況,比如說編輯框未輸入內容或輸入不正確的內容,</p><p> 將給出報錯信息,提示輸入正確的內容。</p><p><b> 3 功能模塊設計</b></p>
25、<p><b> 3.1 計算器模塊</b></p><p> 3.1.1 任務要求</p><p> 1)順序計算與判別優(yōu)先級計算:實現(xiàn)加減乘除及括號的計算。</p><p> 2)自動判斷數(shù)據(jù)的正確性及運算過程的正確性:除數(shù)為0,兩個數(shù)之間沒有運</p><p> 算符連接,以及括號處理遇到的各
26、種問題。其中包括括號前沒有出現(xiàn)運算符就出</p><p> 現(xiàn)了數(shù)字,以及括號后也出現(xiàn)了數(shù)字,而沒有進行運算符號的連接;出現(xiàn)了多個</p><p> 小數(shù)點的問題;數(shù)據(jù)溢出的問題。</p><p> 3)實現(xiàn)退格、清零功能。</p><p> 3.1.2 設計思路</p><p><b> 1)界面
27、設計</b></p><p> 計數(shù)器模塊的界面設計如圖3.1,所有控件放在一個組框Group Box 中。</p><p> 圖3.1 計算器界面</p><p> 多個Button 按鈕, 包含數(shù)字“ 0-9 ” 的ID 分別為</p><p> IDC_Button_ZERO/ONE/TWO/ … … /NINE ,
28、 運 算 符 “+-×÷ ” 的 ID 為</p><p> IDC_Button_ADD/SUB/MUL/DIV/Equal ,清零、后退的ID 為IDC_Button_Caption 為“清除”的Button 控件ID 為IDC_Button_CleanIt/IDC_Button_Del 。</p><p><b> 2)程序設計思路</b>
29、;</p><p> 主要由以下部分組成:</p><p> ?。?)根據(jù)返回值,識別出控制鍵與一般字符鍵,作出不同的處理來實現(xiàn)對歷史</p><p><b> 命令的調用。</b></p><p> ?。?)對表達式的預處理:檢查括號的配對情況(正確配對,則前括號與后括號</p><p>
30、 的數(shù)量相同)。負號的處理。</p><p> 3.1.3 程序部分</p><p><b> 它的實現(xiàn)代碼如下:</b></p><p> void CProjectDlg::OnButtonC()</p><p><b> {</b></p><p> // T
31、ODO: Add your control notification handler code here</p><p> CleanIt(); //清除文本框</p><p> Str.Format(_T("%s"),str);</p><p> GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str
32、);</p><p><b> }</b></p><p> void CProjectDlg::OnButtonDiv() //加、減、乘,0-9 的類似,省略</p><p><b> {</b></p><p> // TODO: Add your control notificati
33、on handler code here</p><p> str[strlong] = '/'; //將輸入的字符添加到字符串中</p><p> strlong++; //字符串長度+1</p><p> str[strlong] = '\0'; //添加字符串結束標志</p><p> Str.F
34、ormat(_T("%s"),str); //打印到CString 對象Str 中</p><p> GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str); //將Str 中字符串輸出到編輯框</p><p><b> }</b></p><p> void CProjectD
35、lg::Finish() //計算算式處理主函數(shù)</p><p><b> {</b></p><p> char num[1000]; //記錄獨立數(shù)字字符串</p><p> double suanshi[100]; //記錄由字符串處理成數(shù)字形式的算式</p><p> double number; //記
36、錄由數(shù)字字符換轉換成的數(shù)字</p><p> int bit; //記錄十字字符串的位數(shù)</p><p><b> int i;</b></p><p> double total; //記錄最后計算結果</p><p><b> bit = 0;</b></p><p&
37、gt;<b> l=0;</b></p><p> for (i = 0; str[i]!='\0';i++) //從同開始處理整個字符串成為數(shù)字串</p><p><b> {</b></p><p> if ((str[i]>='0' && str[i] &
38、lt;='9') || str[i] == '.')</p><p> //如果為0~9 或小數(shù)點則加入要處理為數(shù)字的字符串中</p><p><b> {</b></p><p> num[bit]=str[i];</p><p><b> bit++;</b&g
39、t;</p><p><b> }</b></p><p> else //如果為符號則特殊處理</p><p><b> {</b></p><p> if (bit>10) //如果單個數(shù)字串位數(shù)超過10 位,則報溢出錯誤</p><p><b>
40、 {</b></p><p> AfxMessageBox(_T("數(shù)據(jù)溢出"));</p><p><b> return ;</b></p><p><b> }</b></p><p> num[bit] = '\0'; //在數(shù)字串后
41、添加結束標志</p><p> if (str[i]!='(' && (i>0 && str[i-1]!=')'))</p><p> //如果當前字符不為(,或者當前字符前一字符不為),則可以處理當前數(shù)字串</p><p> {//理由是(前或者)后出現(xiàn)數(shù)字,則為算式邏輯錯誤,不允許參與計
42、算</p><p> number = solve(num); //處理當前數(shù)字串成為數(shù)字</p><p> if (number==-1)</p><p> //若返回為-1 則是數(shù)字串出現(xiàn)錯位,原因是小數(shù)點多于一個,詳見solve()</p><p> { //則提示邏輯錯誤,結束計算</p><p>
43、AfxMessageBox(_T("算式邏輯錯誤"));</p><p><b> return ;</b></p><p><b> }</b></p><p> suanshi[l]=number; //將處理得到的浮點型數(shù)加入數(shù)字算式傳中</p><p> l++;
44、 //數(shù)字算式串程度+1</p><p><b> }</b></p><p> else if (str[i]=='(' && bit>0)</p><p> //當前符號為(,并且數(shù)字串位數(shù)大于0,即(前出現(xiàn)數(shù)字,則返回邏輯錯誤,結束</p><p><b>
45、{</b></p><p> AfxMessageBox(_T("算式邏輯錯誤"));</p><p><b> return ;</b></p><p><b> }</b></p><p> else if (str[i]==')' &am
46、p;& str[i+1]!='\0' && str[i+1]>'0' && str[i+1]<'9')</p><p> //若當前符號為),并且字符串后一位沒有結束</p><p> { //并且后一位為數(shù)字,則提示邏輯錯誤,結束</p><p> AfxMe
47、ssageBox(_T("算式邏輯錯誤")); //理由詳見上</p><p><b> return ;</b></p><p><b> }</b></p><p> switch (str[i])</p><p> //如果沒有出現(xiàn)以上不合法操作,則將當前符號,以特
48、殊數(shù)字的方式加入數(shù)字算式串</p><p><b> {</b></p><p> case '+':suanshi[l] = -1;break;</p><p> case '-':suanshi[l] = -2;break;</p><p> case '*':
49、suanshi[l] = -3;break;</p><p> case '/':suanshi[l] = -4;break;</p><p> case '(':suanshi[l] = -5;break;</p><p> case ')':suanshi[l] = -6;break;</p>
50、<p> default:break;</p><p><b> }</b></p><p><b> l++;</b></p><p><b> bit = 0;</b></p><p><b> }</b></p>&
51、lt;p><b> }</b></p><p> num[bit] = '\0';//給算式結束后最后的一個數(shù)字進行處理</p><p> if (i>0 && str[i-1]!=')') //處理方式同上</p><p><b> {</b></
52、p><p> number = solve(num);</p><p> if (number==-1)</p><p><b> {</b></p><p> AfxMessageBox(_T("算式邏輯錯誤"));</p><p><b> return ;
53、</b></p><p><b> }</b></p><p> suanshi[l]=number;</p><p><b> l++;</b></p><p><b> }</b></p><p> total = 0.0; /
54、/給計算結果清零</p><p> total = tryit(suanshi); //對算式進行計算,詳見tryit()</p><p> if (n<l && suss)</p><p> //如果n<l,suss 為真,即算式?jīng)]有計算完成就跳出,多余了反括號,報錯</p><p><b>
55、{</b></p><p> AfxMessageBox(_T("算式邏輯錯誤"));</p><p><b> return ;</b></p><p><b> }</b></p><p> Str.Format(_T("%0.5lf"
56、),total); //將得到的結果打印到Str 中</p><p> GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str); //將Str 中字符串輸出到Edit 框</p><p><b> 中</b></p><p> LEDDisplay(); //數(shù)碼管顯示</p><
57、;p><b> }</b></p><p> double CProjectDlg::tryit(double *suanshi) //加減計算主函數(shù),將括號、乘除法視為</p><p> 獨立數(shù)字進行加減運算</p><p><b> {</b></p><p> double t
58、otal=0;</p><p> if (suanshi[n]>=0) //若算式開始第一位是數(shù)字</p><p><b> {</b></p><p> total=calculate(suanshi); //直接開始計算以這個數(shù)字為主的部分</p><p> if (suanshi[n]==-6) //
59、如果計算結束后的負號為),則后移一位</p><p><b> n++;</b></p><p><b> }</b></p><p> while (n<l && suss) //如果算式?jīng)]有處理完,并且沒有出現(xiàn)除數(shù)為0 時,繼續(xù)運算</p><p><b>
60、 {</b></p><p> if (suanshi[n]==-1) //當符號為+時</p><p><b> {</b></p><p><b> n++;</b></p><p> total+=calculate(suanshi);</p><p&
61、gt;<b> }</b></p><p> else if (suanshi[n] == -2) //當符號為-時</p><p><b> {</b></p><p><b> n++;</b></p><p> total -= calculate(suansh
62、i);</p><p><b> }</b></p><p> else if (suanshi[n] == -5) //當整個數(shù)字算式第一位就為(時</p><p><b> {</b></p><p> total=calculate(suanshi);</p><p
63、><b> n++;</b></p><p><b> }</b></p><p> else if (suanshi[n] == -6) //當符號為),跳出當前子部分計算</p><p><b> {</b></p><p><b> break;
64、</b></p><p><b> }</b></p><p> else if (suanshi[n]>0) //當當前位為數(shù)字時,出現(xiàn)算式邏輯錯誤,理由是</p><p> 不可能處理出連續(xù)兩個數(shù)字,兩個數(shù)字必須由符號隔開</p><p><b> {</b></
65、p><p> AfxMessageBox(_T("算式邏輯錯誤"));</p><p> suss = false;</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }&
66、lt;/b></p><p> return total;</p><p><b> }</b></p><p> double CProjectDlg::calculate(double *suanshi) //數(shù)字子部分的乘除運算</p><p><b> {</b></p&
67、gt;<p> double number;</p><p> if (suanshi[n] == -5) //當子部分算式第一位為(時,調用tryit 對子部分進行遞歸運算</p><p><b> {</b></p><p><b> n++;</b></p><p>
68、number=tryit(suanshi);</p><p><b> }</b></p><p> else number = suanshi[n];//當子部分算式第一位為數(shù)字時,直接加入子部分結果中</p><p> while (n<l)</p><p><b> {</b>&
69、lt;/p><p> if (suanshi[n]>-3 && suanshi[n]<0)</p><p> //當符號位出現(xiàn)+-號時,跳出子部分處理,回到加減處理中</p><p><b> {</b></p><p><b> break;</b></p&g
70、t;<p><b> }</b></p><p><b> n++;</b></p><p> if (n==l) //當n 等于l 時,結束運算</p><p><b> break;</b></p><p> if (suanshi[n]>-3
71、)</p><p> //當符號位出現(xiàn)數(shù)字,或者加減號時,結束子部分處理,回到加減處理中</p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b></p><p> if (su
72、anshi[n]==-3) //當符號為*號時</p><p><b> {</b></p><p><b> n++;</b></p><p> number*=calculate(suanshi); //使用遞歸運算,處理乘號后可能出現(xiàn)括號</p><p><b> }<
73、/b></p><p> else if (suanshi[n]==-4) //當符號為/號</p><p><b> {</b></p><p><b> n++;</b></p><p> if (suanshi[n]==0) //當除數(shù)為0 時,返回錯誤</p>&
74、lt;p><b> {</b></p><p> AfxMessageBox(_T("算式邏輯錯誤"));</p><p> suss = false;</p><p><b> return 0;</b></p><p><b> }</b>
75、;</p><p> if (suanshi[n]>0) //當除號后為數(shù)字</p><p><b> {</b></p><p> number/=suanshi[n]; //直接除掉,不能遞歸</p><p><b> }</b></p><p> els
76、e if (suanshi[n]==-5)</p><p> //當除號后出現(xiàn)括號,則進行遞歸,防止出現(xiàn)算式優(yōu)先級錯誤</p><p> number/=calculate(suanshi);</p><p><b> }</b></p><p> else if (suanshi[n]==-5) //當數(shù)字位后
77、出現(xiàn)(,則是邏輯錯誤,結束</p><p><b> {</b></p><p> AfxMessageBox(_T("算式邏輯錯誤"));</p><p> suss = false;</p><p><b> return 0;</b></p><
78、p><b> }</b></p><p> if (suanshi[n]==-6) //當出現(xiàn))時,結束子部分的計算,跳出</p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b&
79、gt;</p><p><b> }</b></p><p> return number; //返回子部分的計算值</p><p><b> }</b></p><p> double CProjectDlg::solve(char *num) //將字符串處理為數(shù)字</p>
80、<p><b> {</b></p><p> double number=0;</p><p> double xiaoshu = 0;</p><p><b> int i,j;</b></p><p> for (i = 0;num[i]!='\0' &a
81、mp;& num[i]!='.';i++)</p><p><b> {</b></p><p> number=number*10+num[i]-'0';</p><p><b> }</b></p><p> if (num[i]=='.&
82、#39;) //處理小數(shù)點后的數(shù)</p><p><b> {</b></p><p> for (j=i+1;num[j]!='\0';j++)</p><p><b> {</b></p><p> if (num[j]=='.') //如果小數(shù)點后的數(shù)中
83、又出現(xiàn)小數(shù)點,報錯</p><p> return -1;</p><p> xiaoshu=xiaoshu*10+num[j]-'0';</p><p><b> }</b></p><p> for (j=i+1;num[j]!='\0';j++)</p><
84、;p><b> {</b></p><p> xiaoshu/=10.0;</p><p><b> 31</b></p><p><b> }</b></p><p> number+=xiaoshu;</p><p><b>
85、; }</b></p><p> return number; //返回轉換值</p><p><b> }</b></p><p> void CProjectDlg::CleanIt()</p><p><b> {</b></p><p> st
86、r[0]='\0';</p><p><b> n=0;</b></p><p><b> l=0;</b></p><p> strlong = 0;</p><p> suss = true;</p><p> times = 0;</p&
87、gt;<p> m_bValue = true;</p><p><b> T = 0;</b></p><p><b> }</b></p><p> void CProjectDlg::OnButtonEqual()</p><p><b> {</b&g
88、t;</p><p> // TODO: Add your control notification handler code here</p><p> str[strlong] = '\0'; //等于號被按下是,進行計算,并且清除一部分記錄</p><p><b> Finish();</b></p>
89、<p> CleanIt();</p><p><b> }</b></p><p> BOOL CProjectDlg::PreTranslateMessage(MSG* pMsg) //鍵盤的消息響應</p><p><b> {</b></p><p> // TODO:
90、Add your specialized code here and/or call the base class</p><p> if (pMsg->message == WM_KEYDOWN)</p><p><b> {</b></p><p> switch (pMsg->wParam)</p><
91、;p><b> {</b></p><p> case VK_NUMPAD0 :str[strlong] = '0';break;</p><p> case VK_NUMPAD1 :str[strlong] = '1';break;</p><p> case VK_NUMPAD2 :str[st
92、rlong] = '2';break;</p><p> case VK_NUMPAD3 :str[strlong] = '3';break;</p><p> case VK_NUMPAD4 :str[strlong] = '4';break;</p><p> case VK_NUMPAD5 :str[str
93、long] = '5';break;</p><p> case VK_NUMPAD6 :str[strlong] = '6';break;</p><p> case VK_NUMPAD7 :str[strlong] = '7';break;</p><p> case VK_NUMPAD8 :str[strl
94、ong] = '8';break;</p><p> case VK_NUMPAD9 :str[strlong] = '9';break;</p><p> case VK_ADD :str[strlong] = '+';break;</p><p> case VK_SUBTRACT:str[strlong]
95、= '-';break;</p><p> case VK_MULTIPLY:str[strlong] = '*';break;</p><p> case VK_DIVIDE :str[strlong] = '/';break;</p><p> case VK_DECIMAL :str[strlong] =
96、'.';break;</p><p> case VK_RETURN :</p><p> if (::GetDlgCtrlID(pMsg->hwnd)!=IDC_BUTTON_EQUAL)</p><p><b> {</b></p><p> GotoDlgCtrl(GetDlgItem
97、(IDC_BUTTON_EQUAL));</p><p><b> }</b></p><p> OnButtonEqual();</p><p> return FALSE;break;</p><p> default:return CDialog::PreTranslateMessage(pMsg);bre
98、ak;</p><p><b> }</b></p><p> strlong++;</p><p> str[strlong] = '\0';</p><p> Str.Format(_T("%s"),str);</p><p> GetDlgIte
99、m(IDC_EDIT_CAL)->SetWindowText(Str);</p><p><b> }</b></p><p> return CDialog::PreTranslateMessage(pMsg);</p><p><b> }</b></p><p> void CP
100、rojectDlg::OnButtonPoint() //添加小數(shù)點進字符串</p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> str[strlong] = '.';</p>
101、<p> strlong++;</p><p> str[strlong] = '\0';</p><p> Str.Format(_T("%s"),str);</p><p> GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);</p><p
102、><b> }</b></p><p> void CProjectDlg::OnButtonDel() //退格</p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p>&
103、lt;p> (strlong>0)?(strlong--):(strlong=strlong); //當字符串長度不為0 時,字符串長度-1,</p><p><b> 添加結束標志</b></p><p> str[strlong] = '\0';</p><p> Str.Format(_T("
104、%s"),str);</p><p> GetDlgItem(IDC_EDIT_CAL)->SetWindowText(Str);</p><p><b> }</b></p><p> 3.2 顯示模塊(LED 數(shù)碼管)</p><p> 3.2.1 任務要求</p><p&
105、gt; 1)LED 數(shù)碼管驅動程序:實現(xiàn)在目標板上的LED 數(shù)碼管顯示計數(shù)器輸入的運</p><p> 算符及計算后的結果。如果超過四位,則輪流顯示。</p><p> 3.2.2 設計思路</p><p> 這個模塊,即綜合了實驗8 和實驗9 的內容。</p><p> 計數(shù)器模塊的界面設計如圖3.1 中,為了將整個模塊綜合起來,
106、當“=”按鍵按下時,實現(xiàn)LED 的顯示。</p><p> 數(shù)碼管顯示的關鍵部分是如何顯示4 位數(shù)之后的部分,就要用到輪流顯示,</p><p> 每次裝入緩沖4 位數(shù)字(包括小數(shù)點),通過定時器,可以設置停留時間的不一樣,第一組數(shù)據(jù)停的時間長一點,后面的稍微短些。</p><p> 3.2.3 程序實現(xiàn)</p><p> void
107、CProjectDlg::LEDDisplay() //LED 顯示函數(shù)</p><p><b> {</b></p><p> int i,j,len;</p><p> BYTE data[4];</p><p> DWORD bytes;</p><p> len = Str.Ge
108、tLength(); //獲取計算結果的字符串長度</p><p> for (i=0;i<len-3;i++) //從字符串0 位顯示到len-3 位,每次顯示四位數(shù)</p><p><b> {</b></p><p> memset(data,0,4); //緩沖清0</p><p> for (j=
109、i;j<i+4;j++) //依次將要顯示的四位寫入緩沖</p><p><b> {</b></p><p> if (Str[j]!='.')</p><p> data[j-i] = ledfont[Str[j]-'0'];</p><p> else data[j-i
110、] = 0x01; //當前位為小數(shù)點時</p><p><b> }</b></p><p> WriteFile(m_hDev,data,4,&bytes,NULL); //將緩沖區(qū)數(shù)據(jù)以流形式寫入外設</p><p><b> if (i==0)</b></p><p> Sl
111、eep(3000); //如果為最前四位,顯示3 秒</p><p> else Sleep(500); //每前進一位停留0.5 秒</p><p><b> }</b></p><p><b> }</b></p><p><b> 3.3 其他</b></p
112、><p> (1)打開設備并做確認</p><p> 因為我們的設計中要驅動PXA270 實驗箱上的八段數(shù)碼管和LED 燈,因此</p><p> 在對話框初始化的時候需要打開設備,并做一個確認,如果失敗,則彈出提示對</p><p> 話框。這部分程序代碼添加在OnInitDialog 中,實現(xiàn)代碼如下:</p><
113、p> m_hDev = CreateFile(_T("LED2:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);</p><p> //初始化外設數(shù)碼管,掛載外設,建立流連接</p><p> if (m_hDev == INVALID_HANDLE_VALUE)</p><p> //如果返回
114、值為失敗,輸出打開設備失敗</p><p><b> {</b></p><p> AfxMessageBox(_T("打開設備失敗"));</p><p><b> }</b></p><p><b> m_hDevL =</b></p>
115、;<p> CreateFile(_T("GIO1:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);</p><p> //初始化LED 燈,掛載</p><p> if (m_hDevL == INVALID_HANDLE_VALUE)</p><p><b> {</
116、b></p><p> AfxMessageBox(_T("打開設備失敗LED"));</p><p><b> }</b></p><p> (2)添加處理窗口失敗的響應函數(shù)</p><p> 選擇View -Class Wizard,在彈出的對話框中,添加系統(tǒng)用來處理窗口失敗<
117、/p><p> 時發(fā)送的消息WM_DESTORY,點擊“Add Function”,再點擊“Edit Code”。添</p><p><b> 加代碼如下:</b></p><p> void CProjectDlg::OnDestroy()</p><p><b> {</b></p&g
118、t;<p> CDialog::OnDestroy();</p><p> // TODO: Add your message handler code here</p><p> CloseHandle(m_hDev);</p><p><b> }</b></p><p> 4 使用手冊與測試
119、結果性能分析</p><p><b> 4.1 使用手冊</b></p><p> 通過設計對話框界面、查閱相關書籍,編寫控件程序、不斷調試,完善設計</p><p> 功能,最終我們小組完成的對話框界面如圖3.1。下面具體說明此操作界面的使</p><p><b> 用方法。</b><
120、;/p><p> (1)雙擊打開WinCE 系統(tǒng)“我的電腦”中“pro.exe”文件,顯示如圖4.1 的</p><p> 界面?;蛘唿c擊本地電腦Windows CE 的軟件運行,也可以直接彈出本地的運行</p><p><b> 程序。</b></p><p> (2)在Display 模塊中,通過鍵盤或是界面輸入
121、合理的運算表達式,可以看到</p><p> 在結果框顯示,輸入“=”,可在結果框中顯示,同時在PXA270 實驗箱的八段數(shù)</p><p> 碼管也顯示,測試結果如圖4.2。</p><p> 圖3.1 計算器界面</p><p> 圖4.1 一般計算結果顯示 圖4.2 超過四位計算結果顯示<
122、;/p><p> 圖4.3 除數(shù)為零計算結果顯示</p><p> 圖4.4 數(shù)碼管移位顯示</p><p> (3)當計算結果小于9999且除數(shù)非零時,輸出結果與圖4.1類似,圖中為6×8的結果。</p><p> ?。?)當計算結果大于9999且除數(shù)非零時,輸出結果與圖4.2類似,溢出位在實驗箱的數(shù)碼管上不顯示。</p&
123、gt;<p> ?。?)當除數(shù)為零時,計算結果如圖4.3所示,彈出警報窗口。</p><p> ?。?)在左下角的文本框中輸入時間,單位為毫秒,在倒數(shù)第二排文本框輸入四個值,點擊OK,文本框中的四個數(shù)字分別顯示在對應的數(shù)碼管上,且按照預設時間間隔右移。如圖4.4所示。</p><p> 4.2 測試結果性能分析</p><p> 通過測試,很明顯的
124、看到我們的設計能夠很好地完成課程設計題目的要求。</p><p> 主要實現(xiàn)了計數(shù)器的功能,同時結合LED 數(shù)碼管驅動程序和LED 數(shù)字顯示控件,</p><p> 把二者的功能進行整合,既能實現(xiàn)LED 數(shù)字顯示控件和PXA270 實驗箱八段數(shù)</p><p> 碼管同時顯示數(shù)字,又擴展性的完成了不同數(shù)字在八段數(shù)碼管上按照預設的頻率</p>&l
125、t;p> 循環(huán)。此外,為了完善功能,美化界面,方便用戶使用,還增加了滑動條,用于</p><p> 改變文本顏色和文本背景顏色以及設置了“清除”、“后退”等按鈕??偟膩碚f,</p><p> 這是一個集多種功能于一體的設計。</p><p><b> 5 小結</b></p><p> 通過完成這次嵌入式
126、控制系統(tǒng)課程設計,我覺得自己學到很多東西,現(xiàn)總結</p><p><b> 如下:</b></p><p> (1)此次課程設計和前期的實驗都是建立在PXA270 實驗箱和WinCE 嵌入式</p><p> 操作系統(tǒng)上的,因此我們更加直觀的了解了PXA270 的硬件組成,結合課本上的</p><p> 知識更加
127、深刻的理解了WinCE 操作系統(tǒng)。</p><p> (2)我們的設計是在Embedded Visual C++集成開發(fā)環(huán)境下完成的,我們發(fā)現(xiàn)</p><p> EVC 的編程和以前學過的C 語言、VB 語言編程都不太一樣,因此也借這次課程</p><p> 設計的機會,學習到一些C++編程的方法,比如如何新建工程,如何添加控件,</p><
128、;p> 如何添加消息響應函數(shù)等等。</p><p> (3)這一次課程設計用到的相關知識很多都是沒有學過的,尤其是一些功能</p><p> 函數(shù),比如UpdateData()、OnCtlColor()、SetTimer()等,但是我們小組并沒有退</p><p> 縮,而是盡自己最大努力,通過在圖書館查閱書籍、上網(wǎng)搜索資料以及詢問老師</p&g
129、t;<p> 等方法逐一的解決問題,也算是培養(yǎng)了自己解決問題的能力。</p><p> (4)這個課程設計報告是嚴格按照畢業(yè)設計的格式來撰寫的,這讓我對報告</p><p> 的組成部分和格式要求有了一定的了解,也對以后書寫畢業(yè)設計打下基礎。</p><p> (5)做這個課程設計給我的體會是: 本次課程設計除了學習到了大量的嵌入</p&
130、gt;<p> 式知識外,也充分認識到了團隊合作的重要性。在課程設計中,大家發(fā)揮各自的</p><p> 長處,分工合作,克服了時間短、任務重的困難,最終較好的完成了這次課程設</p><p><b> 計。</b></p><p><b> 參考文獻</b></p><p>
131、 [1]歐陽志宏,董霖,鐘俊華. MFC 程序設計輕松入門[M].北京:人民郵電出版</p><p><b> 社,2009</b></p><p> [2]任哲. MFC Windows 應用程序設計[M].北京:清華大學出版社,2007</p><p> [3]陳浩杰. Visual C++ 6.0 程序設計[M].北京:科學出版社
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論