您的位置:首页 > 其它

汇编_电子琴_带界面_带时钟_源程序

2009-04-24 09:12 381 查看
汇编_电子琴_带界面_带时钟_源程序

data segment
Freq dw 262,294,330,347,392,440,494,523 ;频率有改动
Tips db 20h,0eh,' Please Input 1-8,Esc to Quit: ',0eh,20h
count equ $-Tips
X1 dw (10*80+10)*2
X2 dw (10*80+70)*2
data ends

code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax
mov ax,3
int 10h ;置03H文本显示模式
mov ax,0b800h
mov es,ax
mov di,(6*80+22)*2 ;找显示位置
;(行号*80+列号)*2
lea si,Tips
cld
mov cx,count
TS:
lodsb ;提示
stosb
mov al,1ah ;字符颜色
stosb
loop TS
call clear ;局部清屏
mov dh,10 ;DH=行
mov dl,70 ;DL=列
mov ah,2
int 10h ;定位光标
Q1:
mov ah,1 ;测试键盘
int 16h
jnz @1
call time ;显示时间
jmp Q1
@1:
mov ah,0
int 16h ;接收一字符
cmp al,1bh
jz quit
cmp al,'1';数据校验
jb Q1
cmp al,'8'
ja Q1
call move ;左卷
mov di,X2
mov es:[di],al;显示有效键
and ax,0fh
dec al
shl al,1 ;求表内偏移
lea si,Freq ;定位表首
add si,ax
call sound ;奏乐
jmp Q1 ;转输入等待
quit:
mov ah,4ch ;退出
int 21h

sound: ;演奏子程序
mov al,0b6h
out 43h,al ;设定方波模式
mov dx,14h ;定时器发音常数
mov ax,4f38h
div word ptr [si] ;频率
out 42h,al ;输出低位
mov al,ah
out 42h,al ;输出高位
in al,61h ;读控制字
mov ah,al
or al,03h
out 61h,al ;开启扬声器
mov bx,3600;延时1秒
R1:mov cx,2801H
loop $
dec bx
jnz R1
mov al,ah ;关闭扬声器
out 61h,al
ret

clear:;局部清屏
mov di,X1
inc di
mov al,0E0h
mov cx,61
qp:mov es:[di],al
inc di
inc di
loop qp
ret

move: ;左卷子程序
mov bp,ax
mov dx,ds
mov si,X1
mov di,si
add si,2
mov ax,es
mov ds,ax
cld
mov cx,61
gp:
lodsb
stosb
inc si
inc di
loop gp
mov ds,dx
mov ax,bp
ret

Time: ;时间显示子程序
mov ax,0b800h
mov es,ax
mov di,(14*80+32)*2
push di
mov al,10
rdate:
dec al
cmp al,7
jb rtime
call disp
add di,6
jmp short rdate
rtime:
sub al,2
cmp al,0feh
je sign
call disp
add di,6
jmp short rtime
sign:
pop di
add di,4
mov byte ptr es:[di],'-'
mov byte ptr es:[di+1],0ECh
add di,6
mov byte ptr es:[di],'-'
mov byte ptr es:[di+1],0ECh
add di,12
mov byte ptr es:[di-6],20H
mov byte ptr es:[di-5],0ECh
mov byte ptr es:[di],':'
mov byte ptr es:[di+1],0ECh
add di,6
mov byte ptr es:[di],':'
mov byte ptr es:[di+1],0ECh
ret
disp:
push ax
push cx
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,0fh
add ax,3030h
mov byte ptr es:[di],ah
mov byte ptr es:[di+1],0ECh
mov byte ptr es:[di+2],al
mov byte ptr es:[di+3],0ECh
pop cx
pop ax
ret

code ends
end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: