硬件課程設(shè)計報告(電子計算器)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

6、t;<p>  1.1選題………………………………………………………………………………3</p><p>  1.2需求分析……………………………………………………………………………3</p><p>  1.3設(shè)計任務(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矩陣鍵盤……………………………………………………………………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 問題與解決方案……………………………………………………………………26</p><p>  5 成果展示……………………………………………………………………………26</p><p>  6 總結(jié)…………………………………………………………………

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

33、管腳圖</p><p>  表2-2 數(shù)碼管顯示數(shù)字對應(yīng)表</p><p>  2.5 電路及其主要功能</p><p>  2.5.1 電路連接實物圖</p><p>  圖2-6 電路實物圖</p><p>  2.5.2實驗電路圖</p><p>  圖2-7 電路實驗?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><p>  圖3-9

35、掃描流程圖</p><p>  3.1.2 計算器運算流程圖</p><p>  圖3-10 運算流程圖</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 ?; 存放第一個數(shù)據(jù)值</p><p&

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

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

39、;段碼表,最后一個是負(fù)號</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)前按鍵的行列號</p><p>  check:call d

42、isp; ;等待按鍵,按下的同時進(jìn)行顯示</p><p>  mov al,10h; ;PC0-PC3對應(yīng)行號,輸出低電平</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,即運算結(jié)果為0,相等,都為高電平則無鍵按下,

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

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

46、gt;<p>  mov bh,0feh; ;掃描鍵值,從第一行開始檢測,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)下沒有任何列有鍵按下,則轉(zhuǎn)為對下一行的測試</p><p><b>  jz nexth</b></p><p>  inc l; ;每判斷一列,列號加1</p

49、><p>  jmp nextl; 再對下一列進(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 ;若有鍵按下,則等該鍵松開后再計算鍵值</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)計算鍵值子程序<

52、/p><p><b>  exit:ret</b></p><p><b>  key endp;</b></p><p>  keyvalue proc ;計算鍵值子程序,通過行列號計算鍵值(鍵值=行號*4+列號) </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,即加減乘除的時候 ,運算鍵</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; 存放運算鍵的鍵值</p><p><b>  mov e,0</b></p><p>  call count; 調(diào)用運算鍵處理子程序,計算</p><p><b>  jmp exit1</b></p><p>  outp_call:call outp;

58、 調(dià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 ;等號鍵處理子程序

61、,該子程序負(fù)責(zé)將第二個運算數(shù)據(jù)的數(shù)值計算出來存入X2變量</p><p>  push ax ;并根據(jù)運算符號,調(diào)用相應(yīng)的運算子程序</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)用運算鍵處理子程序,計算第二個運算數(shù)據(jù)</p><p><b>  cmp s,10</b></p><p>  jz add_call; ;加號</p><p>  cmp s,11

63、 </p><p>  jz sub_call ;減號</p><p><b>  cmp s,12</b></p><p>  jz mul_call; ;乘號</p><p><b>  cmp s,13</b></p><p>  

64、jz divp_call ;除號</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ù)是否為零,為零跳入報錯子程序</p><p><b>  jz disp1</b></p><p><b>  call divp</b></p><p>  jmp sto

66、re1</p><p>  disp1 proc ;報錯顯示子程序</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 ;報錯后掃描鍵盤等待按鍵跳出</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 ;將各運算子程序返回的運算結(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 ;運算鍵處理子程序,該程序?qū)⒌谝粋€運算數(shù)據(jù)的數(shù)值計算出來,并存入X1變量</p>

82、;<p>  push ax ;或?qū)⒌诙€運算數(shù)據(jù)計算出來存入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 ;測試有多少位</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、;判斷是否為等號</p><p>  jnz x1_s ;不是</p><p>  mov x2,dx ;是等于號,則將第二個運算數(shù)據(jù)的值存入X2變量</p><p><b>  jmp exit3</b></p><p>  x1_s:mov x1,dx ;按下的是運算符號,則將第一個運算符

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位,沒有數(shù)據(jù)

92、則轉(zhuǎn)到SSS</p><p><b>  jz sss</b></p><p>  push ax ;若已有數(shù)據(jù),程序?qū)左移8位,例如先輸入1,再輸入2,先要將1從各位移到十位,再將2存放到個位</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 ;超過4位,重新從最低位開始存 </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ù)值按位顯示出來</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 ;測試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ù)段首地址,中括號內(nèi)位段碼表的偏移量,將數(shù)字所對應(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中沒有數(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ù)的子程序,判斷有多少個位</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,則沒有數(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 ;延時子程序</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)用的時候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 問題與解決方案</b></p><p>  1.此次課程設(shè)計顯示器件本想采用ST7920,結(jié)果糾結(jié)于顯示屏的啟動程序和電泳程序,每次顯示

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

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

131、描,一旦有鍵按下就能調(diào)用程序返回到之前的鍵盤掃描中。這樣很巧妙地解決了這一問題。</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ù)為零是的報錯處理</p><p><b>  6 總結(jié)</b></p><p><b>  。</b></p><p><b>  。</b></p>

133、<p><b>  。</b></p><p><b>  7 心得體會與收獲</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]周荷琴、吳秀清 《微型計算機原理與接口技術(shù)》第四版 [M].北京:中國科學(xué)技術(shù)大學(xué)出版社,2008 </p><p>  [2]朱金鈞、麻新旗 《微型計算機原理及應(yīng)用技術(shù)》[M]. 北京: 機械工業(yè)出版社, 2003 </p><p>  [3] 周明德. 《微型

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

溫馨提示

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

評論

0/150

提交評論