Board logo

标题: 如何编程关闭显示器? [打印本页]

作者: dsysps     时间: 2007-2-2 01:11    标题: 如何编程关闭显示器?
项目中需要程序中定时关闭显示器,请问如何实现?

作者: Michael     时间: 2007-2-2 12:41
改变它的power scheme,不过在dos下没试过

作者: zhgwbzhd     时间: 2007-2-5 11:07
是给他断电吗?估计困难点。
如果使用显示输出的中断,应该可以得了

作者: dsysps     时间: 2007-3-15 21:57
BYTE vga_mode[64*2];
BYTE mode_bak[64*2];
void SaveMode()
{
union REGS r;
r.x.ax=0x4f04;
r.x.dx=0x0001;
r.x.cx=0x0001;
_ES=FP_SEG(vga_mode);
r.x.bx=FP_OFF(vga_mode);
int86(0x10,&r,&r);
for(i=0;i<64*2;i++)
mode_bak[i]=0x00;
}
//bClose=1:关闭显示;bClose=0:打开显示
void OpenClose(BYTE bClose)
{
BYTE far * pp;
pp=mode_bak;
if(bClose==0)
{
pp=vga_mode;
}
union REGS r;
r.x.ax=0x4f04;
r.x.dx=0x0002;
_ES=FP_SEG(pp);
r.x.bx=FP_OFF(pp);
r.x.cx=0x0001;
int86(0x10,&r,&r);
}

作者: wzsunlight     时间: 2007-3-22 17:46
同意以上观点

作者: CrispH     时间: 2007-10-26 16:31
在 DOS 下关闭和打开显示器!

;
; Turn Off Video
;
call disable_video_display_3c0
call disable_video_display_3c4
call disable_horz_vert_retrace

;
; Turn On Video
;
call enable_horz_vert_retrace
call enable_video_display_3c0
call enable_video_display_3c4

IO_DELAY MACRO
push ax
in al, 061H
pop ax
ENDM

disable_video_display_3c0 PROC NEAR PUBLIC

push ax
mov ah, 00000000b
jmp enable_display_3c0_00

disable_video_display_3c0 ENDP

enable_video_display_3c0 PROC NEAR PUBLIC

push ax
mov ah, 00100000b

enable_display_3c0_00::
call video_display_3c0_on_off
pop ax
ret

enable_video_display_3c0 ENDP

attribute_addr_reg dW 03c0h
input_status_reg_1_color_reg dW 03dah
input_status_reg_1_mono_reg EQU 03bah

video_display_3c0_on_off PROC NEAR PUBLIC

push dx

call clear_attribute_flipflop
mov dx, attribute_addr_reg
in al, dx

and al, 11011111b
or al, ah
call clear_attribute_flipflop
out dx, al

pop dx

ret
video_display_3c0_on_off ENDP

clear_attribute_flipflop PROC NEAR PUBLIC

push ax
push dx

mov dx, input_status_reg_1_color_reg
in al, dx
IO_DELAY
mov dl, low input_status_reg_1_mono_reg
in al, dx

pop dx
pop ax

ret
clear_attribute_flipflop ENDP

disable_video_display_3c4 PROC NEAR PUBLIC

push ax
mov ah, 00100000b
jmp enable_display_3c4_00

disable_video_display_3c4 ENDP

enable_video_display_3c4 PROC NEAR PUBLIC

push ax
mov ah, 00000000b

enable_display_3c4_00::
call video_display_3c4_on_off
pop ax

ret
enable_video_display_3c4 ENDP

sequencer_addr_reg dW 03c4h
clocking_mode_reg_idx db 01h

video_display_3c4_on_off PROC NEAR PUBLIC
push dx

mov dx, sequencer_addr_reg
in al, dx
IO_DELAY

push ax
mov al, clocking_mode_reg_idx
out dx, al
IO_DELAY

inc dx
in al, dx
and al, 11011111b

;---------------------------------------;
enb_dis_horz_vert_retrace_10::
or al, ah
out dx, al
IO_DELAY

dec dx
pop ax
out dx, al
pop dx

ret
video_display_3c4_on_off ENDP

disable_horz_vert_retrace PROC NEAR PUBLIC

push ax
mov ah, 00000000b
jmp enable_horz_vert_retrace_00

disable_horz_vert_retrace ENDP

enable_horz_vert_retrace PROC NEAR PUBLIC

push ax
mov ah, 10000000b

enable_horz_vert_retrace_00::
call enb_dis_horz_vert_retrace
pop ax

ret
enable_horz_vert_retrace ENDP

miscellaneous_out_reg_read_mode dW 03cch
crt_addr_reg_mono EQU 03b4h
crt_addr_reg_color EQU 03d4h
crtc_mode_cntl_reg_index db 017h

enb_dis_horz_vert_retrace PROC NEAR PUBLIC

push dx

mov dx, miscellaneous_out_reg_read_mode
in al, dx

test al, 00000001b
mov dl, low crt_addr_reg_mono

jz enb_dis_horz_vert_retrace_01;
mov dl, low crt_addr_reg_color

enb_dis_horz_vert_retrace_01:
in al, dx
IO_DELAY

push ax
mov al, crtc_mode_cntl_reg_index
out dx, al
IO_DELAY

inc dx
in al, dx
and al, 01111111b
jmp enb_dis_horz_vert_retrace_10

enb_dis_horz_vert_retrace ENDP

Last edited by CrispH on 2007-10-26 at 04:41 PM ]

作者: jojand     时间: 2007-10-30 14:24
执行以下的代码将关闭屏幕显示,键入任意键后开启屏幕显示:

mov ax,1201
mov bl,36
int 10
mov ax,0
int 16
mov ax,1200
mov bl,36
int 10

作者: CrispH     时间: 2007-10-30 18:22
INT 10H, AH = 12H, BL = 36, AL = 01 --> Video Refresh Disable
INT 16H, AH = 00H --> Waiting for keypress
INT 10H, AH =12H, BL = 36, AL = 00 --> Video Refresh Enable

作者: bd123456789     时间: 2008-1-11 21:58    标题: 测试出错
上面几位的代码我测试了几个,发现都不能正常关闭!

作者: CrispH     时间: 2008-2-18 18:25
真的吗?我测试了, 可以关闭,也可以开启啊!

作者: Sufone     时间: 2008-2-18 19:01
7楼的肯定可以

作者: dy2003310     时间: 2008-2-24 01:26    标题: 请教
7楼兄的在偶xp上测试不成功

作者: Sufone     时间: 2008-2-27 22:22
XP接管了屏幕中断,在全屏模式的CMD中可以。

作者: geffhv     时间: 2008-2-29 16:12
汇编在不同的机器上结果可能是不同的吗?》

作者: Sufone     时间: 2008-3-1 11:12
只要DOS能运行,那就肯定可以

作者: DOSLER     时间: 2008-3-5 16:48
Originally posted by Sufone at 2008-3-1 11:12 AM:
只要DOS能运行,那就肯定可以

能运行也未必可以,名字相同,但功能未必相同。
我的操作系统是Microsoft Windows XP ,在虚拟8086下的MS-DOS Version 5.00运行以下程序。

assume cs:code
code segment
start:
mov ax,1201
mov bl,36
int 10h
mov ax,0
int 16h
mov ax,1200
mov bl,36
int 10h
mov ax,4c00h
int 21h
code ends
end start

运行之后,一点反应也没有。

Last edited by DOSLER on 2008-3-5 at 05:00 PM ]

作者: Sufone     时间: 2008-3-6 11:39
请在全屏模式下运行看看

作者: topmcs     时间: 2008-4-4 16:48
不是吧。。。这也行!!!!!!!!11

作者: netwinxp     时间: 2008-5-10 19:34
在XP的CMD也叫DOS@_@,你先取得Ring0权限再说!在xp很多I/O指令和硬件中断只有在Ring0权限才会得到真正的执行。