版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/7/31,1,第章图形与发声系统的程序设计, .1 汽车动画程序开发 .2 发声系统程序开发,开 始,2020/7/31,2,. 汽车动画程序开发, . 字符图形显示 .动画程序的开发,返回本章首页,2020/7/31,3,.1.1 字符图形显示,字符图形既可以在显示器上以简单的黑白图形字符显示,也可以在彩色显示器上以彩色的图形字符显示。通过调用INT 10H的AH=0,AL=07可设置不同的显示方式,调用INT10H的AH=09H,AH=0AH等可显示字符。,返回本节,2020/7/31,4,1动画显示的基础 2程序举例,.1.2 动画程序的开发,2020/7/31,5,在屏幕上显
2、示出动画的效果,可分5步进行: 在屏幕上显示图形(单字符或多字符图形) 延迟一个时间周期,这样图形更清晰 清除图形 改变图形的行列坐标 返回第一步,重复上述过程。,1动画显示的基础,2020/7/31,6,图.1 “汽车”各字符的相对位移量,(2,1),(0,1),(0,0),(0,3),(0,1),(0,1),(1,0),上 一 页,R,2020/7/31,7,2程序举例,例10.1 在屏幕上显示一个开动的汽车如图10.1所示。 车体由7个字符组成:R(ASC码52H) 1/2阴影符(ASC码B1H) 实心方块( ASC码DBH) 字母O( ASC码4FH ) 笑脸符( ASC码02H )
3、R和阴影反相显示,其它正常属性显示。,2020/7/31,8,源程序如下: DATA SEGMENT CAR DB 7;字符图形表 DB 52H,70H,0,0 DB 0B1H,70H,0,1 DB 0DBH,7,0,1 DB 0DBH,7,0,1 DB4FH,7,1,0 DB4FH,7,0,-3 DB2,7,-2,1 CHAR_CNTDW ? POINTER DW ? LINE_ON DB ? COL_ON DB ? DATAENDS,字符的ASCII码 显示属性 行相对位移 列相对位移,2020/7/31,9,; 程序部分 CODE SEGMENT ASSUME CS:CODE,DS:DA
4、TA MAIN PROCFAR PUSH DS SUB AX,AX PUSHAX MOV AX,DATA MOVDS,AX ;初始化DS,上 一 页,2020/7/31,10,CALL CLEAR_SCREEN LEA DI,CAR MOV DH,10 ;车身起始位置(10,10) MOV DL,10 CALL MOVE_SHAPE RET MAIN ENDP,2020/7/31,11,CLEAR_SCREEN PROC NEAR PUSH AX;保护现场 PUSH BX PUSH CX PUSH DX MOV AH,6 MOV AL,0 MOV CH,0 MOV CL,0 MOVDH,24
5、MOVDL,79 MOVBH,7 INT10H,上 一 页,BIOS功能调用:AH=6屏幕初始化 AL=上卷行数,0表示窗口空白 BH=卷入行属性 CH=左上角行号 CL=左上角列号 DH=右下角行号 DL=右下角列号,2020/7/31,12,POP DX ;恢复现场 POP CX POP BX POP AX RET ;返回主程序 CLEAR_SCREEN ENDP,上 一 页,2020/7/31,13,MOVE_SHAPE PROC NEAR PUSHAX;保护现场 PUSHBX PUSHCX PUSHDX PUSHDI MOVAH,0FH INT10H SUBCH,CH MOVCL,DI
6、;CL=7 INCDI MOVCHAR_CNT,CX;存字符个数 MOV POINTER,DI;指针指向首字符 MOVLINE_ON,DH;车起始位置 MOVCOL_ON,DL,上 一 页,2020/7/31,14,PLOT_NEXT: ADDDH,DI+2;改变行列位置 ADDDL,DI+3 CMPDL,80;出屏否? JBMOV_CRSR CALLERASE ;擦除屏幕 POP DI ;恢复现场 POP DX POP CX POPBX POP AX RET ;中断返回,上 一 页,2020/7/31,15,MOV_CRSR:MOV AH,2 ;移动光标位置 INT 10H MOV AL,D
7、I ;取字符 MOV BL,DI+1;取字符属性 PUSH CX MOV CX,1 ;显示次数 MOV AH,09 INT 10H ;显示字符 POP CX ADD DI,4 ;DI指向下一个字符 LOOP PLOT_NEXT CALL DLY_QRTR;调用延时子程序,2020/7/31,16,CALLERASE;调用擦除子程序 JMPSHORT PLOT_NEXT MOVE_SHAPE ENDP,上 一 页,2020/7/31,17,ERASE PROC NEAR MOV CX,CHAR_CNT ;字符个数 MOV DI,POINTER ;字符R地址送DI MOV DH,LINE_ON ;
8、车起始位置 MOV DL,COL_ON ERASE_NEXT: ADD DH,DI+2 ;计算显示字符的行列值 ADD DL,DI+3 MOV AH,2 INT 10H ;设置光标位置DH行,DL列,上 一 页,2020/7/31,18,MOVAL,DI MOVBL,0 ;黑底黑字 PUSHCX MOVCX,1 MOVAH,9 INT10H POPCX ADDDI,4 ;指向下一个字符 LOOP ERASE_NEXT ;擦除显示痕迹 MOVCX,CHAR_CNT ;重新初始化 MOVDI,POINTER MOVDH,LINE_ON INCCOL_ON ;指向下一行 MOVDL,COL_ON R
9、ET ERASEENDP,2020/7/31,19,DLY_QRTR PROC NEAR;延时子程序 PUSHCX PUSHDX MOVDX,5000 D11: MOVCX,2801 D12: LOOPD12 DECDX JNZD11 POPDX POPCX RET DLY_QRTR ENDP CODE ENDS END MAIN,返回本节,上 一 页,2020/7/31,20,10.2 发声系统程序开发, 10.2.1 系统发声途径 10.2.2 发声应用程序举例,返回本章首页,2020/7/31,21,10.2.1 系统发声途径,18254(8253)定时器作为发声源 28255端口B(P
10、B1位)作为发声源,返回本章首页,2020/7/31,22,18254定时器作为发声源,将定时器产生的方波信号同8255的端口B相与来控制扬声器发声的(如图10.2所示),因此当PB1=1时,才能控制扬声器的音调。在系统中8255的B口地址为61H,用指令: INAL,61H ORAL,3 OUT61H,AL,2020/7/31,23,图10.2 控制扬声器发声原理图,2020/7/31,24,ROM BIOS中的发声子程序如下: BEEPPROC NEAR MOVAL,10110110B OUT43H,AL ;给8253送控制字 MOVAX,533H OUT42H,AL MOVAL,AH O
11、UT42H,AL ;给8253B口送计数值 INAL,PORT_B ;读8255PB口 MOVAH,AL,2020/7/31,25,ORAL,03 OUTPORT_B,AL ;置8255PB1PB0=11,发声 SUBCX,CX G7:LOOPG7 ;延时 DECBL JNZG7 MOVAL,AH OUTPORT_B,AL ;恢复8255PB口原数据 RET BEEPENDP,返回本节,2020/7/31,26,28255端口B(PB1位)作为发声源,使8255端口B(或相应的等效电路)最低位PB0=0,关闭定时器声源的输出,OUT2为常高电位(方式3所致)。又通过使8255端口B(或相应等效
12、电路)的PB1位置1或置0(按指定的频率来编程),便能让“与”门输出一周期性变化的方波,使扬声器发声。,返回本节,2020/7/31,27,10.2.2 发声应用程序举例,1扬声器发声通用子程序 2演奏乐曲程序 3定时报警程序,2020/7/31,28,1扬声器发声通用子程序,【例10.2】通用发声程序GENSOUND。 PUBLICGENSOUND CODE SEGMENT PARA CODE ASSUME CS:CODE GENSOUND PROC FAR PUSH AX;保存将要用到的寄存器 PUSH BX PUSH CX PUSH DX PUSH DI,2020/7/31,29,MOV
13、AL,0B6H OUT43H,AL MOVDX,12H MOVAX,348CH DIVDI ;DI为给定频率,商AX为预置计数值 OUT42H,AL MOVAL,AH OUT42H,AL,向8253/8254计数器2写控制字,方式3、双字节写和二进制计数方式,设置被除数,给8253/8254的计数器2送计数值,先送低位,后送高位,2020/7/31,30,INAL,61H MOVAH,AL ORAL,3 OUT61H,AL WAIT1:MOV CX,2800H DELAY:LOOP DELAY DECBX ;循环持续BX次,延时为10ms的BX倍 JNZWAIT1 MOV AL,AH ;写回6
14、1H口原值,关闭扬声器 OUT61H,AL,8255PB1PB0=11 接通扬声器发声,8086/8088延时10ms,2020/7/31,31,POPDI ;恢复寄存器 POPDX POPCX POPBX POPAX RET GENSOUNDENDP CODE ENDS END,返回本节,2020/7/31,32,和CPU无关延时程序:产生N*15.08s延时:,waitf proc near push ax waitf1: in al , 61h and al , 10h cmp al , ah ;判断61H的PB4=1否? je waitf1 (15.08s延时到,PB4=1) mov
15、ah , al loop waitf1 ; CX初始值为15.08s的倍数N pop ax ret waitf endp,要产生10ms 延时, Cx=10ms/15.08s =10*103/15.08s=663,2020/7/31,33,通用发声程序Sounf :,发声10ms的BX倍: 将GENSOUND程序中的: WAIT1:MOV CX,2800H DELAY:LOOP DELAY 修改为: WAIT1 : MOV , 663 CALL WAITF,2020/7/31,34,2演奏乐曲程序,表10.1 音律与频率对应表(HZ),2020/7/31,35,音符的持续时间是根据乐曲的速度及
16、每个音符的节拍数来确定的。在4/4拍中,每小节4拍,全音符持续4拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍.如果给全音符分配1s(100*10ms),则二分音符持续时间为0.5s,四分音符持续时间为0.25s,等等。,2020/7/31,36,乐曲程序的编写步骤:,为乐曲定义一个频率表MUS_FREQ和一个节拍时间表MUS_TIME;节拍时间表中的数据是各音符的节拍持续时间相对10ms的倍数,频率表最后定义0FFFFH或-1作为结束。 将MUS_FREQ的偏移地址送SI,将MUS_TIME的偏移地址送BP,指令如下:LEA SI, MUS_FREQ LEA BP,DS: MUS_
17、TIME 从表中取出音符的频率送入DI,取出音符的持续时间送入BX 指令为:MOV DI,SI MOV BX,DS:BP 调用SOUNDF或GENSOUND子程序发出音调,2020/7/31,37,程序如下: TITLE MUSIC 乐曲“玛丽有只小羊羔” EXTRN GENSOUND:FAR ;定义外部调用程序 STACK SEGMENT PARA STACK STACK DB 64 DUP(STACK) STACK ENDS,【例10.3】以乐谱“玛丽有只小羊羔”为例编写演奏程序,2020/7/31,38,DATA SEGMENT PARA DATA ;为演奏的乐曲定义一个频率表 MUS_
18、FREQDW 330, 294, 262, 294, 3 DUP(330) DW 3 DUP(294), 330, 392, 392 ; DW 330, 294, 262, 294, 4 DUP(330) DW 294, 294, 330, 294, 262, -1 ;为演奏的乐曲定义一个节拍时间表 MUS_TIME DW 6 DUP(25), 50 DW 2 DUP(25,25,50) DW 12 DUP(25),100 DATA ENDS,2020/7/31,39,CODESEGMENTPARA CODE ASSUME CS:CODE,SS:STACK,DS:DATA MUSICPROCF
19、AR PUSHDS SUBAX,AX PUSHAX MOVAX,DATA MOVDS,AX LEASI,MUS_FREQ LEABP,DS:MUS_TIME,2020/7/31,40,FREQ: MOVDI,SI ;取音符频率 CMPDI,-1 ;结束? JE END_MUS ;是,退出 MOVBX,DS:BP;取音符持续时间 CALL GENSOUND;调用GENSOUND发音子程序 ADDSI,2 ;频率表指针增2 ADDBP,2 ;时间表指针增2 JMPFREQ ;继续演奏 END_MUS:RET ;返回DOS MUSIC ENDP CODE ENDS ENDMUSIC,2020/7/3
20、1,41,3定时报警程序,图10.3 实时钟中断处理流程图,2020/7/31,42,;利用INT 1AH中断实现定时报警,本程序在执行后,若设置成功则首先显示 ;字符串“Set up all right ”并使扬声器发声,这表明设置成功;1分钟(为定时时间, ;读者也可自己设定)后屏幕显示“!”并发声,以示报警。 ;汇编过程:MASM:ALARM.ASM ;连接过程:LINK :ALARM+GENSOUND EXTRN GENSOUND:FAR;定义外部调用程序,【例10.4】TITLE ALARM定时报警程序,2020/7/31,43,STACKSEGMENT PARA STACK STA
21、CK DB 64 DUP(STACK STACKENDS ; DATASEGMENT PARA PUBLIC DATA BJDB Set up all right . DB 13,10,$ DATA ENDS ;,2020/7/31,44,CODE SEGMENT PARA PUBLIC CODE ASSUME CS:CODE,SS:STACK,DS:DATA ENTRYPROC FAR PUSHDS;保存旧的数据段 SUBAX,AX PUSHAX MOVAX,DATA MOVDS,AX MOVAL,4AH;读取INT 4AH中断向量,上 一 页,2020/7/31,45,MOVAH,35H
22、INT 21H PUSHES;入栈保护 PUSHBX STEP1:MOV AH,7;清除实时钟报警 INT1AH JCSTEP1;进位位为1则转移(成功则转移) ; MOVAL,4AH;设置新的INT 4AH中断向量 MOVDX,SEG ALARM MOVDS,DX,上 一 页,2020/7/31,46,LEADX,ALARM MOVAH,25H INT21H CLI;关中断 STEP2:MOVAH,2;利用INT 1AH读当前实时钟时间 INT1AH;时、分、秒分别置入CH、CL、DH JCSTEP2;不成功再读 MOVAL,CL ADDAL,1;增1分钟 DAA;调整为BCD码格式 CMP
23、AL,60H;是60分吗(BCD数)?,上 一 页,2020/7/31,47,JLSTEP3;不是,则转移 MOVAL,00H;是,改为0分 STEP3:MOV CL,AL;得到报警时刻的分值 MOVAH,6;CH、DH仍为原值 INT1AH;设置报警时刻 JCSTEP2;不成功重做 STI;开中断 MOVCX,12 SETUP:MOV AH,2;设置成功发出“嘟嘟”声,上 一 页,2020/7/31,48,MOVDL,07H;07H是振铃控制码 INT21H;用INT 21H 的2号功能实现 LOOPSETUP;循环发声 MOVAX,DATA MOVDS,AX MOVDX,OFFSET BJ
24、;显示“Set up all right .”字符串 MOVAH,9 INT21H ;,上 一 页,2020/7/31,49,MOVDX,32000 MAINP1:MOV CX,25500;延时程序段,等待报警 MAINP2:LOOPMAINP2 DECDX JNEMAINP1 RES:POPDX;恢复INT 4AH 原中断向量 POPDS MOVAL,4AH MOVAH,35H,上 一 页,2020/7/31,50,INT21H RET ENTRYENDP ; ALARMPROC;报警中断服务程序 PUSHAX PUAHBX PUSHDI STI MOVAH,2;显示字符! MOVDL,!
25、INT21H,上 一 页,2020/7/31,51,MOVDI,300;发音频率 MOVBX,1400;发音延迟时间 CALLGENSOUND;调用通用发声子程序 POPDI POPBX POPAX IRET ALARMENDP CODEENDS ; ENDENTRY;程序结束,上 一 页,2020/7/31,52,【例10.5】用软中断INT 60H、发声中断服务程序INT 61H以及软中断INT 62H、 INT 63H ,实现字符串“intel 80486 DX2/66 CPU”显示、扬声器发声和变色三角形的显示功能,定时器ICH中断作为计数器使用。,DATASEGMENT PARA D
26、ATA;数据段 D1DB 0DH,intel 80486 DX2/66 CPU $ D3DW 0 D20DB ? DATAENDS ;,2020/7/31,53,STACSEGMENT PARA STACK STAC;堆栈段 STA1DW 100 DUP(?) STACENDS ; CODESEGMENT PARA CODE;代码段 ASSUME CS:CODE,DS:DATA ASSUME SS:STAC,ES:DATA STARPROCFAR;主程序开始,上 一 页,2020/7/31,54,PUSHDS XOR AX,AX PUSHAX MOV AX,DATA MOVDS,AX MOVE
27、S,AX CLI;关中断 MOVAL,1CH;保存定时器时钟中断向量 MOVAH,35H INT21H PUSHES,上 一 页,2020/7/31,55,PUSHBX PUSHDS MOVDX,OFFSET RING;设置定时器时钟中断向量 MOVAX,SEG RING MOVDS,AX MOVAL,1CH MOVAH,25H INT21H POPDS INAL,21H;读IMR中的屏蔽码,上 一 页,2020/7/31,56,ANDAL,1111110B;开放中断0并保留中断屏蔽设置 OUT21H,AL;将新屏蔽码写入IMR中 PUSHDS;入栈保护DS寄存器 MOVDX,OFFSET I
28、60;取I60的偏移地址 MOVAX,SEG I60;取I60的段基地址 MOVDS,AX MOVAH,25H MOVAL,60H INT21H,上 一 页,2020/7/31,57,LEADX,I61;设置61H软中断向量 MOVAX,SEG I61 MOVDS,AX MOVAH, 25H MOVAL,61H INT21H LEADX,I62;设置62H软中断向量 MOVAX,SEG I62 MOVDS,AX,上 一 页,2020/7/31,58,MOVAH,25H MOVAL,62H INT21H LEADX,I63;设置63H软中断向量 MOVAX,SEG I63 MOVDS,AX MO
29、VAH,25H MOVAL,63H INT21H POPDS;DS出栈 STI;开中断 MOVDI,8000,上 一 页,2020/7/31,59,DELAY:MOVSI,150 INT60H;调用60H中断,使程序进入 DELAY1:DECSI;循环状态 JNZDELAY1 DECDI JNZDELAY POPDX;恢复定时器控制(ICH)中断向量 POPDS MOVAL,1CH MOVAH,25H INT21H MOVAH, 0;显示器恢复文本状态,上 一 页,2020/7/31,60,MIVAL,3 INT 10H RET STARENDP ; RINGPROCFAR;定时器中断服务程序
30、 PUSHDS PUSHAX MOVAX,DATA MOVDS,AX STI INCD20;计数单元加1,上 一 页,2020/7/31,61,B11:POP AX POPDS IRET;中断服务结束返回 RINGENDP ; I60PROCFAR;60H中断服务程序完成对 PUSHAX;61H和62H中断的调用 PUSHDX LEADX,D1;显示intel 80486 DX,上 一 页,2020/7/31,62,2/66 CPU MOVAH,9 INT21H CMPD20,2;中断延时到否? JNEC11;到,则转置C11 MOVD20,0;否则使D20清0 INT61H;用发声中断INT 61H INT62H;用延时绘图中断INT 62H C11:POPDX POPAX,上 一 页,2020/7/31,63,IRET;中断服务结束返回 I60ENDP ; I61PROCFAR;声中断:INT 61H PUSHAX PUSHCX PUSHDX MOVDX,140H;置发音持续时间 INAL,61H;8255A PB 口内容到AL ANDAL,11111100B;L的D1D0位置0,上 一 页,2020/7/31
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届广西壮族自治区贵港市高三一模英语试卷
- 护理管理进修项目执行汇报
- 妇科护理服务评估
- 2026年4月15日福建省直遴选面试真题及答案解析(下午卷)
- 第10课 计数循环我在行教学设计初中信息技术鲁教版新版2018第4册-鲁教版2018
- 第九课 不完美也是一种美教学设计小学心理健康六年级鄂科版
- 高中数学1.1 正弦定理教案设计
- 2026广东广州花都城投铁工建设工程有限公司第一次招聘7人笔试历年参考题库附带答案详解
- 2026山西吕梁交口县文化旅游投资开发有限公司招聘工作人员笔试历年参考题库附带答案详解
- 第9课 新文化运动和马克思主义的传播教学设计高中历史北师大版2010必修3-北师大版2010
- 2022年广州市交通发展年度报告
- 煤矿班组长培训课件
- 多器官功能障碍综合征(MODS)
- 《唐诗三百首》导读课(二稿)
- 【5套打包】兰州市小学五年级数学下期中考试单元检测试题(含答案解析)
- 重卡结构解析图
- 安踏集团零售管理培训手册定
- 职场小白快速读懂财务三张报表
- 《我参与 我奉献》第4课时示范公开课教学PPT课件【道德与法治五年级下册】
- 2021-2022中国滑雪产业白皮书
- GB/T 5974.1-2006钢丝绳用普通套环
评论
0/150
提交评论