标题:
如何编程关闭显示器?
[打印本页]
作者:
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
Quote:
Originally posted by
Sufone
at 2008-3-1 11:12 AM:
只要DOS能运行,那就肯定可以
能运行也未必可以,名字相同,但功能未必相同。
我的操作系统是Microsoft Windows XP [版本 5.1.2600],在虚拟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权限才会得到真正的执行。
欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/)
Powered by Discuz! 2.5