汇编课程设计源程序(数字时钟)Word文件下载.doc
《汇编课程设计源程序(数字时钟)Word文件下载.doc》由会员分享,可在线阅读,更多相关《汇编课程设计源程序(数字时钟)Word文件下载.doc(9页珍藏版)》请在冰豆网上搜索。
KREP DB 0 ;
防止连击标志,krep=0:
无键按下
KSHAKE DB 0 ;
键盘防抖
KFLAG DB 0 ;
功能键标志位kflag=1,2,3--key(A\B\C)pressed,4--key(F)pressed
SYMBL DB 0 ;
显示标志位0--displaybufer,1--displaytemp
FIRST DB 0 ;
修改标志位check2digit0--hight,1--low
ENTER DB 0 ;
在缓冲区里有新的数字?
有则为1
TABL DW 57FH,5BFH,5DFH,5EFH,5FEH,5FDH,5FBH,5F7H
DW 67FH,6BFH,6DFH,6EFH,6FEH,6FDH,6FBH,6F7H
DW 37FH,3BFH,3DFH,3EFH,3FEH,3FDH,3FBH,3F7H
;
键盘扫描码
ASCI DB "
0123456789ABCDEFGMPRWXYS"
;
键盘顺序码
MASEG DB "
THEKEY_PREESEDISERROR!
"
13,10,'
$'
按键出错提示字符串
NUMERRDB 13,10,"
THEENTEREDDIGITISERROR,INPUTAGAIN!
无效时间提示字符串
LED8 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H
DB 77H,7CH,39H,5EH,79H,71H,80H,76H,38H,05CH
显示编码表
POINT DW ?
ORDER DW 0
BUFER DB 11H,0EH,12H,12H,0H,13H
hh:
mm:
ss;
'
HELLOo'
-atstarts;
LED初始显示状态
TEMP DB 6DUP(0) ;
时间缓存区
SELECT DB 1,2,4,8,10H,20H
OLDSEG DW 0 ;
保持初始中断向量段地址
OLDOFF DW 0 ;
保存偏移地址
DATA ENDS
**************代码段********************
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA,ES:
DATA
MAIN:
MOV AX,DATA
MOV DS,AX
MOV DX,PORTB
MOV AL,00
OUT DX,AL ;
熄灭所有数码管
MOV AH,35H ;
保存原来的中断向量
MOV AL,11
INT 21H
MOV OLDSEG,ES
MOV OLDOFF,BX
MOV AX,SEGKEYLED ;
写入新的中断向量
MOV DS,AX
LEA DX,KEYLED ;
取偏移地址
MOV AL,11 ;
IRQ3中断向量类型号
MOV AH,25H
INT 21H ;
写入IRQ3中断向量
STI
MOV AX,DATA ;
CSH数据段
MOV DS,AX
MOV ES,AX ;
CSH堆栈段(inHDYmovsb要重新设定堆栈段)
MOV DX,PA+3 ;
8255控制字
MOV AL,10010000B ;
PA口输入,PB口输出
OUT DX,AL
MOV POINT,OFFSETTEMP ;
输入HCQ
IN AL,21H ;
读8259中断寄存器
AND AL,0F7H ;
11111011b
OUT 21H,AL ;
开IRQ3
MOV DX,TC0+3 ;
8253定时寄存器初始化
MOV AL,01010110B ;
xuanTD1,xieyigediZJ,gongzuofangshi3
OUT DX,AL
MOV DX,TC0+1 ;
TD1,weidingshiqifuchuzhi
MOV AL,5 ;
LS393OUT8M/8K,T1OUT200HZ
OUT DX,AL ;
tc1low8=10
STEP:
MOV AH,1 ;
按任意键退出
INT 16H
JZ STEP
MOV DX,OLDOFF ;
恢复IRQ3中断向量
MOV AX,OLDSEG
MOV AL,11
INT 21H ;
重新写入原来的IRQ3的中断向量地址
MOV AH,4CH
***********************中断子程序,进行键盘扫描及显示*********************
KEYLED PROC FAR ;
每72ms进入一次键盘扫描程序
PUSH AX ;
寄存器A压栈
STI ;
开中断
DEC COUNT1 ;
-1,到72ms的话要扫描键盘
JZ SCANK;
到72ms的话进行键盘扫描
JMP DISP ;
否则进行显示
SCANK:
MOV COUNT1,12 ;
72ms初始化数字,为下次扫描键盘准备
DEC COUNT2 ;
72*13ms=1s?
N扫描
JNZ KSCAN ;
去扫描键盘
MOV COUNT2,13 ;
恢复count2,为下次读实时时间准备
*******通过BIOS功能调用读系统时间,并处理后的ASCII数值放入BUFER缓冲区
READT:
MOV AH,2 ;
读BIOS中系统的时间
INT 1AH ;
(CH:
CL)=时:
分,(DH:
DL)=秒:
1/100秒
MOV AX,CX ;
放到AX中,
MOV DI,OFFSETBUFER ;
DI指向时间缓冲区
MOV CL,4
ROL AX,CL ;
循环左移,使得小时高位现在为最低位
MOV BL,AL ;
保存到BL中
AND BL,0FH ;
处理,得到小时的高位
MOV [DI],BL ;
将小时的高位放入缓冲区中
INC DI
小时的低位处理,放入缓冲
MOV BL,AL
AND BL,0FH
MOV [DI],BL
分钟的高位处理,放入缓冲区
MOV BL,AL
AND BL,0FH
MOV [DI],BL
分钟的低位处理,放入缓冲区
MOV AX,DX ;
秒的高位处理,放入缓冲区
ROL AX,CL
MOV [DI],BL
秒的低位处理,放入缓冲区
**********键盘扫描
KSCAN:
MOV COUNT1,12 ;
SMJPCXduan
MOV DX,PA+1