2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院</p><p><b>  硬件課程設(shè)計(jì)報(bào)告</b></p><p>  姓 名: 學(xué) 號(hào): </p><p>  專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p>  班 級(jí): 計(jì)科 班   </p

2、><p>  設(shè)計(jì)題目: 電子計(jì)算器 </p><p>  成 員: </p><p>  指導(dǎo)教師: 職 稱: </p><p>  年 月 </p><p>  課程設(shè)計(jì)指導(dǎo)教師評(píng)閱書(shū)</p>

3、<p><b>  指導(dǎo)教師評(píng)語(yǔ):</b></p><p>  成 績(jī): 指導(dǎo)教師簽字:</p><p>  年 月 </p><p><b>  摘 要</b></p><p>  電子計(jì)算器的設(shè)計(jì)主要分為鍵盤(pán)掃描與讀取編碼、

4、七段LED數(shù)碼管顯示和四則運(yùn)算的編寫(xiě)。這次設(shè)計(jì)中我們采用可編程接口芯片8255鏈接4*4鍵盤(pán)和LED顯示屏,從鍵盤(pán)掃描讀入數(shù)字,在顯示屏上面顯示出來(lái),并通過(guò)cpu運(yùn)算出結(jié)果顯示在屏幕上。由于對(duì)匯編語(yǔ)言也不甚了解,只是進(jìn)行一些簡(jiǎn)單的自然數(shù)的四則運(yùn)算。</p><p>  由于本次實(shí)驗(yàn)中,實(shí)驗(yàn)箱是TPC-ZK綜合微機(jī)開(kāi)放式實(shí)驗(yàn)系統(tǒng),微機(jī)接口實(shí)驗(yàn)儀采用模塊化、積木式的結(jié)構(gòu),各實(shí)塊互不影響。但可通過(guò)連線將各實(shí)驗(yàn)?zāi)K有機(jī)組

5、合起來(lái),進(jìn)行微機(jī)外圍接口實(shí)驗(yàn)。這個(gè)實(shí)驗(yàn)選擇的是4*4鍵盤(pán)連接上8255A然后控制LED顯示。</p><p>  關(guān)鍵詞:8255A ;七段LED數(shù)碼管 ;鍵盤(pán) ;匯編語(yǔ)言 ;四則運(yùn)算</p><p><b>  目 錄</b></p><p>  1 設(shè)計(jì)任務(wù)與要求………………………………………………………………………3</p&g

6、t;<p>  1.1選題………………………………………………………………………………3</p><p>  1.2需求分析……………………………………………………………………………3</p><p>  1.3設(shè)計(jì)任務(wù)……………………………………………………………………………3</p><p>  2硬件方案………………………………………………………

7、……………3</p><p>  2.1微處理器8086芯片……………………………………………………………3</p><p>  2.2 可編程并行接口8255A芯片……………………………………………………4</p><p>  2.3 4*4矩陣鍵盤(pán)……………………………………………………………………6</p><p>  2.4 七段L

8、ED數(shù)碼管…………………………………………………………………7</p><p>  2.5 電路及其功能模塊圖……………………………………………………………8</p><p>  3軟件方案………………………………………………………………………10</p><p>  3.1流程圖……………………………………………………………………………10</p>

9、<p>  3.2源程序代碼………………………………………………………………………11</p><p>  4 問(wèn)題與解決方案……………………………………………………………………26</p><p>  5 成果展示……………………………………………………………………………26</p><p>  6 總結(jié)…………………………………………………………………

10、………………27</p><p>  7 心得體會(huì)與收獲……………………………………………………………………27</p><p>  8參考文獻(xiàn)……………………………………………………………………………27</p><p>  1 設(shè)計(jì)任務(wù)與設(shè)計(jì)要求</p><p><b>  1.1選題</b></p>

11、<p>  我選的題目是電子計(jì)算器,電子計(jì)算器的設(shè)計(jì)主要分為鍵盤(pán)編碼、七段數(shù)碼管顯示、和四則運(yùn)算法則這三部分。設(shè)計(jì)時(shí)用可編程接口芯片8255A鏈接4*4鍵盤(pán)和七段LED數(shù)碼管,8255掃描鍵盤(pán)并通過(guò)數(shù)碼管顯示相應(yīng)的數(shù)字,這其中需要一定的匯編程序作為核心支撐,才能正確的使各種功能運(yùn)行正常。</p><p><b>  1.2需求分析</b></p><p> 

12、 通過(guò)對(duì)選題的深入了解,電子計(jì)算器基本功能可以概括為:</p><p>  可以進(jìn)行簡(jiǎn)單的加、減、乘、除四則運(yùn)算;</p><p>  為了顯示的人性化,按下每個(gè)數(shù)字都要進(jìn)行反饋顯示;</p><p>  數(shù)碼管只有四位顯示,運(yùn)算數(shù)和結(jié)果應(yīng)盡量小于四位數(shù),不然顯示不全;</p><p>  計(jì)算器能判斷個(gè)別簡(jiǎn)單的錯(cuò)誤,如除數(shù)為零,顯示報(bào)錯(cuò);&

13、lt;/p><p>  計(jì)算器要有清零功能,可以在按鍵失誤后重新按鍵。</p><p>  在顯示屏上可以及時(shí)反饋按下數(shù)字,這需要掃描程序模塊一直運(yùn)行著,并能夠及時(shí)調(diào)用顯示程序模塊,當(dāng)有運(yùn)算符號(hào)按下時(shí)還要及時(shí)給之前按下的數(shù)字進(jìn)行組裝成一個(gè)數(shù)值,組裝鍵值模塊也是程序的重要所在。等等這些都是在主程序下合理安排、運(yùn)用流暢的,才能帶來(lái)較完美的計(jì)算器體驗(yàn)。</p><p><

14、;b>  1.3設(shè)計(jì)任務(wù)</b></p><p>  本次實(shí)驗(yàn)我分為電路設(shè)計(jì)和編碼設(shè)計(jì)這兩個(gè)任務(wù)模塊來(lái)設(shè)計(jì)的。</p><p>  電路設(shè)計(jì)主要研究鍵盤(pán)按鍵位置設(shè)計(jì)和各個(gè)芯片器件之間的連線。</p><p>  編碼設(shè)計(jì)主要分為鍵盤(pán)掃描讀取編碼、七段數(shù)碼管顯示編碼和四則運(yùn)算編碼。</p><p><b>  2 硬

15、件方案</b></p><p>  2.1微處理器8086芯片</p><p>  當(dāng)引腳接高電平時(shí),CPU工作于最小模式。此時(shí),引腳信號(hào)24~31的含義及其功能如下: </p><p> ?。?)IO/M:存儲(chǔ)器、I/O端口選擇控制信號(hào)。信號(hào)指明當(dāng)前CPU是選擇訪問(wèn)存儲(chǔ)器還是訪問(wèn)I/O端口。為高電平時(shí)訪問(wèn)存儲(chǔ)器,表示當(dāng)前要進(jìn)行CPU與存儲(chǔ)器之間的數(shù)據(jù)傳

16、送。為低電平時(shí),訪問(wèn)I/O端口,表示當(dāng)前要進(jìn)行CPU與I/O端口之間的數(shù)據(jù)傳送。 </p><p> ?。?)WR:寫(xiě)信號(hào),輸出,低電平有效。信號(hào)有效時(shí),表明CPU正在執(zhí)行寫(xiě)總線周期,同時(shí)由信號(hào)決定是對(duì)存儲(chǔ)器還是對(duì)I/O端口執(zhí)行寫(xiě)操作。</p><p> ?。?)INTA:可屏蔽中斷響應(yīng)信號(hào),輸出,低電平有效。 CPU通過(guò)信號(hào)對(duì)外設(shè)提出的可屏蔽中斷請(qǐng)求做出響應(yīng)。為低電平時(shí),表示CPU已經(jīng)響

17、應(yīng)外設(shè)的中斷請(qǐng)求,即將執(zhí)行中斷服務(wù)程序。 </p><p> ?。?)ALE:地址鎖存允許信號(hào),輸出,高電平有效。 CPU利用ALE信號(hào)可以把AD15 ~AD0地址/數(shù)據(jù)、A19/S6~A16/S3地址/狀態(tài)線上的地址信息鎖存在地址鎖存器中。 </p><p> ?。?)DT:數(shù)據(jù)發(fā)送/接收信號(hào),輸出,三態(tài)。DT/信號(hào)用來(lái)控制數(shù)據(jù)傳送的方向。DT/為高電平時(shí),CPU發(fā)送數(shù)據(jù)到存儲(chǔ)器或I/O

18、端口;DT/為低電平時(shí),CPU接收來(lái)自存儲(chǔ)器或I/O端口的數(shù)據(jù)。 </p><p>  (6)DEN:數(shù)據(jù)允許控制信號(hào),輸出,三態(tài),低電平有效。信號(hào)用作總線收發(fā)器的選通控制信號(hào)。當(dāng)為低電平時(shí),表明CPU進(jìn)行數(shù)據(jù)的讀/寫(xiě)操作。 </p><p> ?。?)HOLD:總線保持請(qǐng)求信號(hào),輸入,高電平有效。在DMA數(shù)據(jù)傳送方式中,由總線控制器8237A發(fā)出一個(gè)高電平有效的總線請(qǐng)求信號(hào),通過(guò)HOLD

19、引腳輸入到CPU,請(qǐng)求CPU讓出總線控制權(quán)。 </p><p> ?。?)HLDA:總線保持響應(yīng)信號(hào),輸出,高電平有效。HLDA是與HOLD配合使用的聯(lián)絡(luò)信號(hào)。在HLDA有效期間,HLDA引腳輸出一個(gè)高電平有效的響應(yīng)信號(hào),同時(shí)總線將處于浮空狀態(tài),CPU讓出對(duì)總線的控制權(quán),將其交付給申請(qǐng)使用總線的8237A控制器使用,總線使用完后,會(huì)使HOLD信號(hào)變?yōu)榈碗娖?,CPU又重新獲得對(duì)總線的控制權(quán)。</p>

20、<p>  2.2 可編程并行接口8255A芯片</p><p>  8255A可為8086微處理器與外部設(shè)備之間提供并行輸入/輸出的通道。通過(guò)編程可以設(shè)置芯片的工作方式,因此,用8255A連接外部設(shè)備時(shí),通常不用再附加外部電路。并行接口是在多根數(shù)據(jù)線上,以數(shù)據(jù)字節(jié)/字與I/O設(shè)備交換信息。</p><p>  在輸入過(guò)程中,輸入設(shè)備把數(shù)據(jù)送給接口,并且使?fàn)顟B(tài)線“輸入準(zhǔn)備好”有效

21、。接口把數(shù)據(jù)存放在“輸入緩沖寄存器”中,同時(shí)使“輸入回答”線有效,作為對(duì)外設(shè)的響應(yīng)。外設(shè)在收到這個(gè)回答信號(hào)后,就撤消數(shù)據(jù)和“輸入準(zhǔn)備好”信號(hào)。數(shù)據(jù)到達(dá)接口中后,接口會(huì)在“狀態(tài)寄存器”中設(shè)置輸入準(zhǔn)備好標(biāo)志,或者向CPU發(fā)一個(gè)中斷請(qǐng)求。CPU可用查詢方式或中斷方式從接口中讀取數(shù)據(jù)。接口中的數(shù)據(jù)被讀取后,接口會(huì)自動(dòng)清除狀態(tài)寄存器中的標(biāo)志,且撤消對(duì)CPU的中斷請(qǐng)求。</p><p>  在輸出過(guò)程中,每當(dāng)輸出寄存器可以接

22、收數(shù)據(jù),接口就會(huì)將狀態(tài)寄存器中“輸出準(zhǔn)備好”狀態(tài)置1或向CPU發(fā)一個(gè)中斷請(qǐng)求,CPU可用查詢或中斷方式向接口輸出數(shù)據(jù)。當(dāng)CPU輸出的數(shù)據(jù)到達(dá)接口后,接口會(huì)清除“輸出準(zhǔn)備好”狀態(tài),把數(shù)據(jù)送往外設(shè),并向外設(shè)發(fā)一個(gè)“數(shù)據(jù)輸出準(zhǔn)備好”信號(hào)。外設(shè)受到驅(qū)動(dòng)后,便接收數(shù)據(jù),并向接口電路發(fā)一個(gè)“輸出回答”信號(hào),接口收到該回答信號(hào)后,又將狀態(tài)寄存器中“輸出準(zhǔn)備好”置位,以便CPU輸出下一個(gè)數(shù)據(jù)。</p><p>  8255A的一

23、些引腳</p><p>  RESET:復(fù)位輸入線,當(dāng)該輸入端外于高電平時(shí),所有內(nèi)部寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成輸入方式。</p><p>  PA0~PA7:端口A 輸入輸出線,一個(gè)8 位的數(shù)據(jù)輸出鎖存器/緩沖器, 一個(gè) 8 位的數(shù)據(jù)輸入鎖存器。</p><p>  PB0~PB7:端口B 輸入輸出線,一個(gè)8 位的I/O 鎖存器, 一個(gè)

24、 8 位的輸入輸出緩沖器。</p><p>  PC0~PC7:端口C 輸入輸出線,一個(gè)8 位的數(shù)據(jù)輸出鎖存器/緩沖器, 一個(gè) 8 位的數(shù)據(jù)輸入緩沖器。端口C 可以通過(guò)工作方式設(shè)定而分成2 個(gè)4 位的端口, 每個(gè) 4 位的端口包含一個(gè)4 位的鎖存器,分別與端口A 和端口B 配合使用,可作為控制信號(hào)輸出或狀態(tài)信號(hào)輸入端口。</p><p>  CS:片選信號(hào)線,當(dāng)這個(gè)輸入引腳為低電平時(shí),表示

25、芯片被選中,允許8255 與CPU 進(jìn)行通訊。</p><p>  圖2-1 8255A管腳圖</p><p>  RD:讀信號(hào)線,當(dāng)這個(gè)輸入引腳為低電平時(shí),允許8255 通過(guò)數(shù)據(jù)總線向CPU 發(fā)送數(shù)據(jù)或狀態(tài)信息,即CPU 從8255 讀取信息或數(shù)據(jù)。</p><p>  WR:寫(xiě)入信號(hào),當(dāng)這個(gè)輸入引腳為低電平時(shí),允許CPU 將數(shù)據(jù)或控制字寫(xiě)8255。</p&

26、gt;<p>  D0~D7:三態(tài)雙向數(shù)據(jù)總線,8255 與CPU 數(shù)據(jù)傳送的通道,當(dāng)CPU 執(zhí)行輸入輸出指令時(shí),通過(guò)它實(shí)現(xiàn)8 位數(shù)據(jù)的讀/寫(xiě)操作,控制字和狀態(tài)信息也通過(guò)數(shù)據(jù)總線傳送。</p><p>  8255A的讀寫(xiě)控制:</p><p>  8255A的讀/寫(xiě)控制邏輯電路接受CPU 發(fā)來(lái)的控制口號(hào)RD、WR、RESET 和地址信號(hào)A1~A0。然后根據(jù)命令端口,控制信號(hào)

27、的要求,將端口的數(shù)據(jù)讀出選信CPU 或者將CPU送來(lái)的數(shù)據(jù)寫(xiě)入端口,各端口的工作狀態(tài)。通過(guò)用輸出指令對(duì)8255A 的控制字寄存器編程,寫(xiě)入設(shè)定工作方式的控制字,可以讓3個(gè)數(shù)據(jù)口以不同的方式工作,端口A 可工作于3 種方式的任一種,端口B 只能工作于方式0 和方式1,端口C 除了用于輸入輸出端口外,還能配合A 口和B 口工作,為這兩個(gè)端口的輸入輸出操作提供聯(lián)系信號(hào)。</p><p>  圖2-2 8255A控制字&

28、lt;/p><p>  本次設(shè)計(jì)實(shí)驗(yàn)采用的控制字是10010000,A口輸入、B口輸出、C口輸出。</p><p>  2.3 4*4矩陣鍵盤(pán)</p><p>  鍵盤(pán)是信息輸入元件,由一個(gè)個(gè)按鈕組成,如果是獨(dú)立按鈕的話必須要需要一個(gè)I/O口對(duì)它進(jìn)行檢測(cè)。因?yàn)?×4矩陣鍵盤(pán)有8個(gè)管腳,為了掃描鍵盤(pán)判斷鍵值的方便將八個(gè)管腳中的列接PA和行接PC。因?yàn)檫M(jìn)行鍵盤(pán)掃描

29、一般要求有一部分的I/O口的工作方式是輸入,另一部分I/O是輸出,具體到4×4鍵盤(pán)則要求4個(gè)I/O口輸入,另外4個(gè)輸出,這一點(diǎn)PC口剛好符合,低四位接行作為鍵盤(pán)I/O輸入,PA低四位接列作為鍵盤(pán)I/O輸出。</p><p>  鍵盤(pán)有16個(gè)按鍵,我們?cè)O(shè)計(jì)為0~9為數(shù)字鍵,ABCD分別為+、-、*、/,E為=號(hào),F(xiàn)為清零鍵CL。</p><p>  識(shí)別鍵盤(pán)上哪個(gè)鍵被壓下的過(guò)程的掃

30、描步驟:</p><p>  1.檢測(cè)是否所有鍵都都松開(kāi)了,若沒(méi)有則反復(fù)檢測(cè)。</p><p>  2.但所有鍵都松開(kāi)了,再檢測(cè)是否有鍵壓下,若無(wú)鍵按下則反復(fù)檢測(cè)。</p><p>  3.如有鍵壓下,要消除鍵抖動(dòng),確認(rèn)有鍵壓下。</p><p>  4.對(duì)壓下的鍵位置進(jìn)行判斷,先判斷是第幾行有鍵按下,再判斷第幾列有鍵按下,鍵值=行號(hào)*4+列

31、號(hào)。至此確定了哪個(gè)鍵按下,再接著進(jìn)行后面的操作。</p><p>  圖2-3 4*4矩陣鍵盤(pán) 表2-1 鍵盤(pán)設(shè)計(jì)</p><p>  2.4 七段LED數(shù)碼管</p><p>  LED由7個(gè)字符段和一個(gè)小數(shù)點(diǎn)段組成,每段對(duì)應(yīng)一個(gè)發(fā)光二極管,當(dāng)發(fā)光二極管點(diǎn)亮?xí)r,相應(yīng)的字符段點(diǎn)亮。LED有共陰極和共陽(yáng)極兩種供應(yīng)狀態(tài)。共

32、陰極顯示時(shí),將LED顯示的COM接地,將八個(gè)字符段端a、b、c、d、e、f、g、dp依次與一個(gè)8位I/O口的最低到最高位連接,當(dāng)I/O給LED的哪個(gè)字符段送入一個(gè)高電平時(shí),該段就被點(diǎn)亮,從而可從這7個(gè)字符段中被點(diǎn)亮的構(gòu)成相應(yīng)的字符顯示出來(lái)。同理,COM陽(yáng)極即將COM端接Vcc,其顯示原理與COM陰極的基本相同,但I(xiàn)/O口送入低電平是相應(yīng)的段才被點(diǎn)亮。</p><p>  圖2-4七段數(shù)碼管實(shí)物圖 圖2-5 數(shù)碼管

33、管腳圖</p><p>  表2-2 數(shù)碼管顯示數(shù)字對(duì)應(yīng)表</p><p>  2.5 電路及其主要功能</p><p>  2.5.1 電路連接實(shí)物圖</p><p>  圖2-6 電路實(shí)物圖</p><p>  2.5.2實(shí)驗(yàn)電路圖</p><p>  圖2-7 電路實(shí)驗(yàn)?zāi)M圖</p&

34、gt;<p>  2.5.3 功能模塊圖</p><p>  圖2-8 功能模塊圖</p><p><b>  3 軟件方案</b></p><p><b>  3.1 流程圖</b></p><p>  3.1.1鍵盤(pán)掃描流程圖</p><p>  圖3-9

35、掃描流程圖</p><p>  3.1.2 計(jì)算器運(yùn)算流程圖</p><p>  圖3-10 運(yùn)算流程圖</p><p><b>  3.2 程序源代碼</b></p><p>  port_a equ 280H</p><p>  port_b equ 281H</p><p

36、>  port_c equ 282H</p><p>  port_ctl equ 283H</p><p>  data segment</p><p>  x db 0,0,0,0; 存放數(shù)據(jù)的每一位</p><p>  x1 dw ?; 存放第一個(gè)數(shù)據(jù)值</p><p&

37、gt;  x2 dw ?; 存放第二個(gè)數(shù)據(jù)值</p><p>  y dw ?; 存放結(jié)果</p><p>  s db ?; 存放運(yùn)算符號(hào)</p><p>  e db ?; 按下等號(hào)鍵標(biāo)記</p><p>  cc db ?;

38、 存放運(yùn)算數(shù)據(jù)位數(shù)</p><p>  h db 0; 存放行號(hào)</p><p>  l db 0; 存放列號(hào)</p><p>  discode db 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,40H,

39、;段碼表,最后一個(gè)是負(fù)號(hào)</p><p><b>  data ends</b></p><p>  code segment</p><p>  assume cs:code,ds:data</p><p>  start: mov ax,data</p><p><b>  mov

40、ds,ax</b></p><p>  mov al,90h ;A口輸入 B口輸出 C口輸出 10010000B即</p><p>  mov dx,port_ctl</p><p><b>  out dx,al</b></p><p>  mov di,offset x+3; di指向X

41、[3]</p><p>  kkk:call key; 掃描按鍵</p><p><b>  jmp kkk;</b></p><p>  key proc ;按鍵掃描子程序,程序返回后,在變量H和L中存放當(dāng)前按鍵的行列號(hào)</p><p>  check:call d

42、isp; ;等待按鍵,按下的同時(shí)進(jìn)行顯示</p><p>  mov al,10h; ;PC0-PC3對(duì)應(yīng)行號(hào),輸出低電平</p><p>  mov dx,port_c</p><p><b>  out dx,al</b></p><p>  mov dx,por

43、t_a</p><p>  in al,dx ;讀列值,即PA0-PA3的值</p><p>  and al,0fh</p><p>  cmp al,0fh; </p><p>  jz check ;ZF=1,即運(yùn)算結(jié)果為0,相等,都為高電平則無(wú)鍵按下,

44、等待</p><p><b>  mov cx,50</b></p><p>  loop $; ;消除鍵抖動(dòng)</p><p>  in al,dx; ;重復(fù)讀列值</p><p>  and al,0fh</p><p>  c

45、mp al,0fh</p><p>  jz check; ;若無(wú)鍵按下則一直等待</p><p>  mov h,0; ;有鍵按下,先把行列號(hào)清0</p><p><b>  mov l,0</b></p><p>  mov bl,01h</p&

46、gt;<p>  mov bh,0feh; ;掃描鍵值,從第一行開(kāi)始檢測(cè),PC0輸出低電平</p><p>  next:mov al,bh</p><p>  mov dx,port_c</p><p><b>  out dx,al</b></p><p>  nextl:mo

47、v dx,port_a</p><p>  in al,dx; 讀列值,判斷第幾列有鍵按下</p><p>  test al,bl; 判斷是否是第1列</p><p>  jz waito ;是則跳轉(zhuǎn)</p><p>  rol bl,1

48、 ;左移一位</p><p>  cmp bl,10h; 當(dāng)前行狀態(tài)下沒(méi)有任何列有鍵按下,則轉(zhuǎn)為對(duì)下一行的測(cè)試</p><p><b>  jz nexth</b></p><p>  inc l; ;每判斷一列,列號(hào)加1</p

49、><p>  jmp nextl; 再對(duì)下一列進(jìn)行判斷 </p><p>  nexth:mov l,0</p><p>  mov bl,01h</p><p><b>  rol bh,1;</b></p><p>  cmp bh,0efh</p>

50、<p><b>  jz exit</b></p><p><b>  inc h</b></p><p><b>  jmp next</b></p><p>  waito:mov dx,port_a ;若有鍵按下,則等該鍵松開(kāi)后再計(jì)算鍵值</p>&

51、lt;p><b>  in al,dx;</b></p><p>  and al,0fh</p><p>  cmp al,0fh</p><p><b>  jnz waito</b></p><p>  call keyvalue; 調(diào)計(jì)算鍵值子程序<

52、/p><p><b>  exit:ret</b></p><p><b>  key endp;</b></p><p>  keyvalue proc ;計(jì)算鍵值子程序,通過(guò)行列號(hào)計(jì)算鍵值(鍵值=行號(hào)*4+列號(hào)) </p><p>  mov dl,h ;

53、鍵值存放在DL寄存器中</p><p><b>  mov dh,l</b></p><p><b>  xor ax,ax</b></p><p><b>  mov al,4</b></p><p><b>  mul dl</b></p>

54、<p><b>  mov dl,al</b></p><p><b>  add dl,dh</b></p><p><b>  cmp dl,9</b></p><p>  jng num_call ;小于等于,則轉(zhuǎn)移即按下的是數(shù)字鍵</p><

55、p><b>  cmp dl,14</b></p><p>  jl cont_call; ;大于9小于14,即加減乘除的時(shí)候 ,運(yùn)算鍵</p><p>  cmp dl,14 ;等于15,即等于鍵</p><p>  jz outp_call;</p><p><

56、;b>  cmp dl,15</b></p><p>  jz clr_call; ;按下清零鍵</p><p>  num_call:call number;調(diào)用數(shù)字鍵處理子程序</p><p><b>  jmp exit1</b></p><p>  cont_call:mo

57、v s,dl; 存放運(yùn)算鍵的鍵值</p><p><b>  mov e,0</b></p><p>  call count; 調(diào)用運(yùn)算鍵處理子程序,計(jì)算</p><p><b>  jmp exit1</b></p><p>  outp_call:call outp;

58、 調(diào)用等號(hào)鍵處理子程序</p><p><b>  jmp exit1</b></p><p>  clr_call:call clear; 調(diào)用清除鍵處理子程序</p><p><b>  exit1:ret</b></p><p>  keyvalue endp;</p>

59、<p>  clear proc ;一下為清除鍵處理子程序,按下清除鍵后,X變量全部清0</p><p>  mov x[3],0</p><p>  mov x[2],0</p><p>  mov x[1],0</p><p>  mov x[0],0</p><p>  call

60、bitp </p><p>  call disp </p><p>  call dely ;分析數(shù)據(jù)位數(shù)</p><p><b>  ret</b></p><p>  clear endp;</p><p>  outp proc ;等號(hào)鍵處理子程序

61、,該子程序負(fù)責(zé)將第二個(gè)運(yùn)算數(shù)據(jù)的數(shù)值計(jì)算出來(lái)存入X2變量</p><p>  push ax ;并根據(jù)運(yùn)算符號(hào),調(diào)用相應(yīng)的運(yùn)算子程序</p><p><b>  push dx</b></p><p><b>  push bx</b></p><p><b> 

62、 inc e</b></p><p>  call count ;調(diào)用運(yùn)算鍵處理子程序,計(jì)算第二個(gè)運(yùn)算數(shù)據(jù)</p><p><b>  cmp s,10</b></p><p>  jz add_call; ;加號(hào)</p><p>  cmp s,11

63、 </p><p>  jz sub_call ;減號(hào)</p><p><b>  cmp s,12</b></p><p>  jz mul_call; ;乘號(hào)</p><p><b>  cmp s,13</b></p><p>  

64、jz divp_call ;除號(hào)</p><p>  add_call:call addp</p><p>  jmp store1</p><p>  sub_call:call subp</p><p>  jmp store1</p><p>  mul_call:call mulp</p&

65、gt;<p>  jmp store1</p><p>  divp_call:cmp x2,0 ;判斷除數(shù)是否為零,為零跳入報(bào)錯(cuò)子程序</p><p><b>  jz disp1</b></p><p><b>  call divp</b></p><p>  jmp sto

66、re1</p><p>  disp1 proc ;報(bào)錯(cuò)顯示子程序</p><p><b>  push bx</b></p><p><b>  push ax</b></p><p><b>  mov bh,0</b></p><p>  lea

67、 si,discode ;si指向段碼表頭</p><p>  mov ah,00010000b</p><p><b>  mov al,ah</b></p><p>  mov dx,port_c</p><p><b>  out dx,al</b></p><p> 

68、 mov bh,00h</p><p><b>  mov bl,14</b></p><p>  mov al,[si+bx]</p><p>  mov dx,port_b</p><p><b>  out dx,al</b></p><p><b>  po

69、p ax</b></p><p><b>  pop bx</b></p><p><b>  kkk1:</b></p><p>  mov dx,port_a</p><p>  in al,dx ;報(bào)錯(cuò)后掃描鍵盤(pán)等待按鍵跳出</p>&l

70、t;p>  and al,0fh</p><p>  cmp al,0fh; </p><p><b>  jz kkk1</b></p><p><b>  jmp kkk</b></p><p><b>  ret</b></p>

71、<p>  disp1 endp;</p><p>  store1:call clear</p><p>  mov ax,y ;將各運(yùn)算子程序返回的運(yùn)算結(jié)果,按位分解,送入X變量</p><p>  cmp ax,0 ;判斷是否小于0,是跳轉(zhuǎn)</p><p><b>  jl c

72、cc</b></p><p>  cmp ax,1000</p><p><b>  jnz ddd1</b></p><p>  mov x[0],1</p><p>  mov x[1],0</p><p>  mov x[2],0</p><p>  mo

73、v x[3],0</p><p>  jmp jieshu</p><p>  ddd1:cmp ax,1000</p><p><b>  jl ddd2</b></p><p>  mov bx,1000</p><p>  mov dx,00h</p><p><

74、;b>  div bx</b></p><p>  mov x[0],al</p><p><b>  mov ax,dx</b></p><p>  mov ah,00h</p><p><b>  jmp ddd</b></p><p>  ccc:mo

75、v x[0],10h</p><p><b>  mov ax,y</b></p><p>  neg ax ;取反</p><p>  ddd2:cmp ax,100</p><p><b>  jnz ddd</b></p><p>  mov x

76、[0],0</p><p>  mov x[1],1</p><p>  mov x[2],0</p><p>  mov x[3],0</p><p>  jmp jieshu</p><p>  ddd:cmp ax,100</p><p><b>  jl ggg</b&g

77、t;</p><p>  mov bl,100</p><p><b>  div bl</b></p><p>  mov x[1],al</p><p><b>  mov al,ah</b></p><p>  mov ah,00h</p><p&g

78、t;<b>  cmp ax,10</b></p><p><b>  jnz ggg</b></p><p>  mov x[0],0</p><p>  mov x[1],0</p><p>  mov x[2],1</p><p>  mov x[3],0</p&

79、gt;<p>  jmp jieshu</p><p>  ggg:cmp ax,10</p><p><b>  jl jjj</b></p><p><b>  mov bl,10</b></p><p><b>  div bl</b></p>

80、<p>  mov x[2],al</p><p><b>  mov al,ah</b></p><p>  mov ah,00h</p><p>  jjj:mov x[3],al</p><p>  jieshu:pop bx</p><p><b>  pop dx&

81、lt;/b></p><p><b>  pop ax</b></p><p><b>  ret</b></p><p>  outp endp;</p><p>  count proc ;運(yùn)算鍵處理子程序,該程序?qū)⒌谝粋€(gè)運(yùn)算數(shù)據(jù)的數(shù)值計(jì)算出來(lái),并存入X1變量</p>

82、;<p>  push ax ;或?qū)⒌诙€(gè)運(yùn)算數(shù)據(jù)計(jì)算出來(lái)存入X2變量</p><p>  push bx ;將預(yù)算符存入S變量</p><p><b>  push dx</b></p><p><b>  mov dx,0</b></p><p>

83、;  call bitp ;測(cè)試有多少位</p><p><b>  cmp cc,4</b></p><p><b>  jz c4</b></p><p><b>  cmp cc,3</b></p><p><b>  jz c3</b>

84、;</p><p><b>  cmp cc,2</b></p><p><b>  jz c2</b></p><p><b>  jmp c1</b></p><p>  c4:mov ax,0</p><p>  mov al,x[0]</p

85、><p>  mov bx,1000</p><p><b>  mul bx</b></p><p><b>  mov dx,ax</b></p><p>  c3:mov al,x[1]</p><p>  mov bl,100</p><p>&l

86、t;b>  mul bl</b></p><p><b>  add dx,ax</b></p><p>  c2:mov al,x[2]</p><p><b>  mov bl,10</b></p><p><b>  mul bl</b></p&g

87、t;<p><b>  add dx,ax</b></p><p>  c1:mov al,x[3]</p><p><b>  mov ah,0</b></p><p><b>  add dx,ax</b></p><p>  cmp e,1

88、;判斷是否為等號(hào)</p><p>  jnz x1_s ;不是</p><p>  mov x2,dx ;是等于號(hào),則將第二個(gè)運(yùn)算數(shù)據(jù)的值存入X2變量</p><p><b>  jmp exit3</b></p><p>  x1_s:mov x1,dx ;按下的是運(yùn)算符號(hào),則將第一個(gè)運(yùn)算符

89、的值存入X1變量</p><p>  mov x[3],0 ;清空X變量</p><p>  mov x[2],0</p><p>  mov x[1],0</p><p>  mov x[0],0</p><p>  exit3:pop dx</p><p><b>  

90、pop bx</b></p><p><b>  pop ax</b></p><p><b>  ret</b></p><p>  count endp</p><p>  number proc ;數(shù)字鍵處理子程序</p><p>  c

91、mp e,1 ;將輸入的數(shù)據(jù)按位存放在X變量中,并由CC記錄數(shù)據(jù)的位數(shù)</p><p>  jnz continue</p><p><b>  mov e,0</b></p><p>  call clear</p><p>  continue:cmp cc,0 ;目前數(shù)據(jù)為0位,沒(méi)有數(shù)據(jù)

92、則轉(zhuǎn)到SSS</p><p><b>  jz sss</b></p><p>  push ax ;若已有數(shù)據(jù),程序?qū)左移8位,例如先輸入1,再輸入2,先要將1從各位移到十位,再將2存放到個(gè)位</p><p><b>  push dx</b></p><p>  mov

93、 al,x[3] </p><p>  mov ah,x[2]</p><p>  mov dl,x[1]</p><p>  mov dh,x[0]</p><p>  mov x[3],00h</p><p>  mov x[2],al</p><p>  mov x[1

94、],ah</p><p>  mov x[0],dl</p><p><b>  pop dx</b></p><p><b>  pop ax</b></p><p>  sss:mov [di],dl; 將當(dāng)前鍵入的數(shù)據(jù)存放到X的最低位</p><p>  inc c

95、c; 數(shù)據(jù)位數(shù)加1</p><p>  cmp cc,4; 判斷數(shù)據(jù)位數(shù)</p><p>  jng exit2 </p><p>  mov cc,0 ;超過(guò)4位,重新從最低位開(kāi)始存 </p><p>  mov x[2],0</p><p> 

96、 mov x[1],0</p><p>  mov x[0],0</p><p>  exit2:call disp; 調(diào)用顯示子程序,顯示輸入的數(shù)據(jù)</p><p><b>  ret</b></p><p>  number endp;</p><p>  addp proc

97、 ;加法子程序</p><p><b>  push ax;</b></p><p>  mov ax,x1;</p><p>  add ax,x2;</p><p><b>  mov y,ax</b></p><p><b>  pop ax</b>

98、;</p><p><b>  ret</b></p><p>  addp endp;</p><p>  subp proc ;減法子程序</p><p><b>  push ax</b></p><p><b>  mov ax,x1</

99、b></p><p><b>  sub ax,x2</b></p><p><b>  mov y,ax</b></p><p><b>  pop ax</b></p><p><b>  ret</b></p><p>

100、  subp endp;</p><p>  mulp proc ;乘法子程序</p><p><b>  push ax</b></p><p><b>  push dx</b></p><p><b>  mov ax,x1</b></p>

101、<p><b>  mov dx,x2</b></p><p><b>  mul dx</b></p><p><b>  mov y,ax</b></p><p><b>  pop dx</b></p><p><b>  pop

102、 ax</b></p><p><b>  ret</b></p><p>  mulp endp;</p><p>  divp proc ;除法子程序</p><p><b>  push ax</b></p><p><b>  p

103、ush bx</b></p><p><b>  push dx</b></p><p><b>  mov dx,0</b></p><p><b>  mov ax,x1</b></p><p><b>  mov bx,x2</b><

104、;/p><p><b>  div bx</b></p><p><b>  mov y,ax</b></p><p><b>  pop dx</b></p><p><b>  pop bx</b></p><p><b>

105、;  pop ax</b></p><p><b>  ret</b></p><p><b>  divp endp</b></p><p>  disp proc ;顯示子程序,將X中的數(shù)值按位顯示出來(lái)</p><p><b>  push bx</b>

106、;</p><p><b>  push ax</b></p><p><b>  mov bh,0</b></p><p>  lea si,discode ;si指向段碼表頭</p><p>  begin:call bitp ;測(cè)試X的位數(shù)</p><p>

107、<b>  cmp cc,4</b></p><p>  jz qian ;cc等于4跳轉(zhuǎn)</p><p>  cmp cc,3 </p><p>  jz bai ;cc等于3跳轉(zhuǎn)</p><p><b>  cmp cc,2</b></p&g

108、t;<p>  jz shi ;cc等于2跳轉(zhuǎn)</p><p><b>  cmp cc,1</b></p><p>  jz g ;cc等于1跳轉(zhuǎn)</p><p>  jmp none ;否則跳轉(zhuǎn)到?jīng)]有數(shù)字</p><p>  qian:m

109、ov ah,10000000b;</p><p><b>  mov al,ah</b></p><p>  mov dx,port_c</p><p><b>  out dx,al</b></p><p>  mov bh,00h</p><p>  mov bl,x[0

110、] ;x[0]即千位數(shù)字</p><p>  mov al,[si+bx] ;默認(rèn)是DS數(shù)據(jù)段首地址,中括號(hào)內(nèi)位段碼表的偏移量,將數(shù)字所對(duì)應(yīng)的段碼送到鎖存器</p><p>  mov dx,port_b</p><p><b>  out dx,al</b></p><p><b>  mov al

111、,0</b></p><p><b>  out dx,al</b></p><p>  bai:mov ah,01000000b</p><p><b>  mov al,ah</b></p><p>  mov dx,port_c</p><p><b&

112、gt;  out dx,al</b></p><p>  mov bh,00h</p><p>  mov bl,x[1]</p><p>  mov al,[si+bx]</p><p>  mov dx,port_b</p><p><b>  out dx,al</b></

113、p><p><b>  mov al,0</b></p><p><b>  out dx,al</b></p><p>  shi:mov ah,00100000b</p><p><b>  mov al,ah</b></p><p>  mov dx,

114、port_c</p><p><b>  out dx,al</b></p><p>  mov bh,00h</p><p>  mov bl,x[2]</p><p>  mov al,[si+bx]</p><p>  mov dx,port_b</p><p>&l

115、t;b>  out dx,al</b></p><p><b>  mov al,0</b></p><p><b>  out dx,al</b></p><p>  g:mov ah,00010000b</p><p><b>  mov al,ah</b>

116、;</p><p>  mov dx,port_c</p><p><b>  out dx,al</b></p><p>  mov bh,00h</p><p>  mov bl,x[3]</p><p>  mov al,[si+bx]</p><p>  mov d

117、x,port_b</p><p><b>  out dx,al</b></p><p><b>  mov al,0</b></p><p><b>  out dx,al</b></p><p>  mov al,00h</p><p>  mov

118、dx,port_c</p><p><b>  out dx,al</b></p><p><b>  out dx,al</b></p><p>  mov dx,port_a</p><p>  in al,dx ;讀列值,即PA0-PA3的值</p>

119、<p>  and al,0fh</p><p>  cmp al,0fh; </p><p><b>  jnz exit4</b></p><p><b>  jmp begin</b></p><p>  none:mov ah,00010000b</p

120、><p><b>  mov al,ah</b></p><p>  mov dx,port_c</p><p><b>  out dx,al</b></p><p>  mov al,3fh ;X中沒(méi)有數(shù)據(jù)則顯示0</p><p>  mov dx,port_b<

121、/p><p><b>  out dx,al</b></p><p>  exit4:pop ax</p><p><b>  pop bx</b></p><p><b>  ret</b></p><p>  disp endp;</p>

122、<p>  bitp proc ;分析數(shù)據(jù)位數(shù)的子程序,判斷有多少個(gè)位</p><p>  cmp x[0],0</p><p>  jnz fourbit ;如果x[0]不為0,則數(shù)據(jù)為4位數(shù)</p><p>  cmp x[1],0</p><p>  jnz threebit ;如果x[1]不為0,則數(shù)據(jù)

123、為3位數(shù)</p><p>  cmp x[2],0</p><p>  jnz towbit ;如果x[2]不為0,則數(shù)據(jù)為2位數(shù)</p><p>  cmp x[3],0</p><p>  jnz onebit ;如果x[3]不為0,則數(shù)據(jù)為1位數(shù)</p><p>  jmp zerobit

124、 ;如果x[3]為0,則沒(méi)有數(shù)據(jù)</p><p>  fourbit:mov cc,4</p><p><b>  jmp exit5</b></p><p>  threebit:mov cc,3</p><p><b>  jmp exit5</b></p><p>

125、  towbit:mov cc,2</p><p><b>  jmp exit5</b></p><p>  onebit:mov cc,1</p><p><b>  jmp exit5</b></p><p>  zerobit:mov cc,0 ;將數(shù)據(jù)位數(shù)存入cc存放數(shù)據(jù)位數(shù)的地方<

126、/p><p><b>  exit5:ret</b></p><p>  bitp endp; 結(jié)束</p><p>  dely proc ;延時(shí)子程序</p><p><b>  push cx</b></p><p>  mov

127、 cx,100</p><p>  loop $ ;$表示當(dāng)前地址即原地循環(huán)</p><p>  pop cx ;入棧目的是保存cx的值防止多次調(diào)用的時(shí)候cx的值變化?。。?!</p><p><b>  ret</b></p><p><b>  dely endp</b>&l

128、t;/p><p><b>  code ends</b></p><p><b>  end start</b></p><p><b>  4 問(wèn)題與解決方案</b></p><p>  1.此次課程設(shè)計(jì)顯示器件本想采用ST7920,結(jié)果糾結(jié)于顯示屏的啟動(dòng)程序和電泳程序,每次顯示

129、都控制不好在屏幕的位置,最終采用了LED七段數(shù)碼管,這個(gè)啟用很方便只要給S0~S3高電平就能點(diǎn)亮相應(yīng)的數(shù)碼管,再通過(guò)da~dp給入相應(yīng)數(shù)據(jù)顯示數(shù)字。</p><p>  2.掃描鍵盤(pán)時(shí)數(shù)字應(yīng)及時(shí)響應(yīng)顯示出來(lái),所以程序代碼中設(shè)置了棧,每個(gè)掃描到的鍵值都入棧,顯示的時(shí)候都要掃描數(shù)字的位數(shù)再顯示出來(lái)。</p><p>  3.程序編碼中期數(shù)碼管顯示總是閃屏的,研究了好久才知道原來(lái)是延時(shí)問(wèn)題。&l

130、t;/p><p>  4.清零的時(shí)候總是顯示四個(gè)零,不知道是哪個(gè)地方出錯(cuò)了,幾個(gè)人看了好久,程序代碼長(zhǎng)了進(jìn)行調(diào)整改進(jìn)就越來(lái)越困難。最終發(fā)現(xiàn)是代碼跳轉(zhuǎn)回來(lái)的時(shí)候給總程序進(jìn)行初始化,讓其四位都置零。</p><p>  5.設(shè)置報(bào)錯(cuò)子程序的時(shí)候,一旦程序報(bào)錯(cuò)就卡住了,必須重啟才能繼續(xù)運(yùn)算。對(duì)匯編語(yǔ)言研究了好久才發(fā)現(xiàn)原來(lái)是代碼缺少按鍵返回觸發(fā),報(bào)完錯(cuò)程序就進(jìn)入了死循環(huán),所以在報(bào)錯(cuò)子程序中加入了鍵盤(pán)掃

131、描,一旦有鍵按下就能調(diào)用程序返回到之前的鍵盤(pán)掃描中。這樣很巧妙地解決了這一問(wèn)題。</p><p><b>  。</b></p><p><b>  。</b></p><p><b>  。</b></p><p><b>  5 成果展示</b><

132、;/p><p>  圖5-11 顯示錄入1234 圖5-12 顯示9*9的結(jié)果圖5-23 除數(shù)為零是的報(bào)錯(cuò)處理</p><p><b>  6 總結(jié)</b></p><p><b>  。</b></p><p><b>  。</b></p>

133、<p><b>  。</b></p><p><b>  7 心得體會(huì)與收獲</b></p><p><b>  。</b></p><p><b>  。</b></p><p><b>  。</b></p&g

134、t;<p><b>  參考文獻(xiàn)</b></p><p>  [1]周荷琴、吳秀清 《微型計(jì)算機(jī)原理與接口技術(shù)》第四版 [M].北京:中國(guó)科學(xué)技術(shù)大學(xué)出版社,2008 </p><p>  [2]朱金鈞、麻新旗 《微型計(jì)算機(jī)原理及應(yīng)用技術(shù)》[M]. 北京: 機(jī)械工業(yè)出版社, 2003 </p><p>  [3] 周明德. 《微型

135、計(jì)算機(jī)系統(tǒng)原理及應(yīng)用》[M]. 北京: 清華大學(xué)出版社, 2001</p><p>  [4] 《硬件課程設(shè)計(jì)(電子計(jì)算器)報(bào)告》 </p><p>  http://wenku.baidu.com/view/c91f51d950e2524de5187e00.html</p><p>  [5] 《微機(jī)原理課程設(shè)計(jì)(用8255A實(shí)現(xiàn)4位十進(jìn)制計(jì)算器)》</p&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論