微机原理课29讲教案主讲人许文丹.docx
《微机原理课29讲教案主讲人许文丹.docx》由会员分享,可在线阅读,更多相关《微机原理课29讲教案主讲人许文丹.docx(20页珍藏版)》请在冰豆网上搜索。
微机原理课29讲教案主讲人许文丹
微机原理课29讲教案主讲人许文丹
显示器与打印机接口
§7-6-1显示器I/O
显示器可通过两种适配器板连接到IBMPC机上。
单色显示和并行打印机适配器连接IBM单色显示器和并行打印机。
彩色/图形监视器适配器连接监视器或标准的电视机(彩色TV或黑白TV)。
单色适配器只能显示字符,只能用于黑白显示器。
字符由标准字母、数字和符号组成,加上一些简单的图形,如菱形、矩形及笑脸等符号。
显示器的屏幕被划分成80列25行,适配器就是在这个2000个(25×80)网格位置上显示字符。
屏幕上的每个网格位置也称为一个“象素”。
对应屏幕上的每个象素,存储器中都有一毡相应单元,因此我们说屏幕是“存储器映象”的。
这种存储器映象,使显示器电路很容易知道哪个单元的内容对应屏幕上哪个位置。
属性
单色显示屏幕上的每个字符在存储器中由两个字节表示,一个字节保存字符的ASCII码,另一个字节保存字符属性。
字符的属性确定了每个模显示字符的特性,如字符是否闪烁显示,是否被加亮,是否反相显示。
属性可以有不同的组合,例如可以在屏幕是显示白底黑字(反相显示)代替通常的黑底白字。
正常的属性是07(二进制00000111)即背景为黑色(000),前景为白色(111),而闪烁位为正常(0),加强亮度位也是正常(0)。
为改变成反相显示,必须使背景为白色(111),前景为黑色(000),所以属性字节的值应为70,即二进制01110000。
如果想要黑底白字及闪烁显示,属性值应为87(10000111)。
背景为000,前景为001,这种组合可产生下划线。
属性值可以任意组合,下面是一些典型的属性值。
二进制十六进制效果
0000000000不显示
0000000101黑底白字,下划线
0000011107黑底白字,正常显示
000011110F黑底白字,高亮度
0111000070白底黑字,反向显示
1000011187黑底白字,闪烁
11110000F0白底黑字,反向闪烁
屏幕上的字符可以按相同的属性显示,也可以按不同的属性显示,如果你设置的属性为00H,字符就是显示不出来。
单色屏幕有2000D个字符位置(25×80),因每个字符需要两个字节表示,所以单色显示存储容量为4K字节。
单色显示存储器安排在段地址为B000H区域,偏移地址从0到0F9FH。
BIOS显示中断
下面列出了中断类型10H的部分显示操作及所用的寄存器。
AH功能调用参数返回参数
1置光标类型(CX)0-3=光标开始行
(CX)0-3=光标结束行
2置光标位置(BH)=页号
(DH)=行
(DL)=列
3读光标位置(BH)=页号CH=光标开始行
CL=光标结束行
DH=行
DL=列
6屏幕初始化AL=上卷行数
或上卷AL=0全屏幕为空白
BH=卷入行属性
CH=左上角行号
CL=左上角列号
DH=右下角行号
DL=右下角列号
7屏幕初始化AL=下卷行数
或下卷AL=0全屏幕为空白
BH=卷入行属性
CH=左上角行号
CL=左上角列号
DH=右下角行号
DL=右下角列号
8读光标位置BH=显示页AH=属性
的属性和字符AL=字符
9在光标位置BH=显示页
显示字符及AL=字符
其属性BL=属性
CX=字符重复次数
A在光标位置BH=显示页
只显示字符AL=字符
CX=字符重复次数
控制光标
光标不是ASCII字符表中的字符,计算机有专门的硬件来控制光标。
我们熟悉的光标一般是一个下划线或方块符。
利用INT10H的功能1使光标显现或关闭。
这个功能也控制光标行的开始和结束,也就是说控制光标的大小。
表示光标行开始和结束的数据分别放在CH和CL的低四位(0~3),当CH的第4位为1时,光标不显现出来(关闭);当第4位为0时,光标在屏幕上显现出来。
单色显示器的光标大小的范围从0到13。
INT10H的功能2设置光标位置。
光标新位置的行号设在DH寄存器中,列号设在DL中。
行号设在(0,0)是屏幕的左上角,(24,79)是屏幕的右下角。
BH中必须包含被输出的页号,对单色显示器来说,页号总是0。
例:
置光标开始行为5,结束行为7,并把它设置到第5行第6页。
MOVCH,5;Beginningofcursorandturnon
MOVCL,7;Endofcursor
MOVAH,1;definecursor
INT10H;callBIOS
MOVDH,4;row5
MOVDL,5;column6
MOVBH,0;page0
MOVAH,2;placecursor
INT10H;callBIOSroutine
读光标位置
10H的功能3是读光标位置,页号必须在BH中指定。
此功能把光标位置的行号回送给DH,列号回送给DL。
光标大小的参数填入CH和CL,也就是说,在CH和CL中回送的是用功能1设置的光标参数。
例:
读0页的当前光标位置。
MOVAH,3
MOVBH,0
INT10H
清屏和卷屏
10H的功能6能使屏幕内容上卷指定的行,这个功能需要设置7个参数。
如果屏幕的起始行列不为(0,0),结束行列不为(24,79),则屏幕只有指定的一部分具有上卷的功能,这个屏幕上的部分区域我们叫做窗口(、Window),像这样的窗口我们可以在屏幕上设置多个,这些窗口都可独立使用。
如果上卷超过指定窗口的顶部,这些行的内容就被丢失,出现在窗口底部的新行被填为空格,其属性由BH寄存器决定。
如果AL=0,则实际完成的工作是清除屏幕的功能,它将按AL中的BLANK字符(0)使指定的窗口为空白。
10H的功能7和功能6类似,也能使屏幕(或窗口)初始化或使屏幕(或窗口)的内容下卷指定的行。
它的其它参数的设置与功能6一样。
例:
清除左上角为(0,0),右下角为(24,39)的窗口,初始化为反向显示,该窗口相当于全屏幕的左半部分。
MOVAH,7;scrolldownwardfunction
MOVAL,0;codetoblankscreen
MOVBH,70H;reversevideoattribute
MOVCH,0;upperleftrow
MOVCL,0;upperleftcolumn
MOVDH,24;lowerrightrow
MOVDL,39;lowerrightcolumn
INT10H;videoROMcall
下面我们编写一个完整的程序在PC机上运行。
此程序在屏幕的中间建立一个20列宽和9行高的窗口,然后把键入的内容显示出来。
键按入的字符将被显示在窗口的最下面一行,每当输入20个字符,该行就向上卷动,9列字符输入完后,顶端行的内容丢失。
例:
在屏幕中心的小窗口显示字符。
;WINDOW--Demonstratesvideowindowfunction
;keyboardwritesintoawindow20charswide
;and9charshighinmiddleofscreen
;-------------------------
programsegment
assumecs:
program
pushds
subax,ax
pushax
;clearscreen,usingscrollupfunction
movah,6
moval,0
movch,0
movcl,0
movdh,24
movdl,79
movbh,7
int10h
;positioncursoratbottomofwindow
pos_cursor:
movah,2
movdh,16
movdl,30
movbh,0
int10h
getcharactersfromkeyboard
movcx,20
get_char:
movah,1
int21h
cmpal,3
jzexit
loopget_char
;scroollup
movah,6
moval,1
movch,8
movcl,30
movdh,16
movdl,50
movbh,7
int10h
jmppos_curse
exit:
ret
programends
;--------------------------------
end
此程序使用了几种ROM显示例行程序:
清除屏幕,光标定位和上卷。
如果在屏幕上同时有几个窗口工作,就要分别清除它们,这可通过设置不同的左上角坐标和右下角坐标来完成。
字符显示
10H的功能9和功能A都能把一个字符传送到显示屏幕,然后光标返回到它的初始位置上。
这两种功能的区别是:
AH=9的功能把字符及其属性输出到当前光标位置上。
而AH=OAH的功能只输出字符,它的属性值就是这一位置上先前一具有的属性。
0AH功能在使用黑白显示器时特别方便,因为此时我们很少改变显示的属性。
例:
置光标到0显示页的(20,25)位置,并以正常属性显示一个星号‘*’。
MOVAH,2
MOVBH,0
MOVDH,20
MOVDL,25
INT10H
MOVAH,9
MOVAL,‘*’
MOVBH,0
MOVCX,1
INT10H
10H的功能8读取当前光标位置及属性。
例:
在0显示页的(11,0)位置读取字符和属性。
MOVAH,2
MOVBH,0
MOVDH,0
INT10H;videoROMcall
MOVAH,8;readcharandatter
MOVBH,0;page0
INT10H;videoROMcall
DOS显示功能调用
表7-7为INT21H的显示操作,其中有两个是显示单字符的功能,另一个是显示字符串功能,这些功能都能自动向前移动光标。
表7-7DOS显示操作(INT21H)
AH功能调用参数
2显示一个字符(检验Ctrl_Break)DL=字符光标跟随字符移动
6显示一个字符(不检验Ctrl_Break)DL=字符光标跟随字符移动
9显示字符串DS:
DX=串首址光标跟随字符移动
串必须以‘$’结束
AH=9的功能是显示字符串,它要求被显示输出的字符必须以$字符(24h)作为定界符,此功能是用$作为标记来计算串的长度的。
有些ASCII码,如控制码,不能出现该字符串。
显示字符串时,如果希望光标能自动换行,那么可在字符串结束之前加上回车和换行的ASCII码。
MESSAGEDB‘THESORTOPERATIONISFINISHED。
’,13,10,‘$’
要显示输出的信息一般定义在数据段。
输出该字符串的指令为:
MOVAH,9
MOVDX,SEGMESSAGE
MOVDS,DX
MOVDX,OFFESTMESSAGE
INT21H
使用赋值伪操作可以使程序的可读性更好,另外也可以根据显示格式的要求使用TAB符,TAB的ASCII码为09。
CREQU13(或CREQU0DH)
LFEQU10(或LFEQUOAH)
TABEQU09
MESSAGEDBTAB‘THEsortoperationisfinished。
DBCR,LF,‘$’
使用INT21H显示字符串,一定要在显示串之后加上定界符$,丢失定界符可能会在屏上引起意想不到的后果。
§7-6-2打印机编程
击打式的字符打印机大都实现全字符打印,即整个字符由一次打印动作完成,这种打印机的字迹清晰,还能提供点划线、阴影、粗体字符等,速度在每分钟1000行左右。
随着打印机字符种类的增加,特别是打印图形和汉字的需要,发展了点阵式打印机。
点阵式打印机的字符是以点阵形式构成的,一般是7*7或9*9的点阵。
它可打印出点阵图形,斜体字,粗体双线字符以及笑脸、心形等字符。
激光打印机既具有点阵打印机的图形功能,也能打印出和字符打印机一样的高质量字符。
打印机的接口有并行接口,即一次从处理器接收8位代码,还有串行打印接口,即每次从处理器接收一位代码。
IBMPC适用并行接口。
许多打印机都具有存储几千个字符的缓冲(组成缓存器)。
一台打印机必须能识别并处理从处理器来的信号,如换页,换行或列表符(TAB)。
处理器也必须能理解从打印机发来的表示忙或者纸出界等信号。
不同类型的打印机可以响应从处理器来的不同的信号,这给打印机与接口的程序设计造成一些困难,所以在编写打印机程序之前,必须先了解连接在计算机上的打印的型号,认真查阅打印机的技术手册,但是就打印机的处理过程而言,它比屏幕处理、磁盘处理都要简单,它只涉及到很少的一些操作,既能用DOSINT21H来实现,也能用BIOSINT17H来实现。
表7-8是有关打印机I/O的中断操作。
表7-8打印机I/O中断
INTAH功能调用参数返回参数
21H5打印一个字符DL=字符
17H0打印一个字符AL=字符AH=状态字节
并回送状态字节DX=打印机号
17H1初始化打印机DX=打印机号AH=状态字节
回送状态字节
17H2回送状态字节DX=打印机号AH=状态字节
DOS打印功能
INT21H的功能5把一个字符送到打印机,字符必须放在DL寄存器中,这是唯一的DOS打印功能。
如果需要回车,换行等打印功能,必须由汇编语言程序送出回车、换行等字符码。
下面的功能段是送一个字符给打印机,为了连续打印,还指定了打印的字符数。
当然也可以用指定的结束符来代替计数控制的方法。
TEXTDB‘hello,everybody!
’
COUNTEQU$-NEXT
.
.
.
MOVCX,COUNT
MOVBX,0
NEXT:
MOVAH,5;requestprintfunction
MOVDL,TEXT[BX];charactertoprint
INT21H;callDOS
INCBX
LOOPNEXT
这些指令也适用于发送打印控制字符。
例如TEXT字符串定义如下:
TEXTDB0CH,‘HELLO,everbody!
‘,0dh,0ah,0ah
字符串中的第一个字符是换页码(och),最后两个字符是换行码(0ah)。
用上面的指令把TEXT在打印机上输出,则字符串打印在新的一页的顶部,并余下文有两个空行的距离。
下面我们来介绍打印机的标准控制字符和特殊控制字符。
打印机的控制字符
打印机的标准控制字符如下:
十进制十六进制功能
0808空格
0909水平Tab(横表)
100A换行
110B垂直Tab(纵表)
120C换页
130D回车
水平TAB(09h)仅当打印机有此功能并被设置成打印机TAB状态时才有效。
换行命令使打印机向前空走一行,若连续用两次换行命令,则会空出两行。
当打印机加电启动后,打印头在一页纸的顶部位置。
打印机打印时,记下所打印的行数,并检查是否到了一页的最大行数(如55行/页),如果打印了最后一行,就执行一个换页命令(0ch),然后再把行计数器置成0。
一般显示器遇到显示文件中的TAB字符(09),就把当前的光标位置移到8,16,24,…..等字符位置上。
但许多打印机并不认识TAB字符,若要打印一个ASCII码文件(如汇编语源程序),就必须检验送到打印机的每个字符,若该字符是TAB,就要插入空格,使下一个字符的位置在8,16………等。
形成TAB终止位置的方法由下面三个例子来说明。
当前打印的位置:
1921
二进制数:
00000010000100100010101
清最右边的三位:
00000000000100000010000
加8:
000010000001000000011000
新的TAB终止位置:
81624
以下程序是一个能打印ASCII文件的子程序(PRTASC)。
它的基本是把已读到输入缓冲区(recarea)中的字符送到一个打印区(prtline),并检查行尾、文件尾,处理换行符和TAB符。
;printinganASCIIfile
dsegsegment
recareadb512dup(‘‘);inputareaforASCIIfile
prtlinedb82dup(‘’);printline
countdw0
dsegends
csefgsegment
assumecs:
cseg,ds:
dseg,es:
dseg
mainprocfar
pushds
subax,ax
pushax
movax,dseg
movds,ax
callprtasc
ret
mainendp
;
;transferdatatoprintline:
prtascprocnear
cld
leasi,reccarea
p10:
leadi,partline
movcount,0
p20:
leadx,recarea+512
cmpsi,dx
jep70
p30:
movbx,count
cmpbx,80
jbp40
movwordptr[di+bx],odoah
addcount,2
callsubprt
leadi,prtline
movcount,0
movbx,0
p40:
lodsb
mov[di+bx],al
Incbx
Cmpa1,0ah
Jnep70
Cmpa1,oah
Jnep50
Callsubprt
Jmpp10
P50:
cmpa1,09
Jnep60
Decbx
Movbuteptr[di+bx],20h
Andbx,0ff8h
Addbx,08
P60:
movcount,bx
Jmpp20
P70:
movbx,count
Movbx,count
movbyteptr[di+bx],0ch
callsubprt
ret
prtascendp
;--------------------------------------------------------------------
subprtprocnear
movcx,count
inccx
movbx,0-
next:
movah,5
movdi,prtline[bx]
int21h
incbx
loopnext
movax,2020h
movcx,41
leadi,prtline
repstows
ret
subprtendp
;------------------------------------------------------------------------------
csegends
endmain
特殊的打印命令
我们已经讨论了打印机基本控制命令的使用。
还有一些命令包括:
一些命令需要和ESC(1BH)字符一起使用,这些命令是:
1B30设置每英寸为8行
1B32设置每英寸为6行
1B45设置加重打印方式
IB46设置加重打印方式
我们可以用两种不同的方式把命令码发送给打印机。
1.在数据区中定义命令码。
下下述数据区中的命令是设置紧缩方式,每寸8行,打印一个标题,并发送回车、换行字符。
HEADDB0FH,1BH,30H,’TITLE…..’,0DH,0AH
2.直接用命令方式
MOVAH,05
MOVDL,0FH
INT21H
上面的指令使以后打印的字符都是以紧缩方式打印,只有当程序发送取消此方式的命令后,采变成正常的方式进行打印。
上述这些特殊命令并不适用于所有型号的打印机,这就需要查阅打印机手册,看其是否具有执行这些特殊命令的功能。
BIOS打印功能
BIOS17H中断指令提供了由AH寄存器指定的三种不同的操作。
BIOS中断17H的功能0是打印一个字符的功能。
要打印输出的字符放在AL中,打印机号放在DX中,BIOS最多允许连接三台打印机,机号分别为0、1、和2。
如果只有一台打印机,那么就是0号打印机,打印机的状态信息
被回送到ah寄存器。
MOVAH,0
MOVAL,CHAR
MOVDX,0
INT17H
17H的功能1初始化打印机,并回送打印机状态到AH寄存器。
如果把打印机开关关上然后又打开,打印机各部分就复位到初始值。
此功能和打开打印机时的作用一样。
在每个程序的初始化部分可以用17h的功能1来初始化打印机。
MOVAH,01
MOVDX,0
INT17H
这个操作要发送一个换页符,因此这个操作能把打印头设置在一页的顶部。
对于大多数打印机,只要一接通电源,就会自动地初始化打印机。
打印机忙(PRITERBUSY)表示打印机正在接收数据,活正在打印,或处于脱机状态。
应答位(acknowledge)表示打印机已发出一个表明它已经接收到数据的信号。
选择位(select)表示打印机是联机的。
超时位(timeout)表示打印机发出忙信号很长一段时间了,系统将不在给它传送数据。
表示打印机出错的是第5位(纸出界)或第3位(I/O错)为1,如果打印机没有接上电源,没有装上纸或者没有联机,而打印程序已开始运行,这时显示器的指示光标会不停的闪烁,当接通打印机的电源后,某些输出数据就会丢失。
如果在打印程序中先安排指令测试打印机的状态,则BIOS操作就会返回状态码,(DOS打印操作是自动进行测试的,但对各种情况都显示一个“纸出界”的信息)。
当打印机接通电源后,即开始正常打印,而且不会丢失任何数据。
下面我们应用前面介绍的BIOS和DOS功能调用,编写一个简单的打字程序。
它要求把从键盘上接收的字符显示在屏幕上,并由打印机输出,在键盘上按下CTRL_C键即退出程序。
Prog_stacksegmentstack‘stack’
Db64dup(‘stack…’)
Prog_stackends
;------------------------------------------
prog_datasegment‘data’
inchardb20dup(?
)
prog_dataen