汇编语言编写钢琴程序

汇编语言编写钢琴程序,第1张

data segment

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 SEGMENT

DAT 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


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

原文地址:https://54852.com/yw/12470332.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存