計(jì)算機(jī)硬件技術(shù)基礎(chǔ)實(shí)驗(yàn)答案程序_第1頁
計(jì)算機(jī)硬件技術(shù)基礎(chǔ)實(shí)驗(yàn)答案程序_第2頁
計(jì)算機(jī)硬件技術(shù)基礎(chǔ)實(shí)驗(yàn)答案程序_第3頁
計(jì)算機(jī)硬件技術(shù)基礎(chǔ)實(shí)驗(yàn)答案程序_第4頁
計(jì)算機(jī)硬件技術(shù)基礎(chǔ)實(shí)驗(yàn)答案程序_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)一:簡單程序設(shè)計(jì)實(shí)驗(yàn)(1)編寫一個 32 位無符號數(shù)除法的程序,要求將存放在 num1 中的 32 位無符號數(shù)與存放 在 num2 中的 16 位無符號數(shù)相除,結(jié)果存放在 num3 和 num4 中。程序流程圖略。 參考源程序:datasegmentnum1 dd 2a8b7654h num2 dw 5abch num3 dw ?num4 dw ? dataendscodesegmentassume ds:data, cs:codestart: mov ax,data;數(shù)據(jù)段寄存器初始化mov ds,axmov ax, word ptr num1mov dx, word ptr num1+

2、2div num2mov num3,ax mov num4,dxmov ah,4ch;正常返回dos系統(tǒng)int 21h codeendsend start(2)編寫一個拆字程序。要求將存放在 ary 單元的 2 位十六進(jìn)制數(shù) x1x2 拆為 x1 和 x2 兩 部分,并以 0x1 和 0x2 的形式分別存入 ary+1 和 ary+2 單元中。程序流程圖略。 參考源程序:datasegment ary db 2ah,?,?dataendscodesegmentassume ds:data, cs:code start: mov ax,datamov ds,axmov si,offset ary

3、;取ary的偏移地址mov al,si;取16進(jìn)制數(shù)至al第 31 頁 共 31 頁mov bl,aland al,0f0h;取16進(jìn)制數(shù)的高四位,即x1shr al,4mov si+1,al;存0x1mov al,bland al,0fh;取16進(jìn)制數(shù)的低四位,即x2mov si+2,al;存0x2mov ah,4ch int 21hcodeendsend start實(shí)驗(yàn)二:分支程序設(shè)計(jì)實(shí)驗(yàn)(1)編寫一個字符比較程序,比較 3 個無符號字節(jié)數(shù) a,b,c 的大小,并根據(jù)比較結(jié)果 對變量 k 賦值:如果 3 個數(shù)不相等,則 k=0;如果 3 個數(shù)中有兩個相等,則 k=1; 如果 3 個數(shù)都相等

4、,則 k=2。程序流程圖略。 參考源程序:datasegment;定義待比較數(shù)a、b、c,比較結(jié)果ka db 20h b db 20h c db 20h k db ?dataendscodesegmentassume cs:code,ds:data start: mov ax,datamov ds,ax mov al,acmp al,b;對a、b進(jìn)行比較,不相等則轉(zhuǎn)到comp2jne comp2;相等則比較a、ccmp al,cjne k1;a、c不相等則k=1jmp k2;a、c相等則k=2comp2: mov bl,b cmp bl,cje k1;對b、c進(jìn)行比較,相等則k=1cmp al

5、,cje k1;對a、c進(jìn)行比較,相等則k=1k0:mov k,0jmp exit k1:mov k,1jmp exit k2:mov k,2exit:mov ah,4chint 21hcodeendsend start(2)編寫一個能實(shí)現(xiàn)下列表達(dá)式的程序:n = a + ba b設(shè) a,b,c 為小于 128 的正整數(shù)。 a b + c程序流程圖略。 參考源程序:datasegmenta > ba db 22h;定義 a、b、c、n b db 10hc db 01h n db ?dataendscodesegmentassume cs:code, ds:data start: mov

6、ax,datamov ds,axmov al, a cmp al, bjg calcul;a 小于或等于 b 則 n=a+badd al,b jmp exitcalcul: sub al, b adc al, cexit:mov n, al mov ah,4ch int 21hcodeendsend start實(shí)驗(yàn)三 循環(huán)程序設(shè)計(jì)實(shí)驗(yàn)(1)將字符串strn(以“$”結(jié)尾)中的每一個字符均加上偶校驗(yàn)位,并統(tǒng)計(jì)有多少個字符 因含有奇數(shù)個“1”而加上了校驗(yàn)位。統(tǒng)計(jì)結(jié)果存于n單元中。程序流程圖略。 參考源程序:datasegmentstrn db 'what$';任意定義一個字串,以“

7、$”結(jié)尾count equ $-strn n db ?buf db count dup(?) dataendscodesegmentassume cs:code, ds:data start:mov ax, datamov ds, ax mov ax, data mov es, axlea si, strn lea di, bufmov cx, count mov al, 0lp1:mov bl, si;逐個取字符進(jìn)行判斷and bl, bl;自己和自己做與運(yùn)算jp next;根據(jù) pf 標(biāo)志位的變化進(jìn)行跳轉(zhuǎn)inc alorbl, 80h next:mov di, blinc si inc d

8、i loop lp1mov n, al mov ah, 4chint 21hcodeendsend start(2)在 first 開始的一片連續(xù)的數(shù)據(jù)區(qū)中存放著 100 個數(shù)據(jù),編寫一個程序,統(tǒng)計(jì)第 1個數(shù)據(jù)0之前的數(shù)據(jù)個數(shù)。 程序流程圖略。 參考源程序:datasegmentfirst db 10h,24h,34h, 73h,20h,44h,03h,36h,41h;任取 9 個數(shù)做演示count equ $-first num db ?dataendscodesegmentassume cs:code, ds:data start:mov ax,datamov ds,axmov dl, 0

9、;計(jì)數(shù)值初始為 0mov cx,countmov bx, offset firstlp1:mov al, bx;每次取一個數(shù),與 0 比較cmp al, 00h jne nextjmp exit;找到 0 則退出next:inc dl;沒找到 0 則計(jì)數(shù)值加 1inc bx loop lp1exit:mov num, dl mov ah, 4ch int 21hcodeendsend start實(shí)驗(yàn)四:子程序設(shè)計(jì)實(shí)驗(yàn)將buf開始的10個單元中兩位十六進(jìn)制數(shù)轉(zhuǎn)換成ascii碼,并在屏幕上顯示出來。要求碼型 轉(zhuǎn)換通過子程序hexasc實(shí)現(xiàn),參數(shù)傳送采用寄存器傳送方式。程序流程圖略。 參考源程序:

10、(1)實(shí)現(xiàn)方法一:遠(yuǎn)過程調(diào)用 data segmentbuf db 10h,2fh,0d0h,0feh,33h,0f0h,20h,10h,3dh,0a2hcount equ $-buf;定義任意長度的一段 buf data endsstack1 segment stackdb 100 dup(?);設(shè)置足夠深度的棧區(qū)stack1 endscodesegmentassume cs:code,ds:data,ss:stack1start:mov ax,data mov ds,axmov si,offset buf mov cx,countagain:mov al,si;逐個取數(shù)mov bl,als

11、hr al,4and al,0fh;先對高字節(jié)部分轉(zhuǎn)換(寄存器 al 傳參)call far ptr hexasc;調(diào)用子程序mov dl,almov ah,02h;顯示高字節(jié)部分對應(yīng)的字符int 21hmov al,bland al,0fh;再對低字節(jié)部分轉(zhuǎn)換(寄存器 al 傳參)call far ptr hexasc;調(diào)用子程序mov dl,almov ah,02h;顯示低字節(jié)部分對應(yīng)的字符int 21hmov dl,20hmov ah,02h;顯示空格int 21hinc siloop againmov ah,4ch int 21hcodeendscodebsegment assume

12、cs:codebhexascproc farcmp al,09h;判斷是不是數(shù)字ja hexatof;是字母則轉(zhuǎn)到 hexatofadd al,30h;是數(shù)字則對應(yīng)到數(shù)字的 ascii 碼jmp endhexhexatof:add al,37h;是字母則對應(yīng)到字母的 ascii 碼endhex: ret hexasc endp codebendsend start(2)實(shí)現(xiàn)方法二:近過程調(diào)用data segmentbuf db 10h,2fh,0d0h,0feh,33h,0f0h,20h,10h,3dh,0a2hcount equ $-buf;定義任意長度的一段 buf data endsst

13、ack1 segment stackdb 100 dup(?);設(shè)置足夠深度的棧區(qū)stack1 endscodesegmentassume cs:code,ds:data,ss:stack1start:mov ax,data mov ds,axmov si,offset buf mov cx,countagain:mov al,si;逐個取數(shù)mov bl,alshr al,4and al,0fh;先對高字節(jié)部分做轉(zhuǎn)換call hexascmov dl,al;顯示高字節(jié)部分對應(yīng)的字符mov ah,02h int 21hmov al,bland al,0fh;再對低字節(jié)部分做轉(zhuǎn)換call hexa

14、scmov dl,al;顯示低字節(jié)部分對應(yīng)的字符mov ah,02h int 21hmov dl,20h;顯示空格mov ah,02h int 21hinc si;繼續(xù)循環(huán)或退出loop againmov ah,4ch int 21hhexascproc near cmp al,09hja hexatof add al,30h jmp endhexhexatof:add al,37h endhex: rethexascendpcodeendsend start實(shí)驗(yàn)五:dos 中斷調(diào)用實(shí)驗(yàn)(1)如果從鍵盤上依次輸入的是一個數(shù)字和一個字母,則輸出“right”標(biāo)記后結(jié)束程序, 否則輸出標(biāo)記“err

15、or”后轉(zhuǎn)向原出錯處重做。試編程實(shí)現(xiàn)該功能。程序流程圖略。 參考源程序:datasegmentmsg db 0ah,0dh,'right',0ah,0dh,'$' wrn db 0ah,0dh,'error',0ah,0dh,'$'dataendscodesegmentassume cs:code, ds:data start:mov ax,datamov ds,axagain:mov ah,01h;等待用戶輸入 1 個字符并顯示int 21hcmp al,39h ja emsg cmp al,30hjb emsg;判斷輸入是否是

16、數(shù)字,不是則報(bào)錯mov ah,01h;等待用戶輸入 1 個字符并顯示int 21h cmp al,'a' jb emsgcmp al,'z';判斷輸入是否是大寫字母,不是則繼續(xù)jb exit;判斷是不是小寫字母cmp al,'a' jb emsg cmp al,'z'jb exit;不是字母則報(bào)錯,是字母則轉(zhuǎn)到 exitemsg:lea dx,wrn mov ah,09h int 21hjmp againexit:mov dx,offset msgmov ah,09h;顯示“right”并退出int 21hmov ah,4chin

17、t 21h codeendsend start(2)編寫一程序分類統(tǒng)計(jì)字符個數(shù):即接收鍵入的一串字符(字符個數(shù)不超過50個,該字 符串用回車作為結(jié)束),并按數(shù)字、字母和其它字符分類計(jì)數(shù),然后將結(jié)果存入digit、letter 和other 3個存儲單元中,并顯示結(jié)果。程序流程圖略。 參考源程序:datasegmentmsg1 db 0ah, 0dh, 'number of digit:',20h,'$' msg2 db 0ah, 0dh, 'number of letters:', 20h,'$'msg3 db 0ah, 0dh,

18、 'number of other characters:', 20h, '$' buf db 50db 0db 50 dup(?);設(shè)置足夠深的棧區(qū)digit db ? letter db ? other db ?dataendsstack1segment stack db 100 dup(?)stack1endscodesegmentassume cs:code,ds:data,ss:stack1start:mov ax,data mov ds,axmov ah,0ah;等待用戶輸入字符串并顯示mov dx,offset buf int 21hmov si,

19、 offset buf mov cl,si+1mov ch,00h mov al,00h mov ah,00h mov bh,00hagain:mov bl,si+2 cmp bl,30hjb oth;ascii 碼小于 30h 則歸類為“其它”cmp bl,3ahjb dig;ascii 碼大于等于 30h 小于 3ah 則歸類為“數(shù)字” cmp bl,41hjb oth;ascii 碼大于等于 3ah 小于 41h 則歸類為“其它” cmp bl,5bhjb let;ascii 碼大于等于 41h 小于 5bh 則歸類為“字母” cmp bl,61hjb oth;ascii 碼大于等于 5

20、bh 小于 61h 則歸類為“其它” cmp bl,7bhjb let;ascii 碼大于等于 61h 小于 7bh 則歸類為“字母”oth:inc al;“其它”計(jì)數(shù)器加 1dig:jmp endlp inc ah;“數(shù)字”計(jì)數(shù)器加 1let:jmp endlp inc bh;“字母”計(jì)數(shù)器加 1endlp:inc siloop again;繼續(xù)循環(huán)mov letter, bh mov other, almov dx, offset msg1mov ah,09h int 21hmov al, digit call disp;顯示“數(shù)字”有多少個mov dx, offset msg2mov a

21、h,09h int 21hmov al, letter call disp;顯示“字母”有多少個mov dx, offset msg3mov ah,09h int 21hmov al, other call disp;顯示“其它”有多少個mov ah,4ch int 21hdispproc near;顯示子程序mov digit, ah;統(tǒng)計(jì)各類個數(shù)mov ah,00h mov dh,0ah div dhmov ch,ah add al, 30h mov dl, al mov ah, 02h int 21hadd ch,30h mov dl, ch mov ah, 02h int 21hret

22、 dispendpcodeendsend start實(shí)驗(yàn)六:擴(kuò)展定時器/計(jì)數(shù)器接口實(shí)驗(yàn)(1)計(jì)數(shù)器0工作于方式3,編寫初始化程序,觀察其輸出out0信號的波形。修改計(jì)數(shù)初 值,觀察out0信號的變化情況。 硬件連接方法:8254計(jì)數(shù)器0的clk0端接規(guī)則的脈沖輸入(頻率自選),out0接示波器的 正極;示波器負(fù)極接地。程序流程圖略。 參考源程序:data segmentdb 100 dup(?) data endscodesegmentassume cs:code, ds:data start: mov ax,datamov ds,axmov dx,20fh;寫入計(jì)數(shù)器0的控制字mov al,

23、00010110b out dx,almov dx,20ch;寫入計(jì)數(shù)器0的計(jì)數(shù)初值mov al,05h out dx,almov ah,4ch int 21hcodeendsend start(2)將計(jì)數(shù)器1和計(jì)數(shù)器0級聯(lián)起來,二者均工作于方式3,編寫初始化程序,觀察out1 和out0信號的波形,說明二者的關(guān)系。修改計(jì)數(shù)初值,觀察out0和out1輸出波形的變 化情況。 硬件連接方法:8254計(jì)數(shù)器1的clk1端接規(guī)則的脈沖輸入(頻率自選),out1接8254計(jì)數(shù) 器0的clk0,計(jì)數(shù)器0的輸出out0接示波器正極;示波器負(fù)極接地。程序流程圖略。 參考源程序:datasegment db

24、100 dup(?)dataends codesegmentassume cs:code,ds:data start: mov ax,datamov ds,axmov dx,20fhmov al,00010110b;寫入計(jì)數(shù)器0的控制字out dx,almov dx,20ch;寫入計(jì)數(shù)器0的計(jì)數(shù)初值mov al,05h out dx,almov dx,20fhmov al,01010110b;寫入計(jì)數(shù)器1的控制字out dx,almov dx,20dh;寫入計(jì)數(shù)器1的計(jì)數(shù)初值mov al,02h out dx,almov ah,4ch int 21hcodeendsend start實(shí)驗(yàn)七:并

25、行輸入/輸出接口 8255a 簡單編程實(shí)驗(yàn)(1)利用 8255a 的 b 口輸出控制兩組發(fā)光二級管 l1,l3,l5,l7 和 l2,l4,l6,l8 亮滅交替變 化。分析:按照題目要求,當(dāng) 8255a 的 b 口輸出為 01010101b(55h)時,發(fā)光二極管 l1,l3,l5,l7 會被點(diǎn)亮,當(dāng) 8255a 的 b 口輸出為 10101010b (0aah)時,發(fā)光二極管 l2,l4,l6,l8 會被點(diǎn) 亮。因此,通過延時改變 8255a 的 b 口輸出,即可實(shí)現(xiàn)兩組發(fā)光二極管的亮滅交替變化。 由于 led 隨時出于準(zhǔn)備好的狀態(tài),因此 8255a 的 b 口可工作于方式 0 輸出,其它端

26、口未使 用,無需考慮。因此,8255a 的方式控制字為:10000000b(80h)。硬件連接方法:8255a 的 b 口 pb0pb7 分別連接 l1l8。 程序流程圖略。參考源程序:.486datasegmentporta dw 208h;8255a端口a地址 portb dw 209h;8255a端口b地址 portc dw 20ah;8255a端口c地址 port_ctr dw 20bh;8255a控制端口地址dataendsstack1 segment stack db 100 dup(?)stack1 endscodesegmentassume cs:code, ds:data,

27、ss:stack1start: mov ax,data mov ds,axmov dx, port_ctr mov al, 10000000b;8255a初始化;控制字out dx, almov dx, portb mov al, 00h out dx, al;8255a端口b清零,led初始化(全滅)lp0:mov bl, 01010101b mov al, blout dx, al call delaynot almov bl, almov ah, 01h;調(diào)用bios的16h功能判斷鍵盤是否有輸入int 16h jnz exit jmp lp0exit:mov ah, 4ch int 2

28、1hdelayproc near;延時子程序(可通過修改nop指令數(shù)量改變延時時間) mov ecx, 0fffffffhlp2:noploopd lp2ret delayendpcodeendsend start(2)利用 8255a 的 a 口讀入 8 個開關(guān) k1k8 的狀態(tài),當(dāng)只有 k1 合上時,l1l8 顯示00000001b;當(dāng)只有 k1 和 k2 合上時,l1l8 顯示 00000010b;當(dāng)只有 k1,k2 和 k3 合上 時,l1l8 顯示 00000011b;當(dāng)只有 k1,k2,k3 和 k4 合上時,l1l8 顯示 00000100b; 直到所有開關(guān)合上時,l1l8 顯示

29、 00001000b,并結(jié)束程序的運(yùn)行。發(fā)光二極管的狀態(tài)通 過 8255a 的 b 口進(jìn)行控制。分析:按照題目要求,可以通過查詢的方式讀取 8255a 的 b 口狀態(tài),并根據(jù)查詢的結(jié)果給 a 口送出相應(yīng)數(shù)據(jù),a 口工作在方式 0 的輸入狀態(tài),b 口工作在方式 0 輸出狀態(tài),c 口不需要 考慮,所以 8255a 的方式控制字為:10010000b)硬件連接方法:(1)8255a 的 a 口 pa0pa7 對應(yīng)連接 k1k8;(2)8255a 的 b 口 pb0pb7 對應(yīng)連接 l1l8; 源代碼:datasegmentlistdb 01h, 03h, 07h, 0fh, 1fh, 3fh, 7f

30、h, 0ffh dataendsstack1 segment stack db 100 dup(?)stack1 endscodesegmentassume cs:code, ds:data, ss:stack1start: mov ax, datamov ds, axmov dx, 20bh;8255a初始化mov al, 10010000b out dx, almov dx, 209h;8255a的b口清零,led初始化(全滅) mov al, 00hout dx, all0:mov dx, 208h;讀8255a的a口,獲得開關(guān)狀態(tài)in al, dxmov bl, 00h mov cx,

31、 8mov si, offset list l1:inc blcmp al, si jz find inc siloop l1jmp l0find:mov al, bl mov dx, 209h;當(dāng)前開關(guān)狀態(tài)為表中所列狀態(tài)之一;顯示led狀態(tài)out dx, al cmp al, 08h jnz l0mov ah, 4ch int 21hcodeendsend start實(shí)驗(yàn)八:并行輸入/輸出接口 8255a 綜合應(yīng)用實(shí)驗(yàn)(1)利用8254計(jì)數(shù)器0、計(jì)數(shù)器1和8255a的b口實(shí)現(xiàn)對發(fā)光二極管的定時控制,讓8個發(fā)光 二極管每隔1s從左到右依次點(diǎn)亮。(要求計(jì)數(shù)器1的時鐘脈沖頻率為250khz)。分析

32、: 根據(jù)題目要求,需要利用8254進(jìn)行定時1s控制,定時到后,改變8255a的b口輸出??梢岳弥袛嗟姆绞綄?shí)現(xiàn),8254定時到時向cpu申請中斷,cpu相應(yīng)中斷后在中斷程序中改變8255a的b口輸出。 由于題目要求8254的輸入脈沖頻率為250khz,所以需要級聯(lián)計(jì)數(shù)器1和計(jì)數(shù)器0實(shí)現(xiàn)1s定時(參考程序中利用計(jì)數(shù)器1進(jìn)行20ms定時,計(jì)數(shù)器0進(jìn)行50次計(jì)數(shù),計(jì)數(shù)次數(shù)到時由out0 向cpu申請中斷)。8255a的b口控制led,可工作在方式0輸出,a口未使用,為了選通實(shí) 驗(yàn)板上的中斷輸入c口的pc7須輸出低電平,因此c口的高四位工作在方式0輸出。綜合上述 要求,8254和8255a的初始化參數(shù)

33、為:8254計(jì)數(shù)器1的計(jì)數(shù)初值為:n=20ms/4µs=5000d;方式控制字為:01110100b (74h)8254計(jì)數(shù)器0的計(jì)數(shù)初值為:n=50d;方式控制字為:00010100b (14h)8255a的方式控制字:10000000b (80h);c口按位置位/復(fù)位控制字:00001110b (0eh)(使pc7復(fù)位,允許8254的out0中斷到達(dá)系統(tǒng)8259的irq3端)此外,利用中斷方式實(shí)現(xiàn)題目要求的功能還需要設(shè)置系統(tǒng)8259芯片的中斷屏蔽字和系統(tǒng) 存儲器中的中斷向量表(修改中斷類型號為0bh的中斷向量)。硬件連接方法:(1)250khz脈沖輸出接8254的clk1,out

34、1接clk0,out0接irq;(2)8255a的b口pb0pb7對應(yīng)連接l1l8。datasegmentport0 dw 20ch;8254計(jì)數(shù)器0端口地址port1 dw 20dh;8254計(jì)數(shù)器1端口地址port2 dw 20eh;8254計(jì)數(shù)器2端口地址port3 dw 20fh;8254控制寄存器端口地址porta dw 208h;8255a的a口端口地址portb dw 209h;8255a的b口端口地址portc dw 20ah;8255a的c口端口地址dataport_ctr dw 20bh ends;8255a的控制寄存器端口地址程序流程圖略。 參考源程序:stack1 se

35、gment stack db 100 dup(0)stack1 endscodesegmentassume cs:code, ds:data, es:data, ss:stack1start: mov ax, data mov ds, ax mov es, axmov al, 80h; 8255初始化, b口方式0輸出,c口高4位輸出mov dx, port_ctr out dx, almov al, 0eh;pc7清零,允許8254中斷到irq3out dx, almov al, 00h;發(fā)光二極管初始化(全滅) mov dx, portbout dx, almov ax, 350bh;保存

36、系統(tǒng)原有0bh號中斷的中斷向量至堆棧int 21h push es push bxmov ax, seg intproc mov ds, axmov dx, offset intprocmov ax, 250bh;將程序要求的中斷向量寫入int 21hin al, 21h;設(shè)置8259的imr寄存器,允許irq3中斷and al, 0f7h out 21h, alsti;開中斷,cpu可以響應(yīng)外部可屏蔽中斷mov dx, port3;8254計(jì)數(shù)器0初始化mov al, 14h out dx, almov dx, port0;計(jì)數(shù)器0寫入計(jì)數(shù)初值50dmov al, 50d out dx, a

37、lmov dx, port3;8254計(jì)數(shù)器1初始化mov al, 74h out dx, almov dx, port1;計(jì)數(shù)器1寫入計(jì)數(shù)初值5000dmov ax, 5000d out dx, al mov al, ah out dx, almov bh, 80h;bh存放當(dāng)前8255a的b口輸出mov al, bhmov dx, portb;8255a的b口輸出out dx, alwait0:nop nop nopmov ah, 01h;判斷鍵盤上是否有鍵按下,若有則結(jié)束程序int 16h jnz exit jmp wait0exit:pop dx;恢復(fù)中斷向量表中的原有0bh號中斷向量

38、pop dsmov ax, 250bh int 21hmov ah, 4ch int 21hintproc proc near mov al, bh ror al,1mov bh, almov dx, portb;向8255a的b口寫出數(shù)據(jù),點(diǎn)亮對應(yīng)led out dx, almov al, 20h;向8259發(fā)出中斷結(jié)束命令out 20h, al iretintproc endp codeendsend start(2)8255a的a口與8個開關(guān)相連,工作于方式1下,要求:利用當(dāng)前的開關(guān)狀態(tài)通過b口控 制l1l8的亮或滅。a口的/stba選通信號由按鍵k發(fā)出,每按一次k鍵,讀入當(dāng)前開關(guān)狀態(tài)。

39、 分析:8255a的b口用來控制led的亮滅,可工作在方式0下。 根據(jù)題意,可以通過查詢方式不斷讀取8255a的c口狀態(tài)確定k鍵是否按下,也可以利用中斷方式,當(dāng)k鍵按下時,由intra(pc3)向cpu申請中斷。當(dāng)判斷k鍵按下后,讀取8255a的a口狀態(tài),并通過b口顯示到led上。利用查詢方式實(shí)現(xiàn)時,僅需要給定方式選擇 控制字;利用中斷方式實(shí)現(xiàn)時,除控制字外還需設(shè)定intea為1,允許intra申請中斷。因此,8255a的方式控制字為:10110000b(0b0h);使 intea(pc4)置1,其控制字為00001001b(09h)。注意:利用中斷方式實(shí)現(xiàn)時還需要置pc7為0,使intra能

40、到達(dá)8259的irq3硬件連接與參考源程序:(1)利用查詢方式實(shí)現(xiàn) 硬件連接:1)8255a的a口pa0pa7與k1k8對應(yīng)相連;2)8255a的b口pb0pb7與l1l8對應(yīng)相連;3)按鍵k接8255a的c口pc4。 參考源程序:codesegment assume cs:codestart: mov al, 0b0h; 8255a初始化,方式控制字10110000bmov dx, 20bh out dx, almov dx, 209h;led初始化mov al, 00h out dx, alagain:mov ah, 01h;判斷計(jì)算機(jī)鍵盤上是否有鍵按下,若有結(jié)束程序int 16h jnz

41、 exitmov dx, 20ah;讀入8255a的c口狀態(tài)in al, dxtest al, 00010000b;判斷pc4=1?(k鍵是否按下) jnz againmov dx, 208h;讀入8255a的a口狀態(tài)in al, dxmov dx, 209h;將a口狀態(tài)送8255a的b口out dx, al jmp againexit:mov ah, 4ch int 21hcodeendsend start(2)利用中斷方式實(shí)現(xiàn) 硬件連接:1)8255a的a口pa0pa7與k1k8對應(yīng)相連;2)8255a的b口pb0pb7與l1l8對應(yīng)相連;3)按鍵k接8255a的c口pc4;4)8255a

42、的c口pc3(intra)接irq。 參考源程序:datasegmentporta dw 208h; 8255a的a口地址portb dw 209h; 8255a的b口地址portc dw 20ah; 8255a的c口地址dataport_ctr dw 20bh ends; 8255a的控制口地址stack1 segment stackdb 100 dup(0) stack1 endscodesegmentassume cs:code, ds:data, es:data, ss:stack1start: mov ax, data mov ds, ax mov es, axmov dx, por

43、t_ctr;寫入8255a方式控制字0b0h mov al, 0b0hout dx, almov al, 09h;寫入c口按位置位控制字,pc4置“1”out dx, almov al, 0eh;寫入c口按位復(fù)位控制字,pc7置“0”,開irq out dx, almov ax, 350bh;保存系統(tǒng)原有中斷號為0bh的中斷向量到堆棧int 21h push es push bxmov ax, seg intproc;向0bh號中斷寫入新的中斷向量mov ds, axmov dx, offset intproc mov ax, 250bhint 21hin al, 21h;允許8259的irq

44、3中斷and al, 0f7h out 21h, alsti;允許cpu響應(yīng)可屏蔽中斷wait0:mov ah, 01h;判斷是否有鍵按下,若有則結(jié)束程序,若無則等待int 16h jz wait0pop dx;恢復(fù)系統(tǒng)中斷向量表pop dsmov ax, 250bh int 21hmov ah, 4ch int 21hintproc proc nearmov dx, porta;讀入8255a端口a的狀態(tài)(開關(guān)狀態(tài))in al, dxmov dx, portb;從8255a的b口輸出開關(guān)狀態(tài),由對應(yīng)的led顯示out dx, almov al, 20h;給8259發(fā)中斷結(jié)束指令out 20h

45、, al iretintproc endpcodeendsend start實(shí)驗(yàn)九:led 顯示器接口實(shí)驗(yàn)(1)編制一個從左到右循環(huán)顯示字符“8”的程序,要求每個字位的停留時間約為1s,當(dāng)從標(biāo) 準(zhǔn)鍵盤上按下任意鍵時結(jié)束程序。分析: 根據(jù)題意要求,實(shí)驗(yàn)板上的6位8段數(shù)碼管的段選信號均相同,為字符“8”的段碼(80h)。為了實(shí)現(xiàn)從左到右循環(huán)顯示且每個字位停留約1s的功能,只需要每隔一秒給位選信號賦值, 選通/斷開相應(yīng)的位即可。當(dāng)循環(huán)顯示到最右端時,延時1s再從最左端開始顯示。為此,在 該題中我們利用8255a的a口作為6位led顯示器的段選口(地址208h),8255a的b口作為6 位led顯示器

46、的位選口(地址209h)。8255a的控制字為:10000000b(80h)硬件連接:(1)8255a的a口pa0pa7分別對應(yīng)連接led顯示器的段選輸入ah.(2)8255a的b口pb0pb5分別對應(yīng)連接led1led6顯示器的位選輸入。 程序流程圖略。參考源程序:.486stack1 segment stack db 100 dup(0)stack1 endscodesegmentassume cs:code, ss:stack1start: mov al, 80h; 8255a工作方式初始化,a口方式0輸出,b口方式0輸出mov dx, 20bh out dx, almov al, 80

47、h;8255a的a口輸出字符“8”的段碼80h mov dx, 208hout dx, all1:mov bl, 20h;led顯示器位選信號存放在bl中,20h表示最左邊一位l2:mov al, bl;將led位選信號輸出到8255a的b口mov dx, 209h out dx, alcall delay;調(diào)研軟件延時程序mov ah, 01h;判斷標(biāo)準(zhǔn)鍵盤上是否有鍵按下,若有則結(jié)束程序int 16h jnz exitshr bl, 1;led位選信號右移一位,選中下一位ledjnz l2jmp l1;當(dāng)循環(huán)到最右邊一位led時,重新填充bl值,開始新一輪循環(huán)exit:mov dx, 208

48、hmov al, 0ffh out dx, al mov dx, 209h mov al, 00hout dx, al;關(guān)閉所有l(wèi)edmov ah, 4ch int 21hdelayproc nearmov ecx, 0fffffffh lp:loopdlpret delay endp codeendsend start(2)完成多位led顯示器的顯示,即設(shè)計(jì)一個顯示字符串1234.56的程序,當(dāng)標(biāo)準(zhǔn)鍵盤上有 任意鍵按下時結(jié)束程序。基本思想: 借助動態(tài)掃描、分時顯示的辦法,利用人眼視覺的滯留效應(yīng),實(shí)現(xiàn)人眼看上去的各位“同時”顯示。 分析:利用實(shí)驗(yàn)操作面板上引出的8255a的分別a口和b口作為6

49、位8段led顯示器的位選口和 段選口,從段選口依次輸出待顯示字符的段碼,并選通相應(yīng)的位實(shí)現(xiàn)對多位led顯示器的刷 新。8255a的a口和b口均工作在方式0的輸出方式,方式控制字為:1000000b(80h)。 硬件連接:(1)8255a的a口pa0pa5對應(yīng)連接led1led6的位選;(2)8255a的b口pb0pb7對應(yīng)連接段選ah; 程序流程圖略。參考源程序:datasegmentsegtab db 0c0h, 0f9h, 0a4h, 0b0h;定義0f的段碼存儲區(qū)db 99h, 92h, 82h, 0f8h db 80h, 98h, 88h, 83hdb 0c6h, 0a1h, 86h,

50、 8ehdispmem db 01h, 02h, 03h, 04h, 05h, 06h;定義顯示緩沖區(qū)dataendsstack1 segment stack db 100 dup(0)stack1 ends codesegmentassume cs:code, ds:data, ss:stack1start: mov ax, data mov ds, axmov al, 80h;8255a初始化,a口輸出,b口輸出mov dx, 20bh out dx, all1:mov ah, 20h;預(yù)置位選信號lea si, dispmem;si指向顯示緩沖區(qū)lea bx, segtab;bx指向段碼

51、存儲區(qū)l2:mov al, si xlatcmp ah, 04h jne nextand al, 7fh;第4位led顯示小數(shù)點(diǎn)next:mov dx, 209h;輸出段碼out dx, almov dx, 208h;輸出位選信號mov al, ah out dx, almov cx, 4000;延時lp2:loop lp2push axmov ah, 01h;判斷標(biāo)準(zhǔn)鍵盤上是否有鍵按下,若有鍵按下則結(jié)束程序int 16h jnz exit pop axinc si;修改顯示緩沖區(qū)指針shr ah, 1;修改位選信號jnz l2jmp l1exit:mov dx, 208h mov al, 0

52、0h out dx, al mov dx, 209h mov al, 0ffhout dx, al;關(guān)閉所有l(wèi)edmov ah, 4ch int 21hcodeendsend start實(shí)驗(yàn)十:鍵盤接口實(shí)驗(yàn)編制1個用鍵盤控制模擬電動機(jī)轉(zhuǎn)動的程序,即用非編碼鍵盤上的a和b兩個鍵作轉(zhuǎn)、??刂?, 并在數(shù)碼顯示器上顯示f表示電機(jī)轉(zhuǎn)動,計(jì)算機(jī)屏幕上顯示笑臉符表示電機(jī)停,按回車鍵結(jié) 束程序執(zhí)行(笑臉符的ascii碼為02h)。分析: 根據(jù)題目的要求,需要不斷掃描4×4非編碼鍵盤,判斷鍵盤上a或b鍵(控制停轉(zhuǎn),在屏幕上顯示笑臉)是否按下。若按下a鍵則在led上顯示f,表示電機(jī)轉(zhuǎn)動;若按下b鍵則在計(jì) 算機(jī)屏幕(crt顯示器)上顯示

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論