中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-10-31 19:11
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行
DOS开发编程 & 发展交流 (开发室) » 如何编程关闭显示器?
可打印版本  4,601 / 18
第1楼 dsysps 发表于 2007-02-02 01:11
初级用户 发帖 34 积分 98
如何编程关闭显示器?
项目中需要程序中定时关闭显示器,请问如何实现?
第2楼 Michael 发表于 2007-02-02 12:41
钻石会员 发帖 3,041 积分 10,056
改变它的power scheme,不过在dos下没试过
第3楼 zhgwbzhd 发表于 2007-02-05 11:07
高级用户 发帖 187 积分 506
是给他断电吗?估计困难点。
如果使用显示输出的中断,应该可以得了
第4楼 dsysps 发表于 2007-03-15 21:57
初级用户 发帖 34 积分 98
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);
}
第5楼 wzsunlight 发表于 2007-03-22 17:46
初级用户 发帖 52 积分 107
同意以上观点
第6楼 CrispH 发表于 2007-10-26 16:31
初级用户 发帖 49 积分 108
在 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 ]
第7楼 jojand 发表于 2007-10-30 14:24
初级用户 发帖 57 积分 117
执行以下的代码将关闭屏幕显示,键入任意键后开启屏幕显示:

mov ax,1201
mov bl,36
int 10
mov ax,0
int 16
mov ax,1200
mov bl,36
int 10
第8楼 CrispH 发表于 2007-10-30 18:22
初级用户 发帖 49 积分 108
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
第9楼 bd123456789 发表于 2008-01-11 21:58
中级用户 发帖 216 积分 360
测试出错
上面几位的代码我测试了几个,发现都不能正常关闭!
第10楼 CrispH 发表于 2008-02-18 18:25
初级用户 发帖 49 积分 108
真的吗?我测试了, 可以关闭,也可以开启啊!
第11楼 Sufone 发表于 2008-02-18 19:01
中级用户 发帖 124 积分 256
7楼的肯定可以
第12楼 dy2003310 发表于 2008-02-24 01:26
初级用户 发帖 68 积分 180 来自 China
请教
7楼兄的在偶xp上测试不成功
第13楼 Sufone 发表于 2008-02-27 22:22
中级用户 发帖 124 积分 256
XP接管了屏幕中断,在全屏模式的CMD中可以。
第14楼 geffhv 发表于 2008-02-29 16:12
社区乞丐 发帖 8 积分 -51 来自 四川省南充市嘉陵区
汇编在不同的机器上结果可能是不同的吗?》
第15楼 Sufone 发表于 2008-03-01 11:12
中级用户 发帖 124 积分 256
只要DOS能运行,那就肯定可以
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023