题目来源:http://zhidao.baidu.com/question/130808124.html
程序特点:本程序未使用常规的BIOS中断调用和DOS功能调用的方法接收按键,而是直接判断键盘缓冲区的方法接收按键,
避免了在接收按键期间日期或时间停止显示(不更新)的重要弊端,尤其是时间秒的更新,尤为明显;对于显示日期,只
有在午夜前几秒进入显示日期状态,且不改变程序运行状态的前提下,方能看出日期显示的变更。
本程序在MASMPlus 1.2集消团中成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR equ 13
LF equ 10
BiosDataSegequ 0040H Bios data area segment
Buffer_Headequ 001AH Pointer to head of keyboard buffer
Buffer_Tailequ 001CH Pointer to tail of keyboard buffer
KB_BufferBeg equ 001EH head address of keyboard buffer
-------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法: Output Str_Addr
用法举例:Output PromptStr
Output MACRO Str_Addr
push ax
lea dx,Str_Addr
mov ah,9
int 21h
pop ax
EndM
------或手-------------------------------
功能:取光标位置
入口:无
出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
XOR BX,BX
MOV AH,3
INT 10H
MOV cs:Cursor_Row,DH
MOV cs:Cursor_Col,DL
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
-------------------------------------
功能:置光标位置
入口:Cursor_Row=行坐标Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,cs:Cursor_Row
MOV DL,cs:Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
--------------------拿山-----------------
功能:置光标属性
SetCursor_Attr Proc Near
push cx
push ax
mov cx,cs:Cursor_Attr
mov ch,cl
or ch,20h
mov ah,1 设置光标属性
int 10h
pop ax
pop cx
ret
SetCursor_Attr EndP
-------------------------------------
入口:AL=cmos内存端口号,DI=对应的ASCII码保存地址
BCD_ASCII Proc Near 将组合BCD码转换成对应的ASCII码
out 70h,al
in al,71h
xor ah,ah
mov cx,4
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
stosw 保存对应的ASCII码
ret
BCD_ASCII EndP
-------------------------------------
显示系统日期
Disp_Date proc Near
call SetCursor_Attr 使光标不可见
push ds
push cs
pop ds
mov Status,'D' 修改程序状态为:显示系统日期
lea di,@@Date 日期字符串地址
mov al,32h 日期的世纪数
call BCD_ASCII
mov al,9 年份
call BCD_ASCII
inc di
mov al,8 月份
call BCD_ASCII
inc di
mov al,7 日号
call BCD_ASCII
mov dx,Cursor_Sele
add dh,4
xor dl,dl
mov Cursor_Row,dh
mov Cursor_Col,dl
call SetCursor
Output @@Date 显示系统日期
pop ds
ret
Disp_Date Endp
-------------------------------------
显示系统时间
Disp_Time proc Near
call SetCursor_Attr 使光标不可见
push ds
push cs
pop ds
mov Status,'T' 修改程序状态为:显示系统时间
lea di,@@Time 时间字符串地址
mov al,4 时
call BCD_ASCII
inc di
mov al,2 分
call BCD_ASCII
inc di
xor al,al 秒
call BCD_ASCII
mov dx,Cursor_Sele
add dh,6
xor dl,dl
mov Cursor_Row,dh
mov Cursor_Col,dl
call SetCursor
Output @@Time 显示系统时间
pop ds
ret
Disp_Time Endp
-------------------------------------
Prompt_Menu db 'Date',CR,LF
db 'Time',CR,LF
db 'Quit',CR,LF
db 'Please select:$'
Status db '?' 程序状态标志
Cursor_Sele dw ? 保存光标位置
Cursor_Attr dw ? 保存光标属性(大小、闪烁)
@@Date db '/ / $'
@@Time db ' : : $'
Press_Key db 7,CR,LF,CR,LF,'The complated. Press any key to exit...$' *** 作完成按任意键结束程序提示信息
Start:push cs
pop ds
push cs
pop es 使数据段、附加段与代码段同段
Output Prompt_Menu 菜单地址
call GetCursor 取光标位置
mov Cursor_Sele,dx
mov Cursor_Attr,cx
mov ax,BiosDataSeg Bios data area segment
mov ds,ax
mov si,Buffer_Head Pointer to head of keyboard buffer
mov WORD ptr [si],KB_BufferBeg head address of keyboard buffer
mov WORD ptr [si][2],KB_BufferBeg
@@Select: mov dx,cs:Cursor_Sele
mov cs:Cursor_Row,dh
mov cs:Cursor_Col,dl
call SetCursor 置光标位置
Wait_Press: mov cx,cs:Cursor_Attr 取光标属性
mov ah,1 设置光标属性
int 10h
mov si,Buffer_Tail
mov ax,[si]
mov si,Buffer_Head
cmp ax,WORD ptr [si]
jz Check_Status 没有按键,检查程序状态标志
mov si,[si] 第一个未处理按键地址
mov ax,[si] 读取按键
mov si,Buffer_Head Pointer to head of keyboard buffer
mov WORD ptr [si],KB_BufferBeg head address of keyboard buffer
mov WORD ptr [si][2],KB_BufferBeg
push ax
mov dl,al
mov ah,2
int 21h
pop ax
and al,0dfh 转换成大写,使大小写不敏感
cmp al,'Q'
jz Exit_Proc
cmp al,'D'
jnz $+7
call Disp_Date 显示系统日期
jmp @@Select
cmp al,'T'
jnz @@Select
call Disp_Time 显示系统时间
jmp @@Select
Check_Status: mov al,cs:Status 取程序状态标志
cmp al,'?' 尚未执行每个功能
jz Wait_Press 等待按键
cmp al,'D' 当前处于显示系统日期状态?
jnz $+7 不是
call Disp_Date
jmp @@Select 等待按键
cmp al,'T' 当前处于显示系统时间状态?
jnz $+5 不是
call Disp_Time
jmp @@Select 等待按键
-------------------------------------
Exit_Proc: push cs
pop ds
Output Press_Key 提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch 结束程序
int 21h
Code ENDS
END Start 编译到此结束
设定程序计数器,产生1Hz的方波。然后由1Hz的方波产生时、分、秒和年、月、握桥日等信号。通过译码器,产生驱动LED的信号,用段凳猛来显示LED数码管。编写接粗姿口程序满足修改时间的要求。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)