PC机显示器的故障诊断
用汇编语言编写故障诊断程序,比较直观,使用方便。为了诊断显示器的故障,我们用汇编语言编写一些小程序。比如,有一例故障,在机器上电自检时无任何出错现象,用随机的用户诊断程序检查,显示属性、字符集、字符显示等也都正常,只是在图形显示时出现纵向条纹。根据故障现象分析,属于图形显示的方面的故障。图形显示和字符显示电路的主要差别是,图形显示时,锁存器C34和C35中的图素代码经图形并/串移位器C7、C8变成串行信息,然后送到彩色编码电路。而字符显示时,锁存器C34中的字符代码送到字符发生器U33,从中读出字形点阵信息,经字符并/串移位器U32,再加上闪烁控制以后,送到彩色编码电路。C35中的字符属性代码则直接送到彩色编码电路,如图1所示。
通过电路分析可知,上述故障有可能出现在图形并/串移位器上。为此,我们编制了一段汇编语言程序,请单如下:
stack segment pars stack stack
db 256 dup(0)
stack ends
data segment para public dara
msg db 0, 80h, 0, 80h, 20h, 80h, 10h, 80h, 11h, ofeh, 05h, 02h, 09h
db 44h, 0ah, 48h, 10h, 40h, oh, 40h, 60h, 0a0h, 20h, 0a0h
db 21h, 10h, 21h, 08h, 22h, 04h, 0ch, 03h
data ends
code segment para public code
start proc far
assume cs : code
push ds
moy ax, 0
push ax
mov ax, data
mov ds, ax
assume ds : data
mov dx, 3d8h
mov al, 0ah
out dx, al
inc dx
mov, al, 02
out dx, al
mov al, 06
xor ah, ah
int 10h
mov ax, 0b800h
mov es, ax
mov cx,08
mov di, 640
mov bx, offset msg
cld
dis: mov al, [bx]
stosb
inc bx
mov al,[bx]
stosb
add d i, lffeh
inc bx
mov, al, [bx]
stosb
inc bx
mov al, [bx]
mov al, [bx]
stosb
inc bx
sub di, 2002h
add di, 80
loop dis
ret
start endp
code ends
end start
该程序先使显示器建立图形显示方式,然后往VRAM存入图形信息。程序执行结果,在屏幕上显示一个16×16点阵的汉字“次”。由于故障的原因,在“次”字的起始位置有纵向条纹,且每隔16个点产生一个纵向条纹。根据显示结果可知,16位图素代码中有一位出了故障,总为“1”,由于该条纹出现在“次”字的起始位置,可判断是CC7位发生了故障。用示波器测量,是U8的14引脚输入浮空。
二、用BASIC程序进行诊断
PC BASIC语言提供了一级与机器直接有关的语句,称为机器级语句,用来直接和硬件打交通。所以,熟悉BASIC语言者可以使用PC BASIC语言编制诊断程序。
PC BASIC常用的机器级语句有:
DEF SEG[=〈段地址〉]定义当前内存的段地址。
V=PEEK(〈地址〉) 读指定内存单无的内容送入V中。
POKE〈地址〉,〈数据〉写数据到指定的内存单元。
V=INP(〈端口号〉)读输入端口。
OUT(〈端口号〉),〈数据〉写输出端口。
BLOAD〈文件名〉,〈地址〉,〈长度〉以文件形式保存内存中的数据。
BSAVE〈文件名〉,〈地址〉,〈长度〉以文件形式保存内存中的数据。
上述语句,可以实现对指定内存单元的读/写,以及对I/O端口的读/写,可用来编写诊断程序。比如,为了诊断显示器字符显示时显示属性方面的故障,可以使用下面的小程序:
10 OPEN “W1。dat” AS#3
15 CLS
20 DIM CHAR(80,25)
30 FOR J=0 TO 1:FOR I=0 TO 9
40 READ CHAR(I,J) : NEXT I, J
50 ADD=0
60 DEF SEG=&HB800: BUFLEN%=H4000
70 FOR J=0 TO 1:FOR I=0 TO 9
80 POKE(ADD+I), CHAR(I,J):NEXT I
90 ADD=ADD+160:NEXT J
100 OUT &H3D8, &H29
110 OUT &H3D9, &H1
115 PRINT:PRINT
116 ADD=0
117 FOR J=0 TO 1:FOR I=0 TO 9
118 A=PEEK(ADD+I)
120 ADD=ADD+160:NEXT J
121 CLOSE *3
130 END
140 DATA &h41, &h07, &h52, &h40, &H47, &h20, &h42, &h10, &h49, &h78
150 DATA &h52, &h04, &h47, &h02, &H42, &h01, &h4c, &h0f, &h41, &h87
OK
该程序先建立80×25彩色字符显示方式,并将边框颜色选择送到彩色选择寄存器,然后将要显示的字符代码和字符属性字送入VRAM。执行该程序显示的结果为:
黑底白字A 黑底红字R
红底黑字R黑底绿字G
绿底黑字G黑底蓝字B
蓝底黑字B黑底白字加亮L
背景加亮I黑底白字闪烁A
该程序从左到右诊次检查字符属性字各位。如果显示的字符属性与设定的不同,可以检查出某位是丢“1”还是冒“1”,再用仪器进行测量,可以确定故障的具体部位。
三、在DEBUG程序支持下进行故障诊断
动态调试程序DEBUG是调试汇编语言程序的有力工具,它有丰富的命令,这些合令不仅可以用来调试程序,而且也可以用来对硬件故障进行诊断。比如,可以在DEBUG的A命令下输入一段程序,然后在G命令下运行程序,查看运行结果,以诊断故障所在。
如果一台显示器出了故障,不能显示,但是主机仍可运行DEBUG程序,此时可在系编中再配备一台正常的单色显示器,作为系统的显示设备,来检测有故障的彩色显示器。然后,主机运行DEBUG程序,在A命令下,输入下面的一段程序:
0BF8:0100 BADA03 MOV DX,03DA
0BF8:0103 B408 MV AH,08
0BF8:0105 20C9 SUB CX,CX
0BF8:0107 EC IN AL,DX
0BF8:0108 20E0 AND AL,AH
0BF8:010A 7504 JNZ 0110
0BF8:010C E2F9 LOOP 0107
0BF8:010E EB11 JMP 0121
0BF8:0110 29C9 SUB CX,CX
0BF8:0112 EC IN AL,DX
0BF8:0113 20E0 AND AL,AH
0BF8:0115 7404 JZ 011B
0BF8:0117 E2F7 LOOP 0110
0BF8:0119 EB06 JMP 0121
0BF8:011B B103 MOV CL,03
0BF8:011D D2EC SHR AH,CL
0BF8:011F 75E4 JNZ 0105
0BF8:0121 90 NOP
0BF8:0122 EBE1 JMP 0105
该程序主要用来检测彩色显示器的状态寄存器。状态寄存器的D0位是-DISPEN信号,D3位是+VSYNC信号。在显示器光栅扫描处于屏幕的有效显示区域内时,这两个信号都为“0”,在光栅扫描处于非有效显示区域时,-DISPEN为“1”,VSYNC也出现正脉冲,所以这两个信号应该是变化的,若不变化,则说明出了故障。执行该程序时,在NOP指令处设置断点,检查AH和AL中的内容是否相等,若不等,则与该位相应的信号出了故障。