计算机硬件技术基础实验答案程序_第1页
计算机硬件技术基础实验答案程序_第2页
计算机硬件技术基础实验答案程序_第3页
计算机硬件技术基础实验答案程序_第4页
计算机硬件技术基础实验答案程序_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一:简单程序设计实验(1)编写一个32 位无符号数除法的程序,要求将存放在NUM1 中的32 位无符号数与存放在NUM2 中的16 位无符号数相除,结果存放在NUM3和NUM4 中。程序流程图略。参考源程序:DATASEGMENTNUM1DD 2A8B7654H NUM2DW 5ABCH NUM3DW?NUM4DW? DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART: MOVAX,DATA;数据段寄存器初始化MOV DS,AXMOV AX, WORD PTR NUM1MOV DX, WORD PTR NUM1+2DIV NUM2MOV NUM3,A

2、X MOV NUM4,DXMOV AH,4CH;正常返回DOS系统INT21H CODEENDSEND START(2)编写一个拆字程序。要求将存放在ARY单元的2 位十六进制数X1X2拆为X1和X2 两部分,并以0X1和0X2的形式分别存入ARY+1 和ARY+2 单元中。程序流程图略。参考源程序:DATASEGMENT ARY DB2AH,?,?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODE START: MOVAX,DATAMOV DS,AXMOVSI,OFFSETARY;取ARY的偏移地址MOV AL,SI;取16进制数至ALMOVBL,ALAND A

3、L,0F0H;取16进制数的高四位,即X1SHRAL,4MOVSI+1,AL;存0X1MOV AL,BLAND AL,0FH;取16进制数的低四位,即X2MOVSI+2,AL;存0X2MOV AH,4CH INT21HCODEENDSEND START实验二:分支程序设计实验(1)编写一个字符比较程序,比较3个无符号字节数A,B,C的大小,并根据比较结果对变量K赋值:如果3 个数不相等,则K=0;如果3 个数中有两个相等,则K=1;如果3 个数都相等,则K=2。程序流程图略。参考源程序:DATASEGMENT;定义待比较数A、B、C,比较结果KA DB 20H B DB 20H C DB 20

4、H K DB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA START: MOVAX,DATAMOV DS,AX MOV AL,ACMPAL,B;对A、B进行比较,不相等则转到COMP2JNECOMP2;相等则比较A、CCMPAL,CJNEK1;A、C不相等则K=1JMPK2;A、C相等则K=2COMP2: MOV BL,B CMPBL,CJE K1;对B、C进行比较,相等则K=1CMPAL,CJE K1;对A、C进行比较,相等则K=1K0:MOV K,0JMPEXIT K1:MOV K,1JMPEXIT K2:MOV K,2EXIT:MOVAH,4CHI

5、NT21HCODEENDSEND START(2)编写一个能实现下列表达式的程序:N=A+BAB设A,B,C 为小于128 的正整数。AB+C程序流程图略。参考源程序:DATASEGMENTABADB 22H;定义A、B、C、N B DB 10HC DB 01H N DB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA START: MOVAX,DATAMOVDS,AXMOVAL,A CMPAL,BJGCALCUL;A 小于或等于B则N=A+BADDAL,B JMPEXITCALCUL:SUBAL, B ADCAL,CEXIT:MOVN,AL MOVAH,4

6、CH INT21HCODEENDSEND START实验三循环程序设计实验(1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。统计结果存于N单元中。程序流程图略。参考源程序:DATASEGMENTSTRN DBWhat$;任意定义一个字串,以“$”结尾COUNTEQU $-STRN N DB?BUF DB COUNTDUP(?) DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATA START:MOVAX, DATAMOVDS,AX MOVAX,DATA MOVES,AXLEASI,STRN L

7、EADI,BUFMOVCX, COUNT MOVAL,0LP1:MOVBL,SI;逐个取字符进行判断AND BL,BL;自己和自己做与运算JPNEXT;根据PF 标志位的变化进行跳转INCALORBL,80H NEXT:MOVDI, BLINCSI INCDI LOOPLP1MOVN,AL MOVAH, 4CHINT21HCODEENDSEND START(2)在FIRST开始的一片连续的数据区中存放着100个数据,编写一个程序,统计第1个数据0之前的数据个数。程序流程图略。参考源程序:DATASEGMENTFIRSTDB10H,24H,34H, 73H,20H,44H,03H,36H,41H

8、;任取9 个数做演示COUNTEQU $-FIRST NUMDB?DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATA START:MOVAX,DATAMOVDS,AXMOVDL,0;计数值初始为0MOVCX,COUNTMOVBX, OFFSETFIRSTLP1:MOVAL, BX;每次取一个数,与0 比较CMPAL, 00H JNENEXTJMPEXIT;找到0 则退出NEXT:INCDL;没找到0 则计数值加1INCBX LOOPLP1EXIT:MOVNUM, DL MOVAH, 4CH INT21HCODEENDSEND START实验四:子程序设计实验将

9、BUF开始的10个单元中两位十六进制数转换成ASCII码,并在屏幕上显示出来。要求码型转换通过子程序HEXASC实现,参数传送采用寄存器传送方式。程序流程图略。参考源程序: (1)实现方法一:远过程调用DATASEGMENTBUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2HCOUNTEQU $-BUF;定义任意长度的一段BUF DATAENDSSTACK1SEGMENTSTACKDB100DUP(?);设置足够深度的栈区STACK1ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START:MOVAX,

10、DATA MOVDS,AXMOVSI,OFFSETBUF MOVCX,COUNTAGAIN:MOVAL,SI;逐个取数MOVBL,ALSHRAL,4ANDAL,0FH;先对高字节部分转换(寄存器AL传参)CALLFARPTRHEXASC;调用子程序MOVDL,ALMOVAH,02H;显示高字节部分对应的字符INT21HMOVAL,BLANDAL,0FH;再对低字节部分转换(寄存器AL传参)CALLFARPTRHEXASC;调用子程序MOVDL,ALMOVAH,02H;显示低字节部分对应的字符INT21HMOVDL,20HMOVAH,02H;显示空格INT21HINCSILOOPAGAINMOV

11、AH,4CH INT21HCODEENDSCODEBSEGMENT ASSUME CS:CODEBHEXASCPROC FARCMPAL,09H;判断是不是数字JAHEXATOF;是字母则转到HEXATOFADDAL,30H;是数字则对应到数字的ASCII 码JMPENDHEXHEXATOF:ADDAL,37H;是字母则对应到字母的ASCII 码ENDHEX: RET HEXASCENDP CODEBENDSEND START(2)实现方法二:近过程调用DATASEGMENTBUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2HCOUNTEQU $-B

12、UF;定义任意长度的一段BUF DATAENDSSTACK1SEGMENTSTACKDB100DUP(?);设置足够深度的栈区STACK1ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATA MOVDS,AXMOVSI,OFFSETBUF MOVCX,COUNTAGAIN:MOVAL,SI;逐个取数MOVBL,ALSHRAL,4ANDAL,0FH;先对高字节部分做转换CALLHEXASCMOVDL,AL;显示高字节部分对应的字符MOVAH,02H INT21HMOVAL,BLANDAL,0FH;再对低字节部分做转换CAL

13、LHEXASCMOVDL,AL;显示低字节部分对应的字符MOVAH,02H INT21HMOVDL,20H;显示空格MOVAH,02H INT21HINCSI;继续循环或退出LOOPAGAINMOVAH,4CH INT21HHEXASCPROC NEAR CMPAL,09HJAHEXATOF ADDAL,30H JMPENDHEXHEXATOF:ADDAL,37H ENDHEX: RETHEXASCENDPCODEENDSEND START实验五:DOS中断调用实验(1)如果从键盘上依次输入的是一个数字和一个字母,则输出“RIGHT”标记后结束程序,否则输出标记“ERROR”后转向原出错处重做

14、。试编程实现该功能。程序流程图略。参考源程序:DATASEGMENTMSG DB 0AH,0DH,RIGHT,0AH,0DH,$ WRN DB 0AH,0DH,ERROR,0AH,0DH,$DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATA START:MOVAX,DATAMOVDS,AXAGAIN:MOVAH,01H;等待用户输入1 个字符并显示INT21HCMPAL,39H JAEMSG CMPAL,30HJBEMSG;判断输入是否是数字,不是则报错MOVAH,01H;等待用户输入1 个字符并显示INT21H CMPAL,A JBEMSGCMPAL,Z;判

15、断输入是否是大写字母,不是则继续JBEXIT;判断是不是小写字母CMPAL,a JBEMSG CMPAL,zJBEXIT;不是字母则报错,是字母则转到EXITEMSG:LEADX,WRN MOVAH,09H INT21HJMPAGAINEXIT:MOVDX,OFFSETMSGMOVAH,09H;显示“RIGHT”并退出INT21HMOVAH,4CHINT21H CODEENDSEND START(2)编写一程序分类统计字符个数:即接收键入的一串字符(字符个数不超过50个,该字符串用回车作为结束),并按数字、字母和其它字符分类计数,然后将结果存入digit、letter 和other3个存储单元

16、中,并显示结果。程序流程图略。参考源程序:DATASEGMENTMSG1DB 0AH,0DH, Number of digit:,20H,$ MSG2DB 0AH,0DH, Number of letters:, 20H,$MSG3DB0AH,0DH,Numberofothercharacters:,20H,$ BUF DB 50DB0DB50DUP(?);设置足够深的栈区DIGITDB? LETTER DB? OTHER DB?DATAENDSSTACK1SEGMENTSTACK DB100DUP(?)STACK1ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,S

17、S:STACK1START:MOVAX,DATA MOVDS,AXMOVAH,0AH;等待用户输入字符串并显示MOVDX,OFFSETBUF INT21HMOVSI, OFFSETBUF MOVCL,SI+1MOVCH,00H MOVAL,00H MOVAH,00H MOVBH,00HAGAIN:MOVBL,SI+2 CMPBL,30HJBOTH;ASCII 码小于30H则归类为“其它”CMPBL,3AHJBDIG;ASCII 码大于等于30H 小于3AH 则归类为“数字” CMPBL,41HJBOTH;ASCII 码大于等于3AH 小于41H则归类为“其它” CMPBL,5BHJBLET;A

18、SCII 码大于等于41H 小于5BH则归类为“字母” CMPBL,61HJBOTH;ASCII 码大于等于5BH 小于61H则归类为“其它” CMPBL,7BHJBLET;ASCII 码大于等于61H 小于7BH则归类为“字母”OTH:INCAL;“其它”计数器加1DIG:JMPENDLP INCAH;“数字”计数器加1LET:JMPENDLP INCBH;“字母”计数器加1ENDLP:INCSILOOPAGAIN;继续循环MOV LETTER, BH MOV OTHER, ALMOV DX, OFFSET MSG1MOV AH,09H INT 21HMOV AL, DIGIT CALL D

19、ISP;显示“数字”有多少个MOV DX, OFFSET MSG2MOV AH,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;显示子程序MOVDIGIT,AH;统计各类个数MOVAH,00H MOVDH,0AH DIVDHMOVCH,AH ADDAL, 30H MOVDL,AL MOVAH, 02H INT21HADD CH,30H MOVDL,

20、CH MOVAH, 02H INT21HRET DISPENDPCODEENDSEND START实验六:扩展定时器/计数器接口实验(1)计数器0工作于方式3,编写初始化程序,观察其输出OUT0信号的波形。修改计数初值,观察OUT0信号的变化情况。硬件连接方法:8254计数器0的CLK0端接规则的脉冲输入(频率自选),OUT0接示波器的正极;示波器负极接地。程序流程图略。参考源程序:DATA SEGMENTDB100DUP(?) DATA ENDSCODESEGMENTASSUME CS:CODE,DS:DATA START: MOVAX,DATAMOV DS,AXMOV DX,20FH;写入

21、计数器0的控制字MOV AL,00010110B OUTDX,ALMOV DX,20CH;写入计数器0的计数初值MOV AL,05H OUTDX,ALMOV AH,4CH INT21HCODEENDSEND START(2)将计数器1和计数器0级联起来,二者均工作于方式3,编写初始化程序,观察OUT1 和OUT0信号的波形,说明二者的关系。修改计数初值,观察OUT0和OUT1输出波形的变化情况。硬件连接方法:8254计数器1的CLK1端接规则的脉冲输入(频率自选),OUT1接8254计数器0的CLK0,计数器0的输出OUT0接示波器正极;示波器负极接地。程序流程图略。参考源程序:DATASEG

22、MENT DB 100 DUP(?)DATAENDS CODESEGMENTASSUME CS:CODE,DS:DATA START: MOVAX,DATAMOV DS,AXMOV DX,20FHMOV AL,00010110B;写入计数器0的控制字OUTDX,ALMOV DX,20CH;写入计数器0的计数初值MOV AL,05H OUTDX,ALMOV DX,20FHMOV AL,01010110B;写入计数器1的控制字OUTDX,ALMOV DX,20DH;写入计数器1的计数初值MOV AL,02H OUTDX,ALMOV AH,4CH INT21HCODEENDSEND START实验七

23、:并行输入/输出接口8255A简单编程实验(1)利用8255A的B口输出控制两组发光二级管L1,L3,L5,L7和L2,L4,L6,L8 亮灭交替变化。分析:按照题目要求,当8255A 的B 口输出为01010101B(55H)时,发光二极管L1,L3,L5,L7 会被点亮,当8255A的B口输出为10101010B (0AAH)时,发光二极管L2,L4,L6,L8 会被点亮。因此,通过延时改变8255A 的B口输出,即可实现两组发光二极管的亮灭交替变化。由于LED随时出于准备好的状态,因此8255A的B口可工作于方式0 输出,其它端口未使用,无需考虑。因此,8255A 的方式控制字为:100

24、00000B(80H)。硬件连接方法:8255A的B口PB0PB7 分别连接L1L8。程序流程图略。参考源程序:.486DATASEGMENTPORTA DW 208H;8255A端口A地址PORTB DW 209H;8255A端口B地址PORTC DW 20AH;8255A端口C地址PORT_CTRDW20BH;8255A控制端口地址DATAENDSSTACK1 SEGMENTSTACK DB 100 DUP(?)STACK1 ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START: MOVAX,DATA MOV DS,AXMOV DX, P

25、ORT_CTR MOV AL,10000000B;8255A初始化;控制字OUTDX,ALMOV DX,PORTB MOV AL, 00H OUTDX,AL;8255A端口B清零,LED初始化(全灭)LP0:MOVBL, 01010101B MOV AL,BLOUTDX, ALCALL DELAYNOTALMOVBL,ALMOV AH,01H;调用BIOS的16H功能判断键盘是否有输入INT16H JNZEXIT JMPLP0EXIT:MOVAH,4CH INT21HDELAYPROCNEAR;延时子程序(可通过修改NOP指令数量改变延时时间) MOVECX,0FFFFFFFHLP2:NOPL

26、OOPDLP2RET DELAYENDPCODEENDSEND START(2)利用8255A的A口读入8个开关K1K8的状态,当只有K1合上时,L1L8显示00000001B;当只有K1 和K2 合上时,L1L8 显示00000010B;当只有K1,K2 和K3合上时,L1L8 显示00000011B;当只有K1,K2,K3 和K4 合上时,L1L8 显示00000100B; 直到所有开关合上时,L1L8 显示00001000B,并结束程序的运行。发光二极管的状态通过8255A的B口进行控制。分析:按照题目要求,可以通过查询的方式读取8255A 的B口状态,并根据查询的结果给A 口送出相应数

27、据,A口工作在方式0 的输入状态,B口工作在方式0 输出状态,C口不需要考虑,所以8255A 的方式控制字为:10010000B)硬件连接方法:(1)8255A的A口PA0PA7 对应连接K1K8;(2)8255A的B口PB0PB7 对应连接L1L8;源代码:DATASEGMENTLISTDB 01H,03H,07H,0FH, 1FH,3FH,7FH,0FFH DATAENDSSTACK1 SEGMENTSTACK DB 100 DUP(?)STACK1 ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START: MOVAX,DATAMOV DS

28、, AXMOV DX,20BH;8255A初始化MOV AL,10010000B OUTDX,ALMOV DX,209H;8255A的B口清零,LED初始化(全灭) MOV AL, 00HOUTDX,ALL0:MOVDX,208H;读8255A的A口,获得开关状态IN AL, DXMOVBL, 00H MOVCX,8MOVSI,OFFSETLIST L1:INCBLCMPAL,SI JZ FIND INCSILOOPL1JMPL0FIND:MOVAL,BL MOV DX,209H;当前开关状态为表中所列状态之一;显示LED状态OUTDX,AL CMPAL,08H JNZL0MOV AH, 4C

29、H INT21HCODEENDSEND START实验八:并行输入/输出接口8255A综合应用实验(1)利用8254计数器0、计数器1和8255A的B口实现对发光二极管的定时控制,让8个发光二极管每隔1s从左到右依次点亮。(要求计数器1的时钟脉冲频率为250kHz)。分析:根据题目要求,需要利用8254进行定时1s控制,定时到后,改变8255A的B口输出。可以利用中断的方式实现,8254定时到时向CPU申请中断,CPU相应中断后在中断程序中改变8255A的B口输出。由于题目要求8254的输入脉冲频率为250kHz,所以需要级联计数器1和计数器0实现1s定时(参考程序中利用计数器1进行20ms定

30、时,计数器0进行50次计数,计数次数到时由OUT0 向CPU申请中断)。8255A的B口控制LED,可工作在方式0输出,A口未使用,为了选通实验板上的中断输入C口的PC7须输出低电平,因此C口的高四位工作在方式0输出。综合上述要求,8254和8255A的初始化参数为:8254计数器1的计数初值为:N=20ms/4s=5000D;方式控制字为:01110100B(74H)8254计数器0的计数初值为:N=50D;方式控制字为:00010100B (14H)8255A的方式控制字:10000000B (80H);C口按位置位/复位控制字:00001110B (0EH)(使PC7复位,允许8254的

31、OUT0中断到达系统8259的IRQ3端)此外,利用中断方式实现题目要求的功能还需要设置系统8259芯片的中断屏蔽字和系统存储器中的中断向量表(修改中断类型号为0BH的中断向量)。硬件连接方法:(1)250kHz脉冲输出接8254的CLK1,OUT1接CLK0,OUT0接IRQ;(2)8255A的B口PB0PB7对应连接L1L8。DATASEGMENTPORT0 DW 20CH;8254计数器0端口地址PORT1 DW 20DH;8254计数器1端口地址PORT2 DW 20EH;8254计数器2端口地址PORT3 DW 20FH;8254控制寄存器端口地址PORTA DW 208H;8255

32、A的A口端口地址PORTB DW 209H;8255A的B口端口地址PORTC DW 20AH;8255A的C口端口地址DATAPORT_CTR DW 20BH ENDS;8255A的控制寄存器端口地址程序流程图略。参考源程序:STACK1 SEGMENTSTACK DB 100 DUP(0)STACK1 ENDSCODESEGMENTASSUME CS:CODE, DS:DATA,ES:DATA,SS:STACK1START: MOVAX,DATA MOV DS, AX MOVES, AXMOV AL,80H; 8255初始化,B口方式0输出,C口高4位输出MOV DX,PORT_CTR O

33、UTDX,ALMOV AL,0EH;PC7清零,允许8254中断到IRQ3OUTDX,ALMOV AL, 00H;发光二极管初始化(全灭) MOV DX,PORTBOUTDX,ALMOV AX,350BH;保存系统原有0BH号中断的中断向量至堆栈INT21H PUSHES PUSHBXMOVAX,SEG INTPROC MOV DS, AXMOVDX,OFFSET INTPROCMOV AX,250BH;将程序要求的中断向量写入INT21HINAL,21H;设置8259的IMR寄存器,允许IRQ3中断AND AL,0F7H OUT21H,ALSTI;开中断,CPU可以响应外部可屏蔽中断MOV

34、DX,PORT3;8254计数器0初始化MOV AL, 14H OUTDX,ALMOV DX,PORT0;计数器0写入计数初值50DMOV AL, 50D OUTDX,ALMOV DX,PORT3;8254计数器1初始化MOV AL, 74H OUTDX,ALMOV DX,PORT1;计数器1写入计数初值5000DMOV AX,5000D OUTDX,ALMOV AL, AH OUTDX,ALMOVBH,80H;BH存放当前8255A的B口输出MOV AL,BHMOV DX,PORTB;8255A的B口输出OUTDX,ALWAIT0:NOP NOP NOPMOV AH,01H;判断键盘上是否有

35、键按下,若有则结束程序INT16H JNZEXIT JMPWAIT0EXIT:POPDX;恢复中断向量表中的原有0BH号中断向量POPDSMOV AX,250BH INT21HMOV AH, 4CH INT21HINTPROCPROC NEAR MOV AL,BH RORAL,1MOVBH,ALMOV DX,PORTB;向8255A的B口写出数据,点亮对应LED OUT DX,ALMOV AL, 20H;向8259发出中断结束命令OUT 20H,AL IRETINTPROCENDP CODEENDSEND START(2)8255A的A口与8个开关相连,工作于方式1下,要求:利用当前的开关状态

36、通过B口控制L1L8的亮或灭。A口的/STBA选通信号由按键K发出,每按一次K键,读入当前开关状态。分析:8255A的B口用来控制LED的亮灭,可工作在方式0下。根据题意,可以通过查询方式不断读取8255A的C口状态确定K键是否按下,也可以利用中断方式,当K键按下时,由INTRA(PC3)向CPU申请中断。当判断K键按下后,读取8255A的A口状态,并通过B口显示到LED上。利用查询方式实现时,仅需要给定方式选择控制字;利用中断方式实现时,除控制字外还需设定INTEA为1,允许INTRA申请中断。因此,8255A的方式控制字为:10110000B(0B0H);使INTEA(PC4)置1,其控制

37、字为00001001B(09H)。注意:利用中断方式实现时还需要置PC7为0,使INTRA能到达8259的IRQ3硬件连接与参考源程序:(1)利用查询方式实现硬件连接:1)8255A的A口PA0PA7与K1K8对应相连;2)8255A的B口PB0PB7与L1L8对应相连;3)按键K接8255A的C口PC4。参考源程序:CODESEGMENT ASSUME CS:CODESTART: MOVAL,0B0H;8255A初始化,方式控制字10110000BMOV DX,20BH OUTDX,ALMOV DX,209H;LED初始化MOV AL, 00H OUTDX, ALAGAIN:MOV AH,

38、01H;判断计算机键盘上是否有键按下,若有结束程序INT16H JNZEXITMOV DX,20AH;读入8255A的C口状态INAL,DXTEST AL,00010000B;判断PC4=1?(K键是否按下) JNZAGAINMOV DX,208H;读入8255A的A口状态INAL,DXMOV DX,209H;将A口状态送8255A的B口OUTDX,AL JMP AGAINEXIT:MOVAH,4CH INT21HCODEENDSEND START(2)利用中断方式实现硬件连接:1)8255A的A口PA0PA7与K1K8对应相连;2)8255A的B口PB0PB7与L1L8对应相连;3)按键K接

39、8255A的C口PC4;4)8255A的C口PC3(INTRA)接IRQ。参考源程序:DATASEGMENTPORTA DW 208H; 8255A的A口地址PORTB DW 209H; 8255A的B口地址PORTC DW 20AH; 8255A的C口地址DATAPORT_CTR DW20BH ENDS; 8255A的控制口地址STACK1 SEGMENTSTACKDB 100 DUP(0) STACK1 ENDSCODESEGMENTASSUME CS:CODE, DS:DATA,ES:DATA,SS:STACK1START: MOVAX,DATA MOV DS, AX MOVES, AX

40、MOV DX,PORT_CTR;写入8255A方式控制字0B0H MOV AL,0B0HOUTDX,ALMOV AL, 09H;写入C口按位置位控制字,PC4置“1”OUTDX,ALMOV AL,0EH;写入C口按位复位控制字,PC7置“0”,开IRQ OUT DX,ALMOV AX,350BH;保存系统原有中断号为0BH的中断向量到堆栈INT21H PUSHES PUSHBXMOVAX,SEG INTPROC;向0BH号中断写入新的中断向量MOV DS, AXMOVDX,OFFSET INTPROC MOV AX,250BHINT21HINAL,21H;允许8259的IRQ3中断AND AL

41、,0F7H OUT21H,ALSTI;允许CPU响应可屏蔽中断WAIT0:MOV AH, 01H;判断是否有键按下,若有则结束程序,若无则等待INT16H JZWAIT0POPDX;恢复系统中断向量表POPDSMOV AX,250BH INT21HMOV AH, 4CH INT21HINTPROCPROC NEARMOV DX,PORTA;读入8255A端口A的状态(开关状态)INAL,DXMOV DX,PORTB;从8255A的B口输出开关状态,由对应的LED显示OUTDX,ALMOV AL, 20H;给8259发中断结束指令OUT 20H,AL IRETINTPROCENDPCODEEND

42、SEND START实验九:LED显示器接口实验(1)编制一个从左到右循环显示字符“8”的程序,要求每个字位的停留时间约为1s,当从标准键盘上按下任意键时结束程序。分析:根据题意要求,实验板上的6位8段数码管的段选信号均相同,为字符“8”的段码(80H)。为了实现从左到右循环显示且每个字位停留约1s的功能,只需要每隔一秒给位选信号赋值,选通/断开相应的位即可。当循环显示到最右端时,延时1s再从最左端开始显示。为此,在该题中我们利用8255A的A口作为6位LED显示器的段选口(地址208H),8255A的B口作为6 位LED显示器的位选口(地址209H)。8255A的控制字为:10000000B

43、(80H)硬件连接:(1)8255A的A口PA0PA7分别对应连接LED显示器的段选输入ah.(2)8255A的B口PB0PB5分别对应连接LED1LED6显示器的位选输入。程序流程图略。参考源程序:.486STACK1 SEGMENTSTACK DB 100 DUP(0)STACK1 ENDSCODESEGMENTASSUME CS:CODE,SS:STACK1START: MOVAL, 80H;8255A工作方式初始化,A口方式0输出,B口方式0输出MOV DX,20BH OUTDX,ALMOV AL,80H;8255A的A口输出字符“8”的段码80H MOV DX,208HOUTDX,A

44、LL1:MOV BL, 20H;LED显示器位选信号存放在BL中,20H表示最左边一位L2:MOVAL,BL;将LED位选信号输出到8255A的B口MOV DX,209H OUTDX,ALCALL DELAY;调研软件延时程序MOV AH,01H;判断标准键盘上是否有键按下,若有则结束程序INT16H JNZEXITSHRBL,1;LED位选信号右移一位,选中下一位LEDJNZL2JMPL1;当循环到最右边一位LED时,重新填充BL值,开始新一轮循环EXIT:MOVDX,208HMOV AL,0FFH OUT DX,AL MOV DX,209H MOV AL, 00HOUT DX,AL;关闭所

45、有LEDMOV AH, 4CH INT21HDELAYPROC NEARMOVECX,0FFFFFFFH LP:LOOPDLPRET DELAYENDP CODEENDSEND START(2)完成多位LED显示器的显示,即设计一个显示字符串1234.56的程序,当标准键盘上有任意键按下时结束程序。基本思想:借助动态扫描、分时显示的办法,利用人眼视觉的滞留效应,实现人眼看上去的各位“同时”显示。分析:利用实验操作面板上引出的8255A的分别A口和B口作为6位8段LED显示器的位选口和段选口,从段选口依次输出待显示字符的段码,并选通相应的位实现对多位LED显示器的刷新。8255A的A口和B口均工

46、作在方式0的输出方式,方式控制字为:1000000B(80H)。硬件连接:(1)8255A的A口PA0PA5对应连接LED1LED6的位选;(2)8255A的B口PB0PB7对应连接段选ah;程序流程图略。参考源程序:DATASEGMENTSEGTAB DB0C0H, 0F9H, 0A4H, 0B0H;定义0F的段码存储区DB 99H,92H, 82H,0F8H DB 80H,98H, 88H, 83HDB0C6H,0A1H,86H,8EHDISPMEM DB01H,02H,03H,04H,05H,06H;定义显示缓冲区DATAENDSSTACK1 SEGMENTSTACK DB 100 DU

47、P(0)STACK1 ENDS CODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START: MOVAX,DATA MOV DS, AXMOV AL,80H;8255A初始化,A口输出,B口输出MOV DX,20BH OUTDX,ALL1:MOVAH,20H;预置位选信号LEA SI, DISPMEM;SI指向显示缓冲区LEA BX,SEGTAB;BX指向段码存储区L2:MOVAL,SI XLATCMP AH, 04H JNENEXTAND AL,7FH;第4位LED显示小数点NEXT:MOVDX,209H;输出段码OUTDX,ALMOV DX,208H;

48、输出位选信号MOV AL, AH OUTDX,ALMOVCX,4000;延时LP2:LOOPLP2PUSH AXMOV AH,01H;判断标准键盘上是否有键按下,若有键按下则结束程序INT16H JNZEXIT POPAXINCSI;修改显示缓冲区指针SHR AH,1;修改位选信号JNZL2JMPL1EXIT:MOVDX,208H MOV AL, 00H OUT DX,AL MOV DX,209H MOV AL,0FFHOUT DX,AL;关闭所有LEDMOV AH, 4CH INT21HCODEENDSEND START实验十:键盘接口实验编制1个用键盘控制模拟电动机转动的程序,即用非编码键

49、盘上的A和B两个键作转、停控制,并在数码显示器上显示F表示电机转动,计算机屏幕上显示笑脸符表示电机停,按回车键结束程序执行(笑脸符的ASCII码为02H)。分析:根据题目的要求,需要不断扫描44非编码键盘,判断键盘上A或B键(控制停转,在屏幕上显示笑脸)是否按下。若按下A键则在LED上显示F,表示电机转动;若按下B键则在计算机屏幕(CRT显示器)上显示笑脸,表示电机停转。可以用8255A的C口作为非编码键盘的行扫描信号,同时作为LED的位选信号,B口作为非编码键盘的列扫描信号,A口作为LED的段选信号。8255A的C口工作在输出方式,B口工作在输入方式,A口工作在输出方式,8255A的方式控制字为:10000010B(82H)硬件连接:(1)8255A的A口的PA0PA7接段选信号af;(2)8255A的B口的PB0PB3接非编码键盘的列扫描端(J9)(3)8255A的C口的PC0PC5接LED的位选信号(同时也是非编码键盘的行扫描线)程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论