1632位微机原理汇编语言及接口技术第十一章课后习题答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

习题11.4习题11.6连接只改PA→PB,其余不变只要把涉及输出到端口A的代码改为输出到端口B即可。PC7做选通信号,为输出,即C端高部分为输出PC2为Busy,为输入,即C端低部分为输入C端整个定为方式0B端输出,方式0A端任意,这里为方式0输出假设8255A端口A、B、C和控制端口地址分别为FFF8H、FFFAH、FFFCH和FFFEH。;8255A的初始化movdx,0fffeh;控制端口地址:FFFEHmoval,10000001B;方式控制字:10000001=81Houtdx,al;B端口方式0输出,C端口上方式0输出、下方式0输入,;端口任意(方式0,出)moval,00001111B;端口C的复位置位控制字,使PC7=1outdx,al;使PC7=1,即置STROBE*=1(只有输出数据时才为低脉冲);输出打印数据子程序,入口参数AH=打印数据;查询printcprocpushaxpushdxprn:movdx,0fffch;读取端口Cinal,dx;查询打印机状态andal,04h;00000100,PC2=BUSY=0?jnzprn;PC2=1,打印机忙,则循环等待;打印子程序:输出movdx,0fffAh;PC2=0,打印机不忙,则输出数据moval,ahoutdx,al;将打印数据从端口B输出;打印子程序:打印movdx,0fffeh;从PC7送出控制低脉冲moval,00001110B;置STROBE*=0outdx,alnop;产生一定宽度的低电平nopmoval,00001111B;置PC7=1,即STROBE*=1outdx,al;最终,STROBE*产生低脉冲信号;打印子程序:返回popdxpopaxretprintcendp习题11.7方式1输出下:端口A的ACK*即PC6,OBF*即PC7,INTR即PC3对应端口B的ACK*即PC2,OBF*即PC1,INTR即PC0数据端口变换为PBmovdx,0fffehmoval,84houtdx,almoval,04h;使INTEB(PC2)为0,禁止中断outdx,al……movcx,counter;打印字节数送CXmovbx,offsetbuffer;取字符串首地址callprints;调用打印子程序printsprocpushax;保护寄存器pushdxprint1:moval,[bx];取一个数据movdx,0fffahoutdx,al;从端口B输出movdx,0fffchprint2:inal,dxtestal,02h;检测(PC1)为1否?jzprint2incbxloopprint1popdxpopaxretprintsendp习题11.8L0~L3对应PC4~PC7,L亮否可以通过给PC4~PC7置位复位实现,即C端口的高部分为输出;根据K0~K3(PC0~PC3),确定L0~L3(对应PC4~PC7)亮否,所以C端低部分为输入;又C端的8位都被正常使用,所以A端口和B端口均为方式是0;写入方式字moval,100×00×1b;=81hmovdx,控制口地址;0fffehoutdx,al;加入下一段更好,使L0~L3全亮moval,0fhmovdx,端口C地址;0fffchoutdx,al;PC4~PC7为高,经反向驱动为0,与阳极间形成通路,LED亮;控制程序段movdx,端口C地址;0fffchinal,dx;读入PC0~PC3movcl,4shlal,cl;左移4位,PC0~PC3→PC4~PC7outdx,al;控制PC4~PC7。因为有反向驱动,PC0为0,对应PC4为0,二极管左右均为高,不发光,符合题目要求。习题11.10当按下或释放一个键时,往往会出现按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的现象就是机械按键的抖动方法解决硬件:消抖电路软件:程序延时,以避开抖动的时间习题11.11重键指两个或多个键同时闭合简单情况:不予识别,认为是错误的按键通常情况:只承认先识别出来的键连锁法:直到所有键都释放后,读入下一个键巡回法:等被识别的键释放以后,就可以对其他闭合键作识别,而不必等待全部键释放正常的组合键:都识别出来习题11.12最初设置行线端口为端口B(输出)、列线端口为端口A(输入),三个端口和控制端口对应地址为218H~21BH端口A、B工作在方式0;设置端口B为行(输出),端口A为列(输入)moval,90h;1001×00×90Hmovdx,21BHoutdx,al;第1段:是否有键按下key1:moval,00movdx,219h;假设219h表示行线端口outdx,al;使所有行线为低电平movdx,218h;假设218h为列线端口inal,dx;读取列值cmpal,0ffh;判定是否有列线为低电平jzkey1;无闭合键,循环等待calldelay;有,延迟20ms清除抖动;第2段:识别按键(反转法)key2:moval,00movdx,219h;设置行线接输出端口,列线接输入端口outdx,al;设置行线全为低movdx,218hinal,dx;读取列值cmpal,0ffhjzkey2;无闭合键,循环等待pushax;有闭合键,保存列值pushax;行列反转,设置端口B为行(输入),端口A为列(输出)moval,82h;1000×01×82Hmovdx,21BHoutdx,al;设置行线接输入端口,列线接输出端movdx,218hpopaxoutdx,al;输出列值movdx,219hinal,dx;读取行值popbx;组合行列值movah,bl;此时,al=行值,ah=列值;第3段:查找键代码movsi,offsettable;table为键行列值表movdi,offsetchar;char为键代码表movcx,64;CX=键的个数key3:cmpax,[si];与键值比较jzkey4;相同,说明查到incsi;不相同,继续比较,行值,列值两个,所以加2incsiincdiloopkey3jmpkey1;全部比较完,仍无相同,说明是重键;第4段:等待按键释放key4:moval,[di];获取键代码送AL……;判断按键是否释放,没有则等待calldelay;按键释放,延时消除抖动……;后续处理;行列值表和键代码表;键盘的行列值表tabledw0fefeh;键0的行列值(键值)高8为列值,低8为行值;见key2末尾dw0fdfeh;键1的行列值dw0fbfeh;键2的行列值……;其他键的行列值;键盘的键代码表chardb……;键0的代码值db……;键1的代码值……;其他键的代码值习题11.14.modelsmall;定义程序的存储模式.stack;定义堆栈段.data;定义数据段.codestart:movax,@data;程序段起点movds,ax;设置DSkey1:movah,01h;ROM-BIOSint16H01H号调用,出口ZF=0,表示有键;按下,AX=接通扫描码+ASCII码int16hjzkey1pushax;ah中存放接通扫描码movdl,almovah,2hint21hpopax;pushaxmoval,ahxorah,ahmovbl,100divbl;al←ax/10的商,百位,ah←余数pushax;callHTOASC;求并显示扫描码百位movdl,almovah,2hint21hpopaxmoval,ahxorah,ahmovbl,10divbl;al←ax/10的商,百位,ah←余数pushax;callHTOASC;求并显示扫描码十位movdl,almovah,2hint21hpopaxmoval,ahcallHTOASC;求并显示扫描码百位、十位和个位movdl,almovah,2hint21hpopaxorah,10000000Bmoval,ahxorah,ahmovbl,100divbl;al←ax/10的商,百位,ah←余数pushax;callHTOASC;求并显示扫描码百位movdl,almovah,2hint21hpopaxmoval,ahxorah,ahmovbl,10divbl;al←ax/10的商,百位,ah←余数pushax;callHTOASC;求并显示扫描码十位movdl,almovah,2hint21hpopaxmoval,ahcallHTOASC;求并显示扫描码百位、十位和个位movdl,almovah,2hint21hmovax,4c00hint21hHTOASCproc;将AL低4位表达的一位16进制数转换为ASCII码andal,0fhcmpal,9jbehtoasc1addal,37h;是a~f,加37h转换为ascii码rethtoasc1:addal,30h;是0~9,加30h转换为ascii码retHTOASCendpendstart习题11.15LEDtbdb3fh,06h,5bh,4fh66h,6dh,7dh,07h7fh,6fh,77h,7ch39h,5eh,79h,71h习题11.16C为方式0输入,端口fffahB根据C选定,是位控制端口,方式0输出,端口fff9hA根据C选定,是段控制端口,方式0输出,端口fff8h8255A方式控制字:10001001B=89h,端口fffbh;程序段TABDB06H,5BH,4FH,66H,6DH,7DH,07H,7FH;LED数码管1~8的显示段码PBDB1;位选定义PCDB0;开关状态暂存MOVBX,0MOVDS,BXMOVBX,OFFSETTAB;段码表指针MOVAL,10001001BMOVDX,0FFFbHOUTDX,AL;8255方式设置L1:MOVDX,0FFF9HMOVAL,PBOUTDX,AL;位选通CALLDELAYROLPB,1;位选转换MOVDX,0FFFaHINAL,DX;读开关状态MOVPC,AL;开关状态暂存MOVCX,8;移位8次查询开关状态,同时按下最高位优先L2:RCRPC,1JCL3MOVAL,8SUBAL,CL;获得开关位XALT;查表获得显示段码MOVDX,0FFF8HOUTDX,AL;显示开关位L3:LOOPL2JMPL1习题11.17DATA0~DATA7:8位并行数据信号线,打印数据通过它们送至打印机STROBE*:选通,用于使打印机接收数据的选通信号。负脉冲的宽度在接收端应大于BUSY:忙,表示打印机不能接收数据ACK*:响应,打印机接收一个数据字节后就回送一个响应的负脉冲信号(脉宽约为)8位数据的可靠输出通过选通STROBE*、响应ACK*和忙BUSY三个联络信号控制

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功