版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子計(jì)算器課程設(shè)計(jì)
- 基于plc電子計(jì)算器課程設(shè)計(jì)
- 硬件課程設(shè)計(jì)報(bào)告--計(jì)算器
- 電子計(jì)算器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)設(shè)計(jì)報(bào)告(多功能電子計(jì)算器設(shè)計(jì))
- 單片機(jī)原理課程設(shè)計(jì)——oled電子計(jì)算器
- 計(jì)算器課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告---計(jì)算器設(shè)計(jì)
- 電子計(jì)算器概述【文獻(xiàn)綜述】
- java計(jì)算器課程設(shè)計(jì)報(bào)告---模擬科學(xué)計(jì)算器
- 電子計(jì)算器質(zhì)量分等標(biāo)準(zhǔn)
- 基于c語(yǔ)言的電子計(jì)算器設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告—計(jì)算器
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 簡(jiǎn)易計(jì)算器課程設(shè)計(jì)報(bào)告
- java計(jì)算器課程設(shè)計(jì)報(bào)告
- vb計(jì)算器課程設(shè)計(jì)報(bào)告
- mfc計(jì)算器課程設(shè)計(jì)報(bào)告
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告--計(jì)算器設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論