微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题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中的内容是否相等,若不等,则与该位相应的信号出了故障。