
f1 dw 524,588,660,698,784,880,988,1048
data ends
code segment
assume cs:code,ds:data
hhh proc near
mov dx,08ffh
mov cx,0ffffh
yyy:loop yyy
dec dx
jnz yyy
ret
hhh endp
start:mov ax,data
mov ds,ax
xxx: mov ah,1h
int 21h
cmp al,'1'滑裤 判断是否为数字1~8
jb over
cmp al,'8'
ja over
sub al,31h
mov bl,2
mul bl
mov ah,0 ax高8位为0
mov si,ax 保护AL于SI中,以待后用,作为参数传递
mov bx,f1[si]
mov ax,0000h
mov dx,0012h
div bx
mov bx,ax
mov dx,43h 控制字
mov al,0b6h
out dx,al 写入控制端口
mov al,bl
out 42h,al 先写低8位
mov al,bh
out 42h,al 后写高8位
in al,61h 读PB口当前状态
mov ah,al
or al,03h 使PB0、PB1均为1,打开与门
out 61h,al 接通扬声器
call hhh 调用信斗简销链 hhh
mov al,ah
and al,0fch 使PB0、PB1均为0,关闭与门
out 61h,al
jmp xxx
over:mov ah,4ch
int 21h
code ends
end start
DATA SEGMENTDAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252
HEIGHT DB 0, 40, 70, 100, 130, 160, 190, 220, 250
DATA ENDSCODE SEGMENT
ASSUME CS:CODE, DS:DATASTART: MOV AX,DATA
MOV DS,AX
MOV AH,0 图形方式:每屏幕字符数80×25, 16色
MOV AL,12H
INT 10H
MOV AH,6 清屏
MOV AL,0
MOV CH,0
MOV CL,0
MOV DH,18H
MOV DL,4FH
INT 10H
MOV SI,451
MOV DX,480
REDRAW:MOV DI,16
ADD DI,48
MOV CX,16SUB DX,1
CMP DX,SI
JB LL
MOV BL,0
PAINT: MOV AL,9
MOV AH,0CH
MOV BH,0
INT 10H
INC CX
CMP CX,DI
JBE PAINT
ADD DI,80
ADD CX,32
INC BL
CMP BL,7
JBE PAINT
JMP REDRAW
LL:
MOV AL,80H 对8255进行初始化工作,A口、B口均为输出状态工作与方式0
OUT 63H,AL
MOV AL,0B7H 对计数铅运器8253进行初始镇激派化工作,选2号计数器,且先读写低8位后高8位,工作与模式3
OUT 43H,ALPP: MOV AH,01H
INT 16H
JZ PPSUB AL,30H
CMP AL,09H AL中的参数将传递到SOUND子程序去
JAE OVER1CALL SOUNDJMP PPOVER1:JMP OVER
SOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SIMOV AH,0
MOV SI,AX 保护AL于SI中,以待后用,作为参数传递
MOV BX,OFFSET DAT
XLATMOV DI,AX
MOV DX,12H
MOV AX,34DCH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
OR AL,3
OUT 61H,AL 此时喇叭将在计数器输出的频率工作发声,且CPU得以解放可执行下面的绘图工作CALL PIANOMOV AL,0
OUT 61H,ALMOV AL,0H
MOV AH,0CH
INT 21HPOP SI
POP DX
POP CX
POP BX
POP AX
RETSOUND ENDPPIANO PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DIMOV AX,SI
MOV BH,AL BH中表示按得是什么键,
MOV BL,0
PUSH BX
MOV BX,OFFSET HEIGHT
XLAT
POP BX BH中表示按得是什么键,
MOV AH,0
PUSH AX AX中的为键柱的高度MOV DX,450
MOV CX,10
DEC BH
MOV AL,BH
MOV BL,80
MUL BL
ADD CX,AX CX中为键柱的起始横坐标
POP AX AX中的为键柱的御贺高度
INC BH BH中表示按得是什么键,
MOV SI,CX
ADD SI,32 SI中为横坐标的边界
MOV DI,DXSUB DI,AX DI中为纵坐标的边界
OK: PUSH SI
SUB SI,32
MOV CX,SI
POP SI
SB: MOV AL,0EH
MOV AH,0CH
MOV BH,0
INT 10H
INC CX
CMP CX,SI
JBE SB
DEC DX
CMP DX,DI
JAE OKPUSH BX
PUSH CX
MOV BX,5000
DELAY:MOV CX,0FfFH
DL10MS:LOOP DL10MS
DEC BX
JNZ DELAY
POP CX
POP BX
MOV DX,DI
MOV DI,450
GO: PUSH SI
SUB SI,32
MOV CX,SI
POP SI
CA: MOV AL,0H
MOV AH,0CH
MOV BH,0
INT 10H
INC CX
CMP CX,SI
JBE CA
INC DX
CMP DX,DI
JBE GO
POP DI
POP DX
POP CX
POP BX
POP AXRETPIANO ENDPOVER: MOV AH,4CH
INT 21HCODE ENDS
END START
******************************** 电子琴实验 *
*******************************
data segment
io8255aequ 288h
io8255bequ 28bh
io8253a equ 280h
io8253bequ 283h
table dw 524,588,660,698,784,880,988,1048高音的祥拦
table dw 262,294,330,347,392,440,494,524低音的
msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h 显示提示信息
sing:
mov ah,7
int 21h 从键盘接收字符,不回显
cmp al,1bh
je finish若为ESC键,则转finish
cmp al,'1'芹宴唤
jl sing
cmp al,'8'
jg sing 若不在'1'-'8'之间转sing
sub al,31h
shl al,1 转为查表偏移量
mov bl,al保存偏移到bx
mov bh,0
mov ax,4240H 计数初值 = 1000000 / 频率, 保存到AX
mov dx,0FH
div word ptr[table+bx]
mov bx,ax
mov dx,io8253b 设置8253计时器0方式3, 先读写低字节, 再读写高字节
mov al,00110110B
out dx,al
mov dx,io8253a
mov ax,bx
out dx,al写计数初值低字节
mov al,ah
out dx,al写计数初值高字嫌凯节
mov dx,io8255b 设置8255 A口输出
mov al,10000000B
out dx,al
mov dx,io8255a
mov al,03h
out dx,al置PA1PA0 = 11(开扬声器)
call delay 延时
mov al,0h
out dx,al置PA1PA0 = 00(关扬声器)
jmp sing
finish:
mov ax,4c00h
int 21h
delay proc near 延时子程序
push cx
push ax
mov ax,15
x1: mov cx,0ffffh
x2: dec cx
jnz x2
dec ax
jnz x1
pop ax
pop cx
ret
delay endp
code ends
end start
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)