PC机显示器的故障诊断 1991-12-27 一、用汇编语言编写程序进行诊断 用汇编语言编写故障诊断程序,比较直观,使用方便。为了诊断显示器的故障,我们用汇编语言编写一些小程序。比如,有一例故障,在机器上电自检时无任何出错现象,用随机的用户诊断程序检查,显示属性、字符集、字符显示等也都正常,只是在图形显示时出现纵向条纹。根据故障现象分析,属于图形显示的方面的故障。图形显示和字符显示电路的主要差别是,图形显示时,锁存器C34和C35中的图素代码经图形并/串移位器C7、C8变成串行信息,然后送到彩色编码电路。而字符显示时,锁存器C34中的字符代码送到字符发生器U33,从中读出字形点阵信息,经字符并/串移位器U32,再加上闪烁控制以后,送到彩色编码电路。C35中的字符属性代码则直接送到彩色编码电路,如图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位发生了故障。用示波器测量,是U8的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 该程序主要用来检测彩色显示器的状态寄存器。状态寄存器的D0位是-DISPEN信号,D3位是+VSYNC信号。在显示器光栅扫描处于屏幕的有效显示区域内时,这两个信号都为“0”,在光栅扫描处于非有效显示区域时,-DISPEN为“1”,VSYNC也出现正脉冲,所以这两个信号应该是变化的,若不变化,则说明出了故障。执行该程序时,在NOP指令处设置断点,检查AH和AL中的内容是否相等,若不等,则与该位相应的信号出了故障。