实验三:利用8259A中断实现LED灯和数码管显示实验安全0901王宇航09283020实验报告1.实验目的:了解8259中断控制器的基本使用,掌握中断程序编程技术。同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。2.实验步骤:8254A的OUT1输出接到8259A的MIR5上,每秒产生一次中断信号向8259A发出中断请求,在中断程序里将连接在8255A口的LED灯按照中断次数二进制点亮(即中断一次L0亮,中断两次L1亮,中断三次L1L0亮,中断四次L2亮……)。同时在数码管低位上显示中断次数。满10次后停止。1.8254A在主程序中初始化。CLK0工作在方式3,则控制字为00110110B,计数常数设为1000;CLK1工作在方式3,则控制字为01110110B,计数常数设为1000,则OUT1输出为1HZ的方波。2.8255A在使用前需要在主程序中初始化。A口方式0输出,B口方式0输入,则控制字为10000011B。3.8259A不用初始化,但在程序中需要包含以下几个部分:(1)8259A的MIR5对应的中断向量号为35H,需用此来设置中断入口地址。(2)设置中断入口地址之后,需设置中断屏蔽字OCW1,使IR5请求被允许,其他请求被禁止。(3)中断服务程序结束之前写OCW2,送中断结束命令EOI。4.中断服务程序的主要功能是LED指示灯和数码管显示。图3-1实验连线图注意:实验系统的主8259A的片选信号为20H。3.实验代码:.Modelsmall.386DATASEGMENTDATA0DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;分别对应字符0-9COUNTDB10;计数值为10DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;DS装入段基址LEASI,DATA0;取操作数DATA0的16位偏移地址送到寄存器SI中;8254初始化MOVDX,203H;8254命令口MOVAL,00110110B;控制字--0通道、方式3(方波发生器)、二进制计数OUTDX,AL;将控制字写入命令口MOVDX,200H;0通道的数据口MOVAX,1000;计数常数=1000OUTDX,AL;先写入低字节MOVAL,AHOUTDX,AL;再写入高字节MOVDX,203H;8254命令口MOVAL,01110110B;控制字1通道、方式3(方波发生器)、二进制计数OUTDX,ALMOVDX,201H;1通道的数据口MOVAX,1000;计数常数=1000OUTDX,ALMOVAL,AHOUTDX,AL;8255初始化MOVDX,213H;8255命令口MOVAL,10000011B;8255控制字--A口方式0输出,B口方式0输入OUTDX,AL;将控制字写入命令口;中断入口地址设置(用串指令)CLI;关中断MOVAX,0MOVES,AX;置附件段基地址为0MOVDI,4*35H;置附件段偏移地址到DIMOVAX,OFFSETINT_35;置中断程序首地址的偏移量到AXCLDSTOSW;填首地址的偏移量到中断地址表MOVAX,SEGINT_35;置中断程序的段基地址到AXSTOSW;填段基地址到中断地址表INAL,21H;读中断屏蔽寄存器IMRANDAL,11011111B;设置中断屏蔽字OCW1,IR5请求被允许,其他请求被禁止OUT21H,AL;将OCW1写入IMR中STI;开中断WAIT:CMPCOUNT,10;判断10次中断是否结束JNZWAIT;未结束,等待CLI;10次中断后,关中断MOVAH,4CH;结束,返回DOSINT21H;延时程序DELAYPROCPUSHCX;保护现场MOVCX,100H;延时时间为处理一次CX自减1的时间乘以100HDELAY1:LOOPDELAY1POPCX;恢复现场RET;返回到调用处,继续执行DELAYENDP;中断服务程序INT_35PROCPUSHDX;保护现场PUSHAXPUSHCXCLI;关中断MOVAX,DATAMOVDS,AXINCCOUNT;中断次数加1MOVAL,COUNT;将中断次数写入AL中MOVDX,210H;8255数据口OUTDX,AL;将中断次数输出到LED显示灯MOVCX,680HCMPCOUNT,10JBGOON-randomirandom;;低于10时跳转到GOONCMPCOUNT,10JNZL1;不等于10(此处即大于10)时跳转到L1SUBSI,9;第10次中断时SI减去9,即归0L1:MOVAL,[SI];查表,对应0-9MOVDX,220H;地址译码器连接六位数码管电路的数据口OUTDX,ALMOVDX,221H;数据口MOVAL,00000001B;指定六位数码管在最低位显示0-9OUTDX,ALCALLDELAY;调用延时程序MOVAL,06H;对应字符'1'MOVDX,220HOUTDX,ALMOVDX,221HMOVAL,00000010B;指定六位数码管在次低位显示1OUTDX,ALCALLDELAYLOOPL1;CX=680HINCSI;SI加1JMPL;跳转至LGOON:INCSI;SI加1MOVAL,[SI];查表MOVDX,220HOUTDX,ALMOVDX,221HMOVAL,00000001BOUTDX,ALL:MOVAL,20H;写OCW2,送中断结束命令EOIOUT20H,ALSTI;开中断POPCX;恢复现场POPAXPOPDXIRET;中断返回INT_35ENDPCODEENDSENDSTART4.试验流程图:主程序流程图开始中断次数计数值将字符0-9对应的操作数的偏移地址送入寄存器SI中8254初始化8255初始化中断入口地址设置开中断COUNT=10?N中断服务程序关中断设置OCW1并写入IMR中,使只有IR5请求被允许Y返回DOS主程序结束中断服务程序流程图保护现场关中断COUNT+1→COUNT将中断次数输出到LED显示灯COUNT10?COUNT=10?查表,使六位数码管在最低位显示中断次数的个位调用延时程序使六位数码管在次低位显示1调用延时程序SI-9→SINSI+1→SIYNY查表,使六位数码管在最低位显示中断次数CX-1→CXCX=0?写OCW2,送中断结束命令EOISI+1→SIYN开中断恢复现场中断返回