数字式秒表汇编程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
inttype equ 08h;设置中断类型码
p8253ctrl equ 43h;8253的控制口
p8253cto equ 40h;8253的数据口
p8255ctl equ 0e803h;8255的控制口
rowport equ 0e801h
colport equ 0e802h
segport equ 0e800h ;段选
bitport equ 0e801h ;位选
cnto equ 11930 ;用来计算频率
.model small
.data ;数据段
str db 36 dup (?) ;定义一个数组用来存放前八个成绩
flag db 0 ;定义标志位
mc db 1 ;定义名次
num db 1
point dw str ;定义指针
point2 dw str ;定义指针
count db 0 ;用来计时,初始化为0
buff db 0,0,0,0 ;初始化数据缓冲区
buff2 db 0,0,0,0 ;初始化数据缓冲区
bit db 1 ;位码置1
mess db '0-开始比赛1-记录成绩2-显示成绩3-退出返回DOS
4-比赛结束5-暂停计时:',0dh,0ah,'$'
dseg db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;数据‘0’~‘9’asctab db "0123456789ABCDEF"
.code ;代码段
.startup ;开始
mov ah,9
lea dx,mess
int 21h
mov al,36h;写8253的方式字
mov dx,p8253ctrl
out dx,al
mov ax,cnto ;
mov dx,p8253cto;写初值
out dx,al
mov al,ah
out dx,al
mov al,81h ;8255初始化
mov dx,p8255ctl
mov al,inttype ;DOS调用,读取中断向量mov ah,35h
int 21h
push es ;将es,bx,ds入栈保护
push bx
push ds
mov ax,@data
mov es,ax
mov dx,offset intp ;取intp的偏移量
mov ax,seg intp ;取intp的段地址
mov ds,ax
mov al,inttype ;设置inttpye的新中断向量mov ah,25h
int 21h
pop ds ;将ds出栈
in al,21h ;CPU开中断(开IR0)
out 21h,al
sti
ab:
call button
cmp al,'3' ;如果为F,则退出
jz fp
cmp al,'1' ;如果为1,且标志位D0位为1,D2为1,则可保存成绩
jz mp
cmp al,'2'
jz pp
cmp al,'4' ;比赛结束,即可以重新开始比赛
jz ap
cmp al,'5' ;暂停计时
jz pap
cmp al,'0'
jnz ab
OR flag,05h ;如果按键为B,则置标志位最后一位为1
jmp ab
mp: ;存储的代码
test flag,04h ;先判断是否还能存储,不能则跳到ab,否则继续
jz ab
mov al,mc ;将第一位的名次先放到buff,然后一起放入数组mov buff,al
lea si,buff
mov di,point
mov cx,4
cld
rep movsw
cmp mc,8 ;如果名次到了8个,则将标志位置零,然后就不能存储了。
jz go3
inc mc
add point,4
jmp ab
go3:and flag,0fah
lea bx,str
mov point,bx
jmp ab
pp:
and flag,0feh
cmp num,9 ;判断是否按过8次,是退出,否则继续jz ab
inc num
lea di,buff
mov si,point2
mov cx,4
cld
rep movsw
add point2,4
jmp ab
ap:
push bx
and flag,0 ;对标志和名次及num都进行初始化,以便比赛重新开始
mov mc,1
mov num,1
lea bx,str
mov point,bx
mov point2,bx
mov buff,0
mov buff+1,0
mov buff+2,0
mov buff+3,0
pop bx
jmp ab
pap:
and flag,0feh
jmp ab
fp:cli ;关中断
pop dx;出栈
pop ds
mov al,inttype ;设置新的中断向量
mov ah,25h
int 21h
.exit 0;主程序结束
intp:
push si
push di
push ax
push bx
push cx
push dx
test flag,01h ;判断标志位D0是否为1,为1开始,否则不计数jz iexit
inc count;次数加1
cmp count,10;将count和100比较
jnz iexit ;若count不等于100,则转iexit mov count,0;否则count置0
inc buff+3 ;秒的地位加1
cmp buff+3,10 ;将秒的地位和10相比较jnz iexit ;若秒的地位不等于10,则转iexit inc buff+2 ;否则向秒的高位进1
mov buff+3,0;秒的地位置0
cmp buff+2,10;秒的高位和6相比
jnz iexit ;若不为6,则转iexit
inc buff+1 ;否则分的地位加1
mov buff+2,0;将秒的高位置0
cmp buff+1,6 ;分的地位和10相比
jnz iexit;若不等则转iexit
;inc buff;否则分的高位加1
mov buff+1,0;分的地位置0
and flag,0feh
;cmp buff,6;分的高位和6比较
;jnz iexit;不等则转iexit
;mov buff,0;将分的高位和0比较
iexit:lea bx,dseg;去数据表的首地址
lea si,buff;取缓冲区的首地址
agi:mov al,[si];将si的内容送给al
xlat;将ASCII码转换成数据
mov ah,al
mov dx,bitport
mov al,bit
out dx ,al
cmp al,04h ;判断是否为第二位,是则加上点,否则继续jnz q1
and ah,07fh
q1:mov al,ah
mov dx,segport;取相应的段和位
out dx,al
mov cx,8000h;延时
delay:loop delay
inc si;缓冲区地址加1
shl bit,1;将位加1
cmp bit,10h;将bit和10h相比
jnz agi;不等于则循环
mov bit,1;否则将bit置1
mov al,0
mov dx,bitport
out dx,al
mov al,20h;将8259偶口中的数据输出out 20h,al
pop dx
pop cx
pop bx
pop ax
pop di
pop si
iret
button proc near
next:mov dx,rowport mov al,0
out dx,al
inc dx
abb:in al,dx
and al,0fh
cmp al,0fh
jz abb
mov cx,8000h delayy:loop delayy
mov bh,00 ;首行号mov bl,0;列号mov cx,4
mov ah,0feh
again:mov al,ah mov dx,rowport out dx,al
inc dx
in al,dx
and al,0fh
cmp al,0fh
jnz ab1
add bh,4
shl ah,1
loop again
jmp next
ab1:mov cx,4
ab3:shr al,1
jc ab2
jmp ab4
ab2:inc bl
loop ab3
ab4:add bh,bl mov al,bh
lea bx,asctab xlat
push ax
mov dl,al
mov ah,2
int 21h
mov dx,rowport mov al,0
out dx,al
inc dx
AB5: in al,dx and al,0fh
cmp al,0fh
jnz AB5
mov cx,000h delay2:loop delay2 pop ax
ret
button endp
end。