




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
東南大學(xué)吳健雄學(xué)院《微機(jī)試驗及課程設(shè)計》課程設(shè)計匯報FBIWarning:匯編代碼是好幾屆之前一個學(xué)姐,我只是修改了一下.修改后完美運(yùn)行匯報是我自己寫轉(zhuǎn)載不需要注明出處,就說是你寫姓名:學(xué)號:專業(yè):吳健雄學(xué)院實驗室:計算機(jī)硬件試驗室組別:同組人員:設(shè)計時間:年5月17日——年6月6日評定成績:審閱老師:目錄一.課程設(shè)計目標(biāo)和要求……………………2二.方案論證和原理設(shè)計………………………3三.具體(機(jī)理)設(shè)計………………………3四.方案實現(xiàn)和測試(或調(diào)試)……………6五.分析和總結(jié)………………7一.課程設(shè)計目標(biāo)和要求設(shè)計目標(biāo):微機(jī)課程綜合設(shè)計用于檢驗和提升學(xué)生在原理和接口綜合應(yīng)用方面分析問題和處理問題能力,同時也給學(xué)生提供更多、愈加好訓(xùn)練機(jī)會,課程給出了10道微機(jī)硬件應(yīng)用綜合測試題。為完成每道測試題,最少需要選擇TPC微機(jī)試驗裝置中三部分以上硬件電路(還需將它們有機(jī)組合起來)并編制對應(yīng)應(yīng)用。經(jīng)過試驗還能夠讓學(xué)生愈加好了解所學(xué)知識在實際控制中利用,增加對本專業(yè)認(rèn)識和學(xué)習(xí)愛好。設(shè)計要求:1)設(shè)計基礎(chǔ)要求用鍵盤、按鈕、八段碼和LED模擬電梯工作過程。樓層設(shè)為8層,鍵盤數(shù)字鍵1~8用來鍵入期望停樓層,8個LED顯示期望停樓層,2位八段碼指示電梯目前所在樓層,按鈕用來啟、停電梯。電梯正常運(yùn)行時以每2秒1層速度上升或下降。要求“電梯”能按以下方法運(yùn)行:(1)設(shè)目前電梯停在某層(2位八段碼顯示對應(yīng)樓層,8個LED全滅)。鍵入1~8數(shù)字鍵,如鍵入數(shù)字和目前電梯停層同,則什么亦不動作,若不一樣則對應(yīng)樓層LED亮;如再按運(yùn)行鍵,則電梯自動判別上升或下降(在運(yùn)行過程中八段碼顯示樓層改變)一直抵達(dá)期望停樓層(八段碼顯示該樓層,對應(yīng)LED滅);(2)設(shè)目前電梯正在上升或下降運(yùn)行(此時八段碼顯示樓層改變,LED指示期望抵達(dá)樓層),若鍵入新期望停樓層數(shù)字(對應(yīng)LED亮),則對同方向(上升或下降)未到樓層能停,對其它情況則先停原期望停樓層,然后按運(yùn)行鍵后繼續(xù)運(yùn)行)。以下幾例:①設(shè)電梯目前在2層,向上運(yùn)行,LED指示期望在6層停,此時若鍵入4,則電梯將在4樓停,若再按運(yùn)行鍵,則繼續(xù)運(yùn)行至6層停;②同上情況,若鍵入不是4而是8,則電梯將先停在6層,再按運(yùn)行鍵,運(yùn)行至8層停;③同上情況,若鍵入不是4(或8),而是1,則電梯先停在6層,再按運(yùn)行鍵,運(yùn)行至1層停。2)深入設(shè)計要求除運(yùn)行按鈕外,再設(shè)計多個按鈕,模擬更多電梯運(yùn)行功效,如:同時在8*8點(diǎn)陣顯示器顯示上升和下降箭頭,當(dāng)停止時顯示目前所在樓層號.直達(dá)按鈕。若按此按鈕,電梯按直達(dá)方法運(yùn)行,即對運(yùn)行期間新鍵入??繕菍樱词故峭较蛭吹綐菍樱┮嗖煌?,直達(dá)終點(diǎn)樓層;急停按鈕。電梯運(yùn)行中,若按此按鈕,則電梯立即停在下一抵達(dá)樓層;eq\o\ac(○,4)斷電待修按鈕。按下該鈕電梯不能工作,再按一下才能重新工作;eq\o\ac(○,5)設(shè)置急停開關(guān)(K0-K7至一),引入中止處理,立即響應(yīng),就近???;分工情況:我跟XXX一組,我關(guān)鍵負(fù)責(zé)程序框架構(gòu)建和大部分代碼編寫,XXX負(fù)責(zé)其它程序編寫和硬件連接等工作。二.方案論證和原理設(shè)計我們在成熟考慮程序整體要求和框架后,決定把程序總共分為四個模塊,分別為電梯運(yùn)行模塊,電梯接收請求判定模塊,顯示模塊,計時模塊。電梯運(yùn)行模塊是整個程序主模塊,其關(guān)鍵功效就是判定電梯運(yùn)行方向和??克菍觾?yōu)先次序。電梯接收請求判定模塊關(guān)鍵是應(yīng)急停,直達(dá),等候維修等命令。計時模塊用于對系統(tǒng)每二秒停一樓層計數(shù)。顯示模塊則包含所要到樓層顯示和運(yùn)行過程中所到樓層實時顯示。有8個樓層,需要用8個按鍵模擬電梯中請求按鈕;當(dāng)電梯靜止?fàn)顟B(tài)時,不管外部哪一層有請求,電梯全部由靜止?fàn)顟B(tài)轉(zhuǎn)入向上或向下運(yùn)行狀態(tài),直到抵達(dá)請求樓層;當(dāng)電梯處于向上運(yùn)行狀態(tài)時,此時高于該樓層向上請求和內(nèi)部請求等級最高,其次是全部樓層向下請求,再次是低于該樓層向上請求;當(dāng)電梯處于向下運(yùn)行狀態(tài)時則情況相反;因為中止等級在伴隨電梯所處樓層不一樣而改變,而且中止源比較多。所以用每一個中止源直接和中止控制器相連,需要用到多個8259A級聯(lián),很不方便。為處理這個問題,首先定義三個單字節(jié)變量REQ_U、REQ_D和REQ_IN分別存放電梯每一層向上、向下和內(nèi)部請求,每一位代表一層。比如,REQ_U為00000110B,這代表在2層和3層有向上請求。8253定時器每隔20ms產(chǎn)生一次中止,中止程序便去實施掃描鍵盤,當(dāng)掃描到有電梯內(nèi)部或外部按鍵時,將請求存放到變量中。每到一個狀態(tài)時再檢驗請求變量REQ_U、REQ_D和REQ_IN值,依據(jù)電梯運(yùn)行方向和變量中請求,來決定電梯下一步運(yùn)行。設(shè)電梯目前樓層為floor(floor=1~8),運(yùn)行方向為dir(dir=0,向上;dir=1,向下),在電梯運(yùn)行工程中,用數(shù)碼管輸出floor值顯示目前樓層。LED輸出REQ_IN值顯示電梯內(nèi)已經(jīng)請求樓層。關(guān)鍵模塊以下:1.可編程定時/計數(shù)器8253定時/計數(shù)器8253關(guān)鍵是用于定時20ms,觸發(fā)中止進(jìn)行鍵盤掃描。電路連線是CLOCK0接Q6,分頻后頻率為46875Hz,OUT0接中止IRQ2,每20ms中止一次,GATE0接5v。計數(shù)器初值應(yīng)該是3A9H;2.8255并行接口單元 8255關(guān)鍵是用于數(shù)碼管和發(fā)光二極管數(shù)據(jù)輸出。所以用8255B口8接8個發(fā)光二極管,A口接數(shù)碼管數(shù)據(jù)端。3LED點(diǎn)陣顯示 因為提升要求需要顯示上下箭頭,所以使用8*8點(diǎn)陣顯示箭頭。4微機(jī)控制器 程序在微機(jī)上運(yùn)行,經(jīng)過總線控制試驗箱上各部件運(yùn)行。三.具體(機(jī)理)設(shè)計1)軟件步驟圖(總步驟圖)本設(shè)計軟件設(shè)計思緒:經(jīng)過軟件編程使8253輸出定時信號申請中止,在中止服務(wù)程序中掃描鍵盤,假如有按鍵,修改對應(yīng)變量位,并輸出內(nèi)部請求變量REQ_IN到發(fā)光二極管顯示目前內(nèi)部請求樓層。在主程序中,查詢變量值,依據(jù)電梯調(diào)度算法運(yùn)行電梯。圖表SEQ圖表\*ARABIC1電梯系統(tǒng)總步驟圖2)電梯控制算法模塊邏輯實現(xiàn):當(dāng)電梯向上運(yùn)行時:
在目前層以下向上請求全部被忽略留到下次向上運(yùn)行時處理。
在目前層以上向上請求全部被統(tǒng)計留到此次運(yùn)行處理。不管哪層向下請求全部被忽略留到下次向下運(yùn)行時處理。
當(dāng)電梯向下運(yùn)行時:
在目前層以上向下請求全部被忽略留到下次向下運(yùn)行時處理。
在目前層以下向下請求全部被統(tǒng)計留到此次運(yùn)行處理。
不管哪層向上請求全部被忽略留到下次向上運(yùn)行時處理。算法實現(xiàn):dir代表電梯運(yùn)行方向,0代表電梯向上運(yùn)行,1代表向下運(yùn)動。設(shè)REQ_U(n)代表第n層向上請求,一樣,REQ_D(n)代表第n層向下請求,REQ_IN(n)代表第n層內(nèi)部請求。求next方法為:電梯向上時,next為內(nèi)部請求最小值和向上請求大于floor最小值之間小者。電梯向下時,next為內(nèi)部請求最大值和向下請求中小于floor最大值之間大者。沒有滿足要求時返回0。圖表SEQ圖表\*ARABIC2電梯控制算法步驟圖3)LED顯示程序:本設(shè)計只用到了一個LED,只要將floor轉(zhuǎn)換為對應(yīng)段碼。先輸出位碼,再輸出段碼,循環(huán)輸出就能夠動態(tài)顯示。為了循環(huán)顯示,將LED顯示程序放在中止服務(wù)程序中。(將“樓層”作偏移碼,利用XLAT,很簡單就能夠?qū)崿F(xiàn)譯碼)圖表SEQ圖表\*ARABIC3電梯按鍵、顯示中止步驟圖 VCC4)硬件連接圖VCC280H28bH1MHz/CS PA0-7 PB0-7PC0 8255/CSCLK0280H28bH1MHz/CS PA0-7 PB0-7PC0 8255/CSCLK0GATE0 OUT0 CLK1GATE1 OUT1 8253八段碼數(shù)碼管八段碼數(shù)碼管LEDLED小燈急停開關(guān)急停開關(guān)四.方案實現(xiàn)和測試(或調(diào)試)首先依據(jù)設(shè)計思緒,選擇采取8253和8255芯片,規(guī)避了使用較為復(fù)雜中止。然后調(diào)試硬件,確定位選、芯片等工作正常。這能夠經(jīng)過手動輸入控制字,進(jìn)行簡單輸入輸出實現(xiàn)。然后確定8253、8255芯片地址,開始軟件編程。 軟件編程首先完成整體邏輯框架,然后具體編寫子程序。剛開始時采取軟件延時,優(yōu)先調(diào)試8255。采取8255A、B口0方法,A、B口改變將反應(yīng)在八段碼和LED燈上。子程序編寫立即設(shè)計好算法轉(zhuǎn)換為程序流,用程序流方向?qū)崿F(xiàn)選擇,用調(diào)用子程序?qū)崿F(xiàn)具體操作。然后加入8253硬件延時,將OUT1連至PC0,經(jīng)過不停查詢PC0口狀態(tài)進(jìn)行延時。因為前面8255已經(jīng)調(diào)好,所以8253調(diào)試比較順利。 最終將全部硬件連線接好,進(jìn)行整機(jī)聯(lián)調(diào)。當(dāng)中發(fā)覺很多問題,首先利用示波器排除硬件故障,再回過頭來對軟件進(jìn)行單步,這時因為有現(xiàn)象,進(jìn)行軟件調(diào)試時候也更有針對性。經(jīng)過設(shè)置斷點(diǎn),逐步跟蹤寄存器值,經(jīng)過幾次修改以后,成功實現(xiàn)了預(yù)定方案。因為數(shù)碼管和LED燈顯示全部是采取查表法,依據(jù)輸入字符ASCII碼查表得到輸出,有時出現(xiàn)LED不正常亮滅現(xiàn)象,是在查表時犯錯,比如沒有減去31H,就會使燈顯示雜亂無章。實物連接圖:五.分析和總結(jié)1)設(shè)計要求每次電梯開關(guān)時間為2秒,而一開始我們無法確保正確時間。以后經(jīng)過討論后發(fā)覺能夠用8253計數(shù)器達(dá)成此功效,我們翻閱書籍后分別用方法3和方法0實現(xiàn)了正確2秒要求。2)編程中碰到大多是邏輯問題.另一個常常碰到問題就是跳轉(zhuǎn)語句超出范圍錯誤,這個錯誤處理是經(jīng)過改變語句次序,如實在無法經(jīng)過改變次序來消除錯誤,則經(jīng)過二次跳轉(zhuǎn),即跳過中間過程再跳至目標(biāo)。3)我們寫電梯程序,d意義為目前樓層,當(dāng)輸入要去樓層bl時,判定bl和cl大小關(guān)系,假設(shè)bl>cl,則程序先把cl加1,再延時兩秒,再比較bl和cl大小是否相等,假如相等則跳出,不等則把cl加1,再延時,再判定。4)當(dāng)在上行過程中再輸入另一個想去樓層ch時,則跳轉(zhuǎn)至ch處理過程。因為是在延時前就把cl加1了,所以在這上行兩秒內(nèi),cl已經(jīng)上了一層了。所以就必需判定ch和bl是否和此時cl相等,如相等則在立即抵達(dá)這一層停。因為一開始我們來判定bl和cl是否相等,造成假如在立即到bl層時候按下ch則會使cl不停增大,即ASCII碼不停增大,又返回至0,又增大至bl才停止。5)另外一個問題就是8個LED顯示要去哪個樓層問題。我們是用數(shù)據(jù)DD0—DD7接到74LS273輸出。bl,ch同時要被顯示。我們于是就把bl,ch0,1,2,3,…..8分別對應(yīng)于0B,1B,10B,………10000000B,然后把二者相加就能顯示了。假如抵達(dá)bl則把bl賦為0,則對應(yīng)燈滅。假如抵達(dá)ch,則把ch賦為0,則ch對應(yīng)樓層燈滅?,F(xiàn)在假如輸入ch等于bl,按要求是對應(yīng)燈亮,到該層停,而實際上變成上一層燈亮,因為ch和bl對應(yīng)二進(jìn)制相加,產(chǎn)生進(jìn)位。處理方法是,假如bl,ch相等,則先把cl復(fù)位為0,然后再調(diào)用LED顯示。6)電梯這個題目標(biāo)特點(diǎn)就是狀態(tài)多,多種大小循環(huán)相互嵌套,極難寫代碼。不過,因為每一層代碼全部是相同,在調(diào)試出某一層以后,其它七層代碼也很好寫。在設(shè)計過程中我們碰到了很多問題,而匯編語言本身不是像高級語言一樣直觀和簡練,剛開始走了不少彎路,但不停調(diào)試和查資料以后感覺好多了,程序編寫速度也大大加緊了。試驗過程中,我不停翻書,鞏固了上課沒聽懂知識,加深了對各個芯片直觀印象,也培養(yǎng)了細(xì)心試驗?zāi)芰?。參考書目:楊素行等,《微型計算機(jī)系統(tǒng)原理及應(yīng)用》,北京,清華大學(xué)出版社,東南大學(xué)微機(jī)系統(tǒng)和接口課程組,《微機(jī)試驗及課程設(shè)計教程試用版3.0》,南京,東南大學(xué)出版社,附錄.代碼程序datasegmentioport equ0ec00h-0280hio8253a equioport+280h;0計數(shù)端口計數(shù)為10000,方法3io8253b equioport+281h;1計數(shù)端口計數(shù)為200,方法0io8253c equioport+283h;8253控制端;shangmianshi8253io8255a equioport+288h;8255控制端和a,b,c端口地址io8255b equioport+289hio8255c equioport+28ahio8255 equioport+28bhproth equioport+290h;點(diǎn)陣燈顯示,行陣protlr equioport+298h;點(diǎn)陣燈顯示,列陣number db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段碼min db00h,01h,02h,03h,04h,05h,06h,07h;點(diǎn)陣行;buff1 db10h,30h,7fh,0ffh,0ffh,7fh,30h,10h;向上箭頭buff1 db10h,20h,40h,0ffh,0ffh,40h,20h,10h;buff2 db08h,0ch,0feh,0ffh,0ffh,0feh,0ch,08h;向下箭頭buff2 db08h,04h,02h,0ffh,0ffh,02h,04h,08hbuff3 db00h,00h,00h,00h,00h,00h,00h,00hmenu db'************************************************',0DH,0AH db'*DianTiKongZhiQi---elevator*',0Dh,0Ah db'*61010207JiaXiawen *',0DH,0AH db'*61010317YuHailei*',0Dh,0Ah db'************************************************',0Dh,0Ah db'inputanumbertogotothecorrespondinglevel',0DH,0AH db'esc----------exit',0DH,0AH db'enter--------go',0DH,0AH db'z------------godirectly',0Dh,0Ah db'x------------quickstop',0Dh,0Ah db'c------------waitingforfixing',0Dh,0Ah db '280H----8253CS',0Dh,0Ah db'1MHz----8253_clk0',0Dh,0Ah db'VCC----8253_gate0',0Dh,0Ah db '8253_clk1----8253_out0',0Dh,0Ah db '8253_gate1----K0',0Dh,0Ah db '8253_out1----8255_PC0',0Dh,0Ah db '28bH----8255_cs',0Dh,0Ah db 'PA0~7----SHUMAGUAN',0Dh,0Ah db 'PB0~7----led0~7',0Dh,0Ah db'MOVE!',0Dh,0Ah,'$'dataendsstackssegmentstack db100dup(?)stacksendscodesegmentassume cs:code,ds:data,ss:stacksstart: movax,data;初始化movds,ax movdx,offsetmenu;打印菜單,說明硬件電路連接等 movah,09 int21hmovdx,io8255;8255初始化,a、b輸出,c口輸入moval,89houtdx,almovbl,31h;bl代表目前電梯所在樓層,初始值設(shè)為1main:moval,0callshownumber;顯示目前樓層movcl,0;cl為第一次輸入要去樓層movch,0;ch為在中途中再次輸入要去樓層callshowledmovah,01;經(jīng)過鍵盤輸入第一次要去得樓層clint21hcmpal,1bh;是esc則退出jeexitcmpal,31h;鍵入數(shù)字是否在1-8之間,如不是重新輸入jlmaincmpal,38h;跟8比較,假如比8大,則循環(huán)輸入jgmainmovcl,alcallshowled;8個led燈顯示cl對應(yīng)樓層cmpcl,bl;cl和bl比較jemain;相等則返回重新輸入jgup;大于則向上運(yùn)行 jltodown;小于則向下運(yùn)行exit:movah,4chint21h;---------------------------------------------------------------------------------電梯上行up: calljudge;電梯上行情況up1:addbl,1callupdelay;調(diào)用向上運(yùn)行延時子程序,出現(xiàn)向上箭頭callshownumber;調(diào)用顯示子程序,經(jīng)過數(shù)碼管顯示目前樓層blcmpbl,cl;bl,cl不等則繼續(xù)jemain;相等則返回 jmpup1upgetch:movah,1;在上升過程中假如有其它鍵按下時int21h cmpal,78h;判定是否為急停鍵x jejit cmpal,63h;判定是否為斷電待修鍵c jeduandiancmpal,31h;數(shù)字是否在1-8之間如不是繼續(xù)上行jlgotoupcmpal,38hjggotoupmovch,al callshowledcalldelayupcallshownumbercalljudgeequ;判定目前樓層和第一次要去樓層是否相同cmpch,bl;比較ch和bl區(qū)分jeloucengxiangdeng;相等則在該層停,等候運(yùn)行信號輸入jlxianshanghouxia;ch小于bl則先上行至cl在下行至chcmpch,cl;ch大于bl則在判定ch和cl大小關(guān)系jexiangdengup;相等則一直上行至cljlsameup;ch大于bl小于cl則先上行到ch在上行到cljgtosameup2;ch大于cl則先上行到cl在上行到chgotoup:calldelayupjmpup1duandian: moval,0;上升時碰到了斷電情況,則等候鍵入,除非再次鍵入為c才繼續(xù)運(yùn)行 movah,7 int21h cmpal,63h jneduandian calldelayup callshownumber jmpup1jit: calldelayup;上升時碰到了急停情況,則停在下一層,然后回到main callshownumber jmpmaintodown:jmpdownupdelayprocnear;向上運(yùn)行延時子程序calldelayfirst;用于初始化8253pushdx callcleardots;調(diào)用使其能夠清零updelay1:calldotsup;循環(huán)調(diào)用向上箭頭顯示 movah,1;鍵盤是否有輸入int16hjneupgetch;如有則跳轉(zhuǎn)到輸入處理movdx,io8255c;8255c口輸入,看2s延時是否結(jié)束inal,dxandal,01;是否計時結(jié)束jzupdelay1popdxretupdelayendptomain:jmpmaintosameup2:jmpsameup2;---------------------------------------------------------------------------------上行中碰到多種情況列舉loucengxiangdeng:callshownumber;第二次要去得樓層和目前樓層相同,直接停在該層movch,0callshowledcallstop2callupcljmpmainxianshanghouxia:callshowled;先上行到cl再下行到chcallupclmovcl,0callshowledcallstop2 calldownchjmpmainxiangdengup:movch,0;二次要去樓層和第一次要去相同,直接上行到第一次要取得樓層 callshowled callupcl jmpmainsameup:callshowled;同方向樓層,先上行到ch再上行到clcallupchmovch,0callshowledcallstop2 callupcljmpmainsameup2:callshowled;同方向樓層,先上行到cl再上行到ch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------------callupclmovcl,0callshowled callstop2 callupchjmpmainjittt: jmpjit;----------------------------------------------------------電梯下行,和電梯上行情況基礎(chǔ)類似,稍作修改即可down: calljudgedown1: subbl,1calldowndelaycallshownumber cmpbl,cl jetomainjmpdown1downgetch:movah,1 int21h cmpal,78h jejit1 cmpal,63h jeduandian1 cmpal,31h jlgotodown cmpal,38h jggotodown movch,al callshowled calldelaydown callshownumber calljudgeequ cmpch,bl jestopdowncl jgdownclupch;ch大于bl則先下行至cl在上行至ch cmpch,cl;ch小于bl則在判定ch和cl大小關(guān)系 jejmpdowncl;相等則一直下行至cl jldowncldownch;ch小于bl小于cl則先下行到cl在下行到ch jgtodownchdowncl;ch大于cl則先下行到ch在下行到clgotodown:calldelaydown jmpdown1duandian1: moval,0;下降碰到了斷電情況,則等候鍵入,除非再次鍵入為c才繼續(xù)運(yùn)行 movah,7 int21h cmpal,63h jneduandian1 calldelaydown callshownumber jmpdown1jit1: calldelaydown;下降時碰到了急停情況,則停在下一層,然后回到main callshownumber jmpmaindowndelayprocnear;向下運(yùn)行延時子程序,和向上運(yùn)行延時子程序大致相同calldelayfirst pushdx callcleardots;調(diào)用使其能夠清零ddy: calldotsdown;循環(huán)調(diào)用向下箭頭顯示 movah,1 int16h jnedowngetchmovdx,io8255cinal,dx andal,01 jzddy popdx retdowndelayendptodownchdowncl:jmpdownchdowncl;---------------------------------------------------------------------------------下行中碰到多種情況列舉stopdowncl:callshowled movch,0 callshowled callstop2 calldowncl jmpmaindownclupch:callshowled calldowncl movcl,0 callshowled callstop2 callupch jmpmainjmpdowncl:movch,0 callshowled calldowncl jmpmaindowncldownch:callshowled calldowncl movcl,0 callshowled callstop2 calldownch jmpmaindownchdowncl:callshowled calldownch movch,0 callshowled callstop2 calldowncl jmpmain;--------------------------------------------------------------------電梯上、下行中碰到多種情況處理方法jitt: jmpjitttjudgeequprocnear;判定目前樓層和第一次要去樓層關(guān)系cmpcl,bljnebackcmpcl,ch jeclequch movcl,0 callshownumbercallshowledcallstop2 cmpch,bljgupchhere jldownchhereupchhere:callupchjmpmaindownchhere:calldownchjmpmainclequch:movch,0 callshowledcallonlydelay;jmpmainback:retjudgeequendpupclprocnear;上行到cl子程序upcl1:incbl calldirdelay1 callshownumber cmpbl,cl jlupcl1 retupclendpjitt1: jmpjit1upchprocnear;上行到ch子程序upch1:addbl,1 calldirdelay1 callshownumbercmpbl,ch jlupch1 retupchendpdownclprocnear;下行到cl子程序downcl1:subbl,1 calldirdelay2callshownumbercmpbl,cl jgdowncl1retdownclendpdownchprocnear;下行到ch子程序downch1:subbl,1calldirdelay2callshownumber cmpbl,chjgdownch1 retdownchendp;----------------------------------------------------------------------直接上下行時對按鍵情況處理stop2procnear;沒有直達(dá)鍵暫停子程序gostop2:moval,0movah,1 int21h cmpal,13 jnegostop2 moval,0retstop2endpdirgetch1:movah,1;直接上行對按鍵處理int21h cmpal,63h jedirduandian1 cmpal,78h jejit21 jmpdirback1dirgetch2:movah,1;直接下行對按鍵處理int21h cmpal,63h jedirduandian2 cmpal,78h jejit22 jmpdirback2jit21: calldelayup; callshownumber jmpmainjit22: calldelaydown; callshownumber jmpmaindirduandian1:moval,0;直接上行時碰到了斷電待修情況 movah,1 int21h cmpal,63h jnedirduandian1 calldelayup; callshownumberjmpdirback1dirduandian2:moval,0;直接下行時碰到了斷電待修情況 movah,1 int21h cmpal,63h jnedirduandian2 calldelaydown; callshownumberjmpdirback2tojit: jmpjittdirdelay1procnear;直接上行延時子程序calldelayfirstpushdx callcleardotsdirback1:calldotsup; movah,1 int16h jnedirgetch1movdx,io8255cinal,dxandal,01jzdirback1popdxretdirdelay1endptojit1: jmpjitt1dirdelay2procnear;直接下行延時子程序calldelayfirstpushdx callcleardotsdirback2:calldotsdown; movah,1 int16h jnedirgetch2movdx,io8255cinal,dxandal,01jzdirback2popdxretdirdelay2endp;----------------------------------------------------------------------直達(dá)情況處理judgeprocnear;判定是否為直達(dá)鍵,假如是就直接抵達(dá),假如為enter正常實施next1: moval,0 movah,1 int21h cmpal,7ah;是否為直達(dá)鍵 jezhida cmpal,13 jnenext1 moval,0 retjudgeendpzhida: cmpcl,bl jlzhidadown jgzhidaup jmpmainzhidadown:calldelaydown subbl,1 callzhidadelay2 callshownumber jmpzhidazhidaup:calldelayup addbl,1 callzhidadelay1 callshownumber jmpzhidazhidabutton1:movah,1;直達(dá)對按鍵情況處理,在上升時跳到此處 int21h cmpal,63h jezhidaduandian1 cmpal,78h jetojit jmpzhidazhidabutton2:movah,1;直達(dá)對按鍵情況處理,在下降時跳到此處 int21h cmpal,63h jezhidaduandian2 cmpal,78h jetojit1 jmpzhidazhidaduandian1:moval,0;上升時碰到斷電待修時 movah,1 int21h cmpal,63h;;;;;;;;;;;;c jnezhidaduandian1 calldelayup; callshownumber jmpzhidazhidaduandian2:moval,0;下降時碰到斷電待修時 movah,1 int21h cmpal,63h jnezhidaduandian2 calldelaydown; callshownumber jmpzhidazhidadelay1procnear;直達(dá)延時程序 calldelayfirst pushdx callcleardotsnext21: calldotsup; movah,1 int16h jnezhidabutton1 movdx,io8255c inal,dx andal,01 jznext21 popdx retzhidadelay1endpzhidadelay2procnear;直達(dá)延時程序 calldelayfirst pushdx callcleardotsnext22: calldotsdown; movah,1 int16h jnezhidabutton2 movdx,io8255c inal,dx andal,01 jznext22 popdx retzhidadelay2endp;------------------------------------------------------------------------------判定延時是否結(jié)束和8253初始化delayfirstprocnear;初始化8253子程序,兩計數(shù)器連級,接入1MHZ脈沖,2s每次第二個out接pc0pushdx movdx,io8253c;8253計數(shù)器0置方法3moval,36houtdx,almovdx,io8253a;計數(shù)器0初始值為10000movax,10000outdx,almoval,ahoutdx,al movdx,io8253c;8253計數(shù)器1置方法0 moval,70h outdx,almovdx,io8253b;計數(shù)器1初始值為200 movax,200 outdx,al moval,ahoutdx,al popdx retdelayfirstendponlydelayprocnear;判定延時時是否結(jié)束子程序,注意因為點(diǎn)陣燈顯示要寫進(jìn)循環(huán)中,所以分類,該延時僅用于延時 pushdxdelayx:movdx,io8255c inal,dx;查詢8255Pc0是否為高電平 andal,01 jzdelayx popdx retonlydelayendpdelayupprocnear;判定上升延時是否結(jié)束子程序,包含了顯示向上箭頭部分 pushdx callcleardotsdelayy: calldotsup movdx,io8255c inal,dx;查詢8255Pc0是否為高電平 andal,01 jzdelayy popdx retdelayupendpdelaydownprocnear;判定下降延時是否結(jié)束子程序,包含了顯示向下箭頭部分 pushdx callcleardotsdelayz: calldotsdown movdx,io8255c inal,dx;查詢8255Pc0是否為高電平 andal,01 jzdelayz popdx retdelaydownendp;----------------------------------------------------------------------------------------------顯示子程序cleardotsprocnear;用于對點(diǎn)陣顯示清零,在第一次要循環(huán)前使用 pushdx pushax moval,00 movdx,protlr outdx,al popaxpopdxcleardotsendpdotsupprocnear;點(diǎn)陣箭頭顯示,向上箭頭顯示子程序 pushcx pushaxpushbx movcx,0008hmovsi,offsetminmovah,01movex:moval,[si] movbx,offsetbuff1 xlat;得到第一行碼 movdx,proth outdx,al moval,ah movdx,protlroutdx,al;顯示第一行紅 shlah,01 incsi pushcx movcx,0ffffhdelayp:loopdelayp;延時 popcx loopmovex popbx popax popcx retdotsupendpdotsdownprocnear;點(diǎn)陣箭頭顯示,向下箭頭顯示子程序 pushcx pushaxpushbx movcx,0008h movsi,offsetminmovah,01movey: moval,[si] movbx,offsetbuff2 xlat;得到第一行碼 movdx,proth outdx,al moval,ah movdx,protlr outdx,al;顯示第一行紅 shlah,01 incsi pushcx movcx,0ffffhdelayq:loo
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國海上光伏行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 安全文明出行課件
- 土地租地合同協(xié)議書文庫
- 天氣創(chuàng)意課件圖片
- 非遺項目商業(yè)計劃書范文
- 文化墻安裝合同協(xié)議書
- 安裝學(xué)徒合同協(xié)議書模板
- 戀愛合同協(xié)議書抖音
- 音樂版權(quán)代理相關(guān)行業(yè)項目成效實現(xiàn)方案
- 天成貴龍文化課件模板
- 眾辰變頻器說明書3400
- 山東大學(xué)《概率論與數(shù)理統(tǒng)計》期末試題及答案
- 城市軌道交通客運(yùn)組織電子教案(全)完整版課件整套教學(xué)課件
- GB∕T 33917-2017 精油 手性毛細(xì)管柱氣相色譜分析 通用法
- 高壓氧治療操作規(guī)程以及護(hù)理常規(guī)
- 新能源汽車的研究論文
- 材料科學(xué)基礎(chǔ)基礎(chǔ)知識點(diǎn)總結(jié)
- 數(shù)控銑工圖紙(60份)(共60頁)
- 惠州市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(含答案)
- 加工設(shè)備工時單價表
- 高脂血癥藥物治療ppt課件
評論
0/150
提交評論