电子琴的微机原理设计方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子琴的微机原理设计方案
第一章方案论证
1.1 设计规模和总体框架
1.1.1系统的基本功能
弹奏:用键盘输入对应的七个音阶,用户每按一个键盘琴键就弹奏相应的音符,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶;
扩展功能:
演奏:电子琴设有8个按键,其中7个作为音符输入,另外一个作为模式转
换按键,实现用户存放的自动播放歌曲。
按下键盘上某一个指定的建后自动弹
奏预存琴谱功能;要求按键按下时发声,松开延时一小段时间,中间再按别的
键则发另外一音调的声音,当系统扫描到键盘按下,则快速检测出是哪一个按
键被按下,然后单片机的定时器启动,发出一定频率的脉冲,该频率的脉冲经
喇叭驱动电路放大滤波后,就会发出相应的音调。
如果在前一个按下的键发声
的同时有另一个按键被按下,则启动中断系统。
前面的发音停止,转到后按的
键的发音程序。
发出后按的键的音调。
1.1.2系统的主要功能模块
控制模块:选择AT89S52单片机来控制整个系统,其中P2口作为输入口,
P1口为信号输出口,P1.0连接音响驱动电路。
用户编程模块:由键盘矩阵、LED显示管、扬声器这几个部分组成
存储器模块:8088有1MB存储空间,系统提供用户使用的空间为00000H-0FFFFH,用于存放、调试实验程序。
键盘输入模块:用来操作者对机器的控制操作,在P2口连接有8个按键开
关加8个拉电阻,它们一端接5伏电源,一端接地。
只要有一个按键被按下,
并被单片机扫描到,则会播放发出音符。
(LED显示管显示当前按键,扬声器发出对应音符。
)
输出驱动模块:利用AT89S52单片机的P0端口的P0.0-P0.7连接到一个
七段数码管的a-h的笔段上,数码管的公共端接电源;声音的播放模块,它接
到P1.0口上,当有按键按下时,它通过AT89S52中心控制芯片的识别后发出相
应的音符。
1.1.3系统的组成框图
根据系统的功能要求,我们可以得到系统的组成框图:
图1系统框图
1.2操作流程 1.
2.1如何使用
系统安装及配置说明 系统运行环境
WINDOWS XP PROTEUS 7.1 SP2 Keil uv3 2.12
系统安装及配置
安装Protues 和keil uVsision3。
系统操作说明
(1)Keil下编译,产生目标HEX档,Proteus下Programme Files选择产生的HEX档,点击运行开始模拟。
(2)开启本系统,数码管显示“-”。
(3)按任意键盘,数码管显示所按下的键盘数,扬声器发出相应的音符。
1.2.2使用流程
图2 使用流程
第二章硬件系统的设计
2.1控制模块的选择:
本次设计中中心控制模块是选择AT89S52单片机来控制整个系统。
2.2用户编程模块:
本系统由键盘矩阵、LED显示管、扬声器这几个部分组成,LED显示管显示当前按键,扬声器发出对应音符。
硬件总体设计图如下:
图3
2.3存储器模块:
8088有1MB存储空间,系统提供用户使用的空间为00000H-0FFFFH,用于存放、调试实验程序。
具体分配如下:
2.3.1 存贮器地址分配
表2-1 存贮器地址分配
2.3.2 I/O地址分配
表2-2 I/O地址分配(一)
表2-3 I/O地址分配(二)
监控占用00004H-0000FH作为单步(T)、断点(INT3)、无条件暂停(NMI)中断矢量区,用户也可以更改这些矢量,指向用户的处理,但失去了相应的单步、断点、暂停等监控功能。
F0000H-FFFFFH监控程序区系统占用。
2.4键盘输入模块:
在P.2口十连有8个按键并加有8个拉电阻.它们一端接5伏电源,一端接地.在仿真时,只要有一个键被按下,并被单片机扫描到,则会使播放器发出声音.
图 4
2.5输出驱动模块:
2.5.1子系统(模块)一
LED显示模块如图2-2所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个七段数码管的a-h的笔段上,数码管的公共端接电源。
矩阵扫描显示当前按键模块如下:
图 5
2.5.2子系统(模块)二
矩阵扫描扬声器发出对应音符模块如下:
图 6
第三章应用软件的设计
应用系统中任务的实现,最终是靠程序的执行来完成的。
应用软件设计的好坏,将决定系统的效率和它的优劣。
应用软件的设计依据是使用流程。
根据使用流程可以确定系统的控制流程和软件模块。
根据顺序控制器的操作流程可以确定,本系统软件主要由4个模块构成:主程序,编程控制模块,运行控制模块和定时器中断服务模块。
3.1主程序
主程序的任务首先是进行初始化,然后根据“编程/运行”开关的状态判别,进入“编程状态”或“运行状态”。
根据主程序的操作流程,可以确定主程序的控制流程如图
主程序流程图
图 7
主要程序:
MAIN:
MOV SP,#60H ;初始化堆栈指针
MOV 30H,#00 ;定时器初值清零
MOV 31H,#00
MOV P1,#0FFH ;设置P1口为输入模式
MOV TOMD,#01H ;设置定时器0为工作模式1
SETB ET0 ;开定时器0中断
SETB EA ;开总中断
CLR TR0 ;关闭定时器0
3.2编程控制模块
根据编程状态的操作流程,可以确定编程操作的控制流程如图
OUTBIT equ 0FE02h IN equ 0FE00h
Pulse equ 0
PulseCNT equ 50h
ToneHigh equ 51h
ToneLow equ 52h
Speaker equ P1.0
0000 02008E ljmp Start
org 000bh Timer0Int:
000B C0D0 push PSW
000D C28C clr TR0
000F 85518C mov TH0, ToneHigh
0012 85528A mov TL0, ToneLow
0015 D28C setb TR0
0017 A200 mov c, Pulse
0019 9290 mov Speaker, c
001B B200 cpl Pulse
001D 1550 dec PulseCNT
001F D0D0 pop PSW
0021 32 reti
ToneTable:
0022 FC42
0024 FCAE
0026 FD0A
0028 FD35
002A FD82
002C FDC8
002E FE05 dw 64578, 64686, 64778, 64821, 64898, 64968, 65029
TestKey:
0030 90FE02 mov dptr, #OUTBIT
0033 7400 mov a, #0
0035 F0 movx @dptr, a
0036 90FE00 mov dptr, #IN
0039 E0 movx a, @dptr
003A F4 cpl a
003B 540F anl a, #0fh
003D 22 ret
KeyTable:
003E 161514
0041 FF db 16h, 15h, 14h, 0ffh
0042 131211
0045 10 db 13h, 12h, 11h, 10h
0046 0D0C0B
0049 0A db 0dh, 0ch, 0bh, 0ah
004A 0E0306
004D 09 db 0eh, 03h, 06h, 09h
004E 0F0205
0051 08 db 0fh, 02h, 05h, 08h
0052 000104
0055 07 db 00h, 01h, 04h, 07h
GetKey:
0056 90FE02 mov dptr, #OUTBIT
0059 8583A0 mov P2, dph
005C 7800 mov r0, #Low(IN)
005E 7920 mov r1, #00100000b
0060 7A06 mov r2, #6
KLoop:
0062 E9 mov a, r1
0063 F4 cpl a
0064 F0 movx @dptr, a
0065 F4 cpl a
0066 03 rr a
0067 F9 mov r1, a
0068 E2 movx a, @r0
0069 F4 cpl a
006A 540F anl a, #0fh
006C 7006 jnz Goon1
006E DAF2 djnz r2, KLoop
0070 7AFF mov r2, #0ffh
0072 800F sjmp Exit
Goon1:
0074 F9 mov r1, a
0075 EA mov a, r2
0076 14 dec a
0077 23 rl a
0078 23 rl a
0079 FA mov r2, a ; r2 = (r2-1)*4
007A E9 mov a, r1
007B 7904 mov r1, #4
LoopC:
007D 13 rrc a
007E 4003 jc Exit
0080 0A inc r2
0081 D9FA djnz r1, LoopC
Exit:
0083 90FE02 mov dptr, #OUTBIT
0086 E4 clr a
0087 F0 movx @dptr, a
0088 EA mov a, r2
0089 90003E mov dptr, #KeyTable
008C 93 movc a, @a+dptr
008D 22 ret
Start:
008E 758170 mov sp, #70h
0091 758901 mov TMOD, #01 ; Timer
0094 75A882 mov IE, #82h ; EA=1, IT0 = 1 MLoop:
0097 1130 call TestKey
0099 60FC jz MLoop
009B 1156 call GetKey
009D F5F0 mov b, a
009F 60F6 jz MLoop ; = 0, < 1
00A1 54F8 anl a, #!7
00A3 70F2 jnz MLoop ; > 7
00A5 15F0 dec b
00A7 E5F0 mov a, b
00A9 23 rl a ; a = a*2
00AA F5F0 mov b, a
00AC 900022 mov dptr, #ToneTable
00AF 93 movc a, @a+dptr
00B0 F551 mov ToneHigh, a
00B2 F58C mov TH0, a
00B4 E5F0 mov a, b
00B6 04 inc a
00B7 93 movc a, @a+dptr
00B8 F552 mov ToneLow, a
00BA F58A mov TL0, a
00BC D28C setb TR0
00BE 755064 mov PulseCNT, #100
Wait:
00C1 E550 mov a,PulseCNT
00C3 70FC jnz Wait
00C5 C28C clr TR0
00C7 020097 ljmp MLoop
end
3.3运行控制模块
根据运行状态的操作流程,可以确定运行操作的控制流程如图
图 9
程序:
data segment
ioport equ 0c800h-0280h
io8253a equ ioport+280h;8253通道0地址
io8253b equ ioport+283h;8253控制字寄存器地址
io8255a equ ioport+288h ;8255A口地址
io8255b equ ioport+289h ;8255B口地址
io8255d equ ioport+28bh;8255控制字寄存器地址
io0832a equ ioport+290h
proth equ ioport+2a8h ;点阵行选的地址
protlr equ ioport+2b0h ;点阵列选的地址
data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h
;正弦波数据
time db 120,106,94,89,79,70,63,59
;发不同音时8253的计数器初值
banquan db 0dh,0ah
db '
*************************************************',0dh,0ah db ' **
**',0dh,0ah
db ' ** WELCOME TO USE
dianziqin **',0dh,0ah db ' ** THIS PROGRAMME IS
DESIGHED BY **',0DH,0AH
db ' ** zhouqiuping 61007204
**',0DH,0AH
db ' **
**',0dh,0ah
db '
*************************************************',0dh,0ah
db ' Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$' num db ? ;num为8253计数器初值的序号
freq dw 262,294,330,349,392,440,494,523 ;扬声器发声各频率值
tim dw 400
data ends
stack segment stack
dw 256 dup(?)
stack ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset banquan ; 版权显示
mov ah,9
int 21h ;显示提示信息
sss: mov ah,7
int 21h ;等待从键盘接收字符,不回显al=asc码 cmp al,1bh
je exit ;若为ESC键,则转EXIT推出
cmp al,31h
jl sss ;小于31h
cmp al,38h ;大于38h
jg sss ;不在'1'-'8'之间转sss
sub al,31h
mov num,al ;num求出相应的时间常数的序号dianzhen: mov al,0ffh ;点阵板的列全部选通
mov dx,proth
out dx,al
mov al,00000001 :点阵的行赋初值
shl al,num ;根据输入的数字,左移相应位数,即点阵亮相应行
mov num,al ;如输入3,则num为2,左移两位,第三行亮
mov dx,prothl
out dx,al
led: mov dx,io8255d
mov al,99h ;设置8255A口入B口出
mov dx,io8255b
out dx,num ;根据移位后的num点亮相应led灯kaiguan: mov dx,io8255a ;判断机内机外
in al,dx ;从8255B口读一字节
test al,10b ;判断PA0口是否为10(二进制)
jz jiwai ;是的话转实验仪
jmp nei ;否则转机内
;---------------------------------jiwai
jiwai: mov cx,60 ;取60次32个正弦波数据
ddd: mov si,0
lll: mov al,data1[si] ;取正弦波数据
mov dx,io0832a
out dx,al ;放音
call delay ;调延时子程序
inc si
cmp si,32 ;是否取完32个数据
jl lll ;若没有,则继续
loop ddd ;总循环次数60是否完,没有,则继续
jmp sss
exit: mov ah,4ch
int 21h
delay proc near ;延时子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0为方式0工作
mov al,10h
out dx,al
mov al,num ;取相应的时间常数
xlat
mov dx,io8253a
out dx,al ;向8253通道0输出
kkk: mov dx,io8255a
in al,dx ;从8255A口读一字节
test al,01 ;判PA0口是否为1
jz kkk ;若不为1,则转KKK
ret ;子程序返回
delay endp
;-------------------------------------机内部分
jinei: mov al,num
add al,al
mov ah,00h
mov si,ax
again: mov di,freq[si]
mov bx,tim
call gen
jmp sss
gen proc near
mov al,0b6h ;设置8253通道2方式3二进制计数 out 43h,al
mov dx,12h
mov ax,12928
; DX AX=896*533h=18*65536+12928=1.19M
div di
out 42h,al ;8253通道2口设置初值
mov al,ah
out 42h,al
in al,61h ;读8255PB口 mov ah,al
or al,3
out 61h,al
wait1: mov cx,0h
delay3: mov ax,10 ;延时子程序delay2: nop
nop
dec ax
jnz delay2
loop delay3
dec bx
jnz wait1
mov al,ah
out 61h,al
ret
gen endp
code ends
end start
3.4定时器中断服务模块
定时器子程序图如图2.7所示。
图 10
3.5硬件调试与软件调试
3.5.1 硬件调试
1)断电调试:
为了安全,首先进行断电调试,用万用表检测系统是否有短路现象,再检查严接线是否正确。
经检测,接线正确也没有短路现象。
2)通电调试:
第一,检查系统是否正常。
第二,检查数码显示是否乱码。
在通电调试过程中,经检查系统正常;数码管显示乱码,查明原因为8255A 芯片B输出端口与数码管输入端口接线时接反了,经改正后检查没有出现新的问题。
3.5.2软件调试
输入程序并检查无误,经汇编、连接后加载装入系统运行,观察现象。
发现倒计时器只能运行一次而不能循环(即程序倒计时到0后无法继续循环倒计时),经检查发现程序结束前掉了一条跳转指令。
经修改后,再进行编译并加载,运行程序,结果显示正常并实现了循环功能,经调试三个开关发现开关实现功能正常。
3.5.3 调试过程
让8255的口工作在方式一输入状态下,B口接在试验箱上的八个拨码开关上,把拨码开关的电平信号传送到8255的输出口,CPU取走的8255输出口的信号送到8253,8253工作在工作方式3,方波放生气。
这样通过送不同的数据时8253发出不同频率的方波信号,不同频率的方波信号就会驱动发生器发出不同频率的声响。
3.6测试方案和测试结果
表 3-1 小结
通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
原本微型计算机接口技术就是计算机科学与技术专业的一门核心课程,是突出计算机应用的一门课程。
根据自己所学的知识,来完成本次微型计算机课程设计的内容。
本次课程设计主要是设计一个电子琴,要求用键盘输入1、2、3、4、5、6、7按键,产生不同频率的声音,来模拟电子琴发出音阶乐谱。
要发出声音,要用芯片实现,首先想到的是课堂上学过的8253定时/计数器它可以发出一定频率的声音。
有七音阶个频率,就对应有七个计数初值,通过调用不同的程序,来完成每一次按键所对应频率的计数初值,进而实现不同的声音。
要产生频率,就用到脉冲发生器、分频器;产生音质好、播放出来声音,就用到音频功效模块。
各个模块进行相应的连接,来实现电子琴的功能。
这次微机实验课程设计,使我对微机软硬件结合有了进一步的了解。
原来并不太清楚是什么意思,一直都很模糊,听课本也是很迷茫;而之前的那些单元实验,也没有都做好。
之前做的实验,由于大部分是验证性的,所以就很被动地去做,甚至并没有想为什么要那样连电路,内部的代码更没有认真看。
这次课程设计,因为要自己去设计整个过程,所以就不得不去了解学习自己原来并没有真正弄懂的东西。
比如一些程序的代码的意思,汇编语言的逻辑,比如一些芯片的用途。
使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。
同时对课本上讲的一些内容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。
经过我长时间的设计及调试,本系统基本能实现按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放对应的音符。
但由于仿真系统原因,本设计音频效果不是很好。
不足之处有:1.可弹奏的音符数较少,只能在一定范围内满足用户需要。
可通过改进键盘识别模块和发生模块来增加其复杂度2.音量不可调。
在这为期一周的课程设计中,我深刻明白了理论知识与社会实践相结合的道理,从中得到了以前书本知识所不曾得到的知识,更加明白了如今信息时代电子技能知识的重要性。
同时我对自己的动手能力有了信心,这次的课程设计我感觉很完美,我会利用这次机会再努力的提高自己。
编写程序的过程中,我遇到了很多的问题。
在此我特别要感谢帮助我的老师们,特别是老师,没有他们,我就不能完成这个课程设计,是他们不厌其烦地帮我讲解。
经过这个课程设计,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西。
这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较综合。
经过短短一周的课程设计,我认识到,课程设计能真正让人学到实际应用的东西的一门课程。
收获比上几星期课还多。
虽然这是我大学期间第一次以这种方式做设计,可以说是困难重重,但是这是一种全新的实验方法一种新的经历,使我对课程设计有了新的认识,同时增强了我对本课程各种标准的认识,强化了我独立处事的能力使我受益良多。
参考文献
[1] 杨素行《微型计算机系统原理及应用》,北京,清华大学出版社,2004年
[2] 刘树中,孙书膺,王春平.单片机和液晶显示驱动器串行接口的实现[J].微计算机信息,2007
[3] 李广弟。
单片机基础[M]。
北京:北京航天航空大学出版社,2001
[4] 杨振江。
智能仪器与数据采集系统的新器件及应用[M]。
西安:西安电子科技大学出版社,2001
[5] 彭介华.电子技术课程设计指导[J].北京:高等教育出版社,1997.
[6] 张毅刚,彭喜元。
单片机原理与应用[M](十)北京:高等教育出版社,2007.10
[7] 李建忠.单片机原理及应用.西安:西安电子科技大学,2002年
[8]谢永宁.微型计算机及接口技术试验指导书.安徽:安徽工程大学,2012
附录
主要代码程序:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
CONTROL EQU 43H
COUNT0 EQU 40H
COUNT1 EQU 41H
COUNT2 EQU 42H
IOCONPT EQU 0FF2BH
IOBPT EQU 0FF29H
IOAPT EQU 0FF28H
PA EQU 0FF20H ;字位口
PB EQU 0FF21H ;字形口
PC EQU 0FF22H ;键入口
ORG 18F0H
START2: JMP START1
BUF DB ?,?,?,?,?,?
KZ DB ?
LTIME DB ?
LKEY DB ?
ZP DW ?
DATA0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H
DB 86H,8EH,0FFH,0CH,89H,0DEH,0C7H,8CH,0F3H,0BFH,8FH,0F1H DATA2: DW 4545, 4050, 3607, 3405
DW 3034, 2703, 2408, 2273
START1: MOV AX,CS
MOV DS,AX
CALL BUF1
MOV AL,88H
MOV DX,IOCONPT
OUT DX,AL
MOV DX,IOBPT
MOV AL,00
OUT DX,AL
MOV ZP,OFFSET BUF
REDIKEY:CALL DISPKEY
CMP KZ,09H
JNC REDIKEY
CMP KZ,01H
JC REDIKEY
MOV BX,ZP
MOV AL,KZ
MOV [BX],AL
CMP BX,OFFSET BUF+5
JZ ZP1
INC BX
MOV ZP,BX
JMP OUTTONE
ZP1: MOV ZP,OFFSET BUF
OUTTONE:MOV DX,IOBPT
MOV AL,0FFH
OUT DX,AL
MOV AL,KZ
MOV AH,00H
DEC AX
SHL AX,1
MOV BX,OFFSET DATA2
ADD BX,AX
MOV AX,[BX]
CALL T8253
MOV CX,20H
CON1: PUSH CX
CALL DISP
POP CX
LOOP CON1
MOV DX,IOBPT
MOV AL,00
OUT DX,AL
JMP REDIKEY
T8253: PUSH AX
MOV AL, 36H ; 计数器0, 16位二进制,方式3。
MOV DX, CONTROL
OUT DX, AL
POP AX
MOV DX, COUNT1
OUT DX, AL
MOV AL, AH
OUT DX, AL
RET
DISPKEY:CALL DISP
CALL KEY
MOV AH,AL ;NEWKEY
MOV BL,LTIME ;LTIME
MOV BH,LKEY ;LKEY
MOV AL,01H
MOV DX,PA ;0FF21H
OUT DX,AL
CMP AH,BH
MOV BH,AH ;BH=NEW KEY MOV AH,BL ;AL=TIME
JZ DISK4
MOV BL,88H
MOV AH,88H
DISK4: DEC AH
CMP AH,82H
JZ DISK6
CMP AH,0EH
JZ DISK6
CMP AH,00H
JZ DISK5
MOV AH,20H
DEC BL
JMP DISK7
DISK5: MOV AH,0FH
DISK6: MOV BL,AH
MOV AH,BH
DISK7: MOV LTIME,BL
MOV LKEY,BH
MOV KZ,BH
MOV AL,AH
RET
KEY: MOV AL,0FFH
MOV DX,PB
OUT DX,AL
MOV BL,00H
MOV AH,0FEH
MOV CX,08H
KEY1: MOV AL,AH
MOV DX,PA
OUT DX,AL
ROL AL,01H
MOV AH,AL
NOP
NOP
NOP
NOP
NOP
NOP
MOV DX,PC
IN AL,DX
NOT AL
NOP
NOP
AND AL,0FH
JNZ KEY2
INC BL
LOOP KEY1
JMP NKEY
KEY2: TEST AL,01H
JE KEY3
MOV AL,00H
JMP KEY6
KEY3: TEST AL,02H
JE KEY4
MOV AL,08H
JMP KEY6
KEY4: TEST AL,04H
JE KEY5
MOV AL,10H
JMP KEY6
KEY5: TEST AL,08H
JE NKEY
MOV AL,18H
KEY6: ADD AL,BL
CMP AL,10H
JNC FKEY
MOV BL,AL
MOV BH,0H
MOV SI,OFFSET DATA2
MOV AL,[BX+SI]
RET
NKEY: MOV AL,20H
FKEY: RET
DATA1: DB 07H,04H,08H,05H,09H,06H,0AH,0BH DB 01H,00H,02H,0FH,03H,0EH,0CH,0DH
DISP: MOV AL,0FFH ;00H MOV DX,PA
OUT DX,AL
MOV CL,0DFH ;20H ;显示子程序 ,5MS MOV BX,OFFSET BUF
DIS1: MOV AL,[BX]
MOV AH,00H
PUSH BX
MOV BX,OFFSET DATA1
ADD BX,AX
MOV AL,[BX]
POP BX
MOV DX,PB
OUT DX,AL
MOV AL,CL
MOV DX,PA
OUT DX,AL
PUSH CX
DIS2: MOV CX,0A0H
LOOP $
POP CX
CMP CL,0FEH
JZ LX1
INC BX
ROR CL,1
JMP DIS1
LX1: MOV AL,0FFH
MOV DX,PB
OUT DX,AL
RET
BUF1: MOV BUF,11H
MOV BUF+1,10H
MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET CODE ENDS END START。