标题: 如何编程关闭显示器?
[打印本页]
作者: 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权限才会得到真正的执行。