汇编语言高手:微机原理课程设计---显示日期或时间

汇编语言高手:微机原理课程设计---显示日期或时间,第1张

题目名称:显示系统日期和时间

题目来源: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数码管。编写接粗姿口程序满足修改时间的要求。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12398664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存