PC机显示器的故障诊断

Author: Date: 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中的内容是否相等,若不等,则与该位相应的信号出了故障。