八音盒.docx
《八音盒.docx》由会员分享,可在线阅读,更多相关《八音盒.docx(21页珍藏版)》请在冰豆网上搜索。
八音盒
华北科技学院
课程设计说明书
班级:
计科ZB111姓名:
王科
学号:
201107012104
设计题目:
八音盒
设计时间:
2012-6-4至2012-6-14
指导教师:
于咏霞、顾涛、吴静、孟广学
评语:
___________________________________
____________________________________________
____________________________________________
____________________________________________
____________________________________________
评阅成绩:
____评阅教师:
________
《接口技术》课程设计实验报告
开课实验室:
接口实验室2012年6月12日
课程设计题目
八音盒
一、
设计目的
◆了解键盘阵列结构,学会读取按键的方法
◆了解利用8254和8255产生音乐的基本方法。
◆掌握定时/计数器8254和8255芯片的编程原理。
◆通过8254产生不同的频率信号,,在实验平台上实现各个音阶发声。
二、设备与环境
◆硬件环境:
微机、TPC-386EM32位微机接口实验系统。
◆软件环境:
WindowsXP操作系统、汇编程序集成开发环境
三、设计内容
(一)、设计目标
通过按下实验台小键盘上的键码,对应的7段数码管显示‘0’—‘F’,PC机的屏幕上也对应显示出‘0’—‘F’。
并且小键盘每个键码都有自己的功能,比如数字‘1’-‘9’能发出单音,字母‘A’—‘E’播放歌曲,字母‘F’退出整个系统。
(二)实验原理图
1.8255芯片连接图
8255的C口接实验台小键盘(8255的PC0~PC3接小键盘的列0~列3,PC4~PC7接行0~行3)。
2.七段数码管字形代码表
显示字形
g
f
e
d
c
b
a
断码
0
0
1
1
1
1
1
1
3fh
1
0
0
0
0
1
1
0
06h
2
1
0
1
1
0
1
1
5bh
3
1
0
0
0
1
1
1
4fh
4
1
1
0
0
1
1
0
66h
5
1
1
0
1
1
0
1
6dh
6
1
1
1
1
1
0
1
7dh
7
0
0
0
0
1
1
1
07h
8
1
1
1
1
1
1
1
7fh
9
1
1
0
1
1
1
1
6fh
A
1
1
1
0
1
1
1
77h
B
1
1
1
1
1
0
0
7ch
C
0
1
1
1
0
0
1
3bh
D
1
0
1
1
1
1
0
5eh
E
1
1
1
1
0
0
1
7bh
F
1
1
1
0
0
0
1
71h
3.8255和8254组合发音的接线图
4.小键盘设计
众所周知,“哆瑞咪发嗦啦西”是组成所有音乐最基本的音调。
实验台上共有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F十六个键码,我利用数字键0作为开始键,只在数码管和PC屏幕上显示其字形;而数字键1-7,每个键发出一个单音,而8和9键发出了两个高调单音,这样通过这9个单音键就基本能弹出简单的音乐了;后面的字母A-E就是上述单音组成的几首好听的儿歌;字母F控制整个程序结束!
具体每个键对应的功能如下图所示:
四、程序流程图
1.主程序流程图
2.小键盘扫描流程图
3.音乐发声流程图
四、实物接线图
8255的片选CS接地址译码输出的288~28F,A口PA0~PA7接七段数码管a~g,C口接小键盘(8255的PC0~PC3接小键盘的列0~列3,PC4~PC7接行0~行3);8254CLK0接1MHZ时钟,GATE0接8255的PB1,OUT0接与门输入端1,片选CS接280H~287H,8255PB0接与门输入端2,与门输出端接喇叭。
8255的A口地址为288h,8255的B口地址为289h,8255的C口地址为8ah,8255的控制口地址为28bh,8254的A口地址为280h,8254的B口地址为283h。
五、设计结果
1.小键盘所有键(0123456789ABCDEF)依次按下,PC机屏幕显示结果:
2.小键盘单个键按下,数码管显示结果:
六、程序代码
;*******************************;
;*八音盒*;
;*******************************;
datasegment
aio8255equ288h;A口
bio8255equ289h;B口
cio8255equ28ah;C口
kio8255equ28bh;控制口
io8253aequ280h
io8253bequ283h
table1dw0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
dw07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h;键盘扫描码表
leddb3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH
db39h,5EH,79h,71h,0ffh;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
chardb'0123456789ABCDEF';字符表
mesdb0ah,0dh,'****************************************'
db0ah,0dh,'*Playanykeyinthesmallkeyboard!
*'
db0ah,0dh,'*Itwillbeonthescreen!
*'
db0ah,0dh,'*StrikeF,itwillgameover!
*'
db0ah,0dh,'****************************************',0ah,0dh,'$'
key_indb0h
kydb0h
bzdb0h
tabledw524,588,660,698,784,880,988,1048,1976;哆来咪
Atabledw524,524,524,660,784,784,784,784,880,880,880,1048,784;我有一只小毛驴
Btabledw524,588,660,524,524,588,660,524,660,698,784,660,698,784;两只老虎
Ctabledw524,524,660,698,784,784,784,660,698,698,698,588,524,660,784,1048;洋娃娃和小熊跳舞
Dtabledw660,660,698,784,784,698,660,588,524,524,588,660,660,588,588;欢乐颂
Etabledw660,698,784,698,660,698,784,698,660,698,784,698,784,1320,1048;可爱的蓝精灵
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,offsetmes
movah,9
int21h;显示提示信息
movdx,kio8255;初始化8255控制字
moval,81h
outdx,al
main_key:
callkey;getacharin(key_in)anddisplayit
calldisply;调显示子程序,显示得到的字符
moval,byteptrkey_in
cmpal,'F'
jzexit
cmpal,'0'
jzmain_key
jmpm
exit:
movax,4c00h;if(dl)='F'returntoEXIT!
int21h;退出
m:
cmpal,'1'
jlsing1
cmpal,'9'
jgsing1;若不在'1'-'8'之间转main_key
ddd:
subal,31h
shlal,1;转为查表偏移量
movbl,al;保存偏移到bx
movbh,0
movax,4240H;计数初值=1000000/频率,保存到AX
movdx,0FH
divwordptr[table+bx]
movbx,ax
movdx,io8253b;设置8254计时器0方式3,先读写低字节,再读写高字节
moval,00110110B
outdx,al
movdx,io8253a
movax,bx
outdx,al;写计数初值低字节
moval,ah
outdx,al;写计数初值高字节
movdx,bio8255
moval,03h
outdx,al;置PB1PB0=11(开扬声器)
calldelay3;延时
moval,0h
outdx,al;置PB1PB0=00(关扬声器)
jmpmain_key
sing1:
cmpal,'A'
jzAsing
cmpal,'B'
jzBsing
cmpal,'C'
jzCsing
cmpal,'D'
jzDsing
cmpal,'E'
jzEsing
Asing:
movbz,0
movcx,13
subal,41h
shlal,1;转为查表偏移量
movbl,al;保存偏移到bx
movbh,0
a:
movax,4240H;计数初值=1000000/频率,保存到AX
movdx,0FH
divwordptr[Atable+bx]
movbx,ax
jmps
Bsing:
movbz,0
movcx,14
subal,42h
shlal,1;转为查表偏移量
movbl,al;保存偏移到bx
movbh,0
b:
movax,4240H;计数初值=1000000/频率,保存到AX
movdx,0FH
divwordptr[Btable+bx]
movbx,ax
jmps
Csing:
movbz,0
movcx,15
subal,43h
shlal,1;转为查表偏移量
movbl,al;保存偏移到bx
movbh,0
c:
movax,4240H;计数初值=1000000/频率,保存到AX
movdx,0FH
divwordptr[Ctable+bx]
movbx,ax
jmps
Dsing:
movbz,0
movcx,15
subal,44h
shlal,1;转为查表偏移量
movbl,al;保存偏移到bx
movbh,0
d:
movax,4240H;计数初值=1000000/频率,保存到AX
movdx,0FH
divwordptr[Dtable+bx]
movbx,ax
jmps
Esing:
movbz,0
movcx,15
subal,45h
shlal,1;转为查表偏移量
movbl,al;保存偏移到bx
movbh,0
e:
movax,4240H;计数初值=1000000/频率,保存到AX
movdx,0FH
divwordptr[Etable+bx]
movbx,ax
jmps
s:
movdx,io8253b;设置8254计时器0方式3,先读写低字节,再读写高字节
moval,00110110B
outdx,al
movdx,io8253a
movax,bx
outdx,al;写计数初值低字节
moval,ah
outdx,al;写计数初值高字节
movdx,bio8255
moval,03h
outdx,al;置PB1PB0=11(开扬声器)
calldelay3;延时
moval,0h
outdx,al;置PB1PB0=00(关扬声器)
addbz,2
movbl,bz
movbh,0
cmpbyteptrkey_in,'A'
jzaa
cmpbyteptrkey_in,'B'
jzbb
cmpbyteptrkey_in,'C'
jzcc
cmpbyteptrkey_in,'D'
jzdd1
cmpbyteptrkey_in,'E'
jzee
aa:
loopL1
jmpmain_key
bb:
loopL2
jmpmain_key
cc:
loopL3
jmpmain_key
dd1:
loopL4
jmpmain_key
ee:
loopL5
jmpmain_key
L1:
calln1
L2:
calln2
L3:
calln3
L4:
calln4
L5:
calln5
keyprocnear
key_loop:
movdx,cio8255
moval,0fh
outdx,al
inal,dx;读行扫描值
andal,0fh
cmpal,0fh
jzkey_loop;未发现有键按下则转
calldelay;delayforamoment
movah,al
movdx,kio8255
moval,88h
outdx,al
movdx,cio8255
moval,ah
oral,0f0h
outdx,al
inal,dx;读列扫描值
andal,0f0h
cmpal,0f0h
jzkey_loop;未发现有键按下则转
movsi,offsettable1;键盘扫描码表首址
movdi,offsetchar;字符表首址
movcx,16;待查表的表大小
key_tonext:
cmpax,[si];cmp(col,row)witheveryword
jzkey_findkey;inthetable
deccx
jzkey_loop;未找到对应扫描码
addsi,2
incdi
jmpkey_tonext
key_findkey:
movdl,[di]
movah,02
int21h;显示查找到的键盘码
movbyteptrkey_in,dl
key_waitup:
movdx,kio8255
moval,81h
outdx,al
movdx,cio8255
moval,0fh
outdx,al
inal,dx;读行扫描值
andal,0fh
cmpal,0fh
jnzkey_waitup;按键未抬起转
calldelay;delayforamoment
keyendp
delayprocnear
pushax;delay50ms--100ms
movah,0
int1ah
movbx,dx
delay1:
movah,0
int1ah
cmpbx,dx
jzdelay1
movbx,dx
delay2:
movah,0
int1ah
cmpbx,dx
jzdelay2
popax
ret
delayendp
displyprocnear
pushax
movbx,offsetled
moval,byteptrkey_in
subal,30h
cmpal,09h
jngdis2
subal,07h
dis2:
xlat
movdx,aio8255
outdx,al;输出显示数据,段码
popax
displyendp
delay3procnear;延时子程序
pushcx
pushax
movax,60
x1:
movcx,0ffffh
x2:
deccx
jnzx2
decax
jnzx1
popax
popcx
ret
delay3endp
n1procnear
jmpa
n1endp
n2procnear
jmpb
n2endp
n3procnear
jmpc
n3endp
n4procnear
jmpd
n4endp
n5procNEAR
jmpe
n5endp
codeends
endstart
七、设计总结
通过这次接口技术课程设计,不仅使我复习了以前所学过的知识,而且也使我有目标性的学习了课堂未曾讲过的知识,把这些都结合起来,我便完成了在学过的知识上扩展出了其他功能的八音盒。
我的八音盒主要通过计数器8254、可编程并行接口芯片8255A、小键盘实现了其功能。
具体功能是定时/计数器8254作为音阶频率发生器,对每一段音乐进行编码后存入一张音乐表,程序中可调用每一张音乐表中的歌曲,再通过与可编程并行接口芯片8255的配合,将发声频率输出到实验平台的喇叭上,这样喇叭就发出了美妙动听的音乐;接下来通过对可编程并行接口芯片8255A的编程,采用行扫描法和行翻转法,程序中将小键盘的各个键对应的代码(列值,行值)放在一个表中,程序通过查表来确定具体按下的为哪一个键,便实现了实验台上小键盘的扫描功能和七段数码管的显示字形;另外,在程序中还放置了一个放键盘所有数据的字符表,实现了PC机屏幕的回显字符。
在整个课程设计中,我觉得最让我苦恼的和耗时最多的是开始的设计阶段。
当脑海中有了整个设计的目标时,一切操作就容易多了。
在遇到障碍事,老师们和同学们都给了很多意见和帮助,这对我完成本次课设起到了很大的帮助。
在此,特别感谢老师们和同学们,八音盒里动听的音符都是为你们演奏!