




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020/5/1,1,第章图形与发声系统的程序设计,.1汽车动画程序开发.2发声系统程序开发,开始,2020/5/1,2,.汽车动画程序开发,.字符图形显示.动画程序的开发,返回本章首页,2020/5/1,3,.1.1字符图形显示,字符图形既可以在显示器上以简单的黑白图形字符显示,也可以在彩色显示器上以彩色的图形字符显示。通过调用INT10H的AH=0,AL=07可设置不同的显示方式,调用INT10H的AH=09H,AH=0AH等可显示字符。,返回本节,2020/5/1,4,1动画显示的基础2程序举例,.1.2动画程序的开发,2020/5/1,5,在屏幕上显示出动画的效果,可分5步进行:在屏幕上显示图形(单字符或多字符图形)延迟一个时间周期,这样图形更清晰清除图形改变图形的行列坐标返回第一步,重复上述过程。,1动画显示的基础,2020/5/1,6,图.1“汽车”各字符的相对位移量,(2,1),(0,1),(0,0),(0,3),(0,1),(0,1),(1,0),上一页,R,2020/5/1,7,2程序举例,例10.1在屏幕上显示一个开动的汽车如图10.1所示。车体由7个字符组成:R(ASC码52H)1/2阴影符(ASC码B1H)实心方块(ASC码DBH)字母O(ASC码4FH)笑脸符(ASC码02H)R和阴影反相显示,其它正常属性显示。,2020/5/1,8,源程序如下:DATASEGMENTCARDB7;字符图形表DB52H,70H,0,0DB0B1H,70H,0,1DB0DBH,7,0,1DB0DBH,7,0,1DB4FH,7,1,0DB4FH,7,0,-3DB2,7,-2,1CHAR_CNTDW?POINTERDW?LINE_ONDB?COL_ONDB?DATAENDS,字符的ASCII码显示属性行相对位移列相对位移,2020/5/1,9,;程序部分CODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AX;初始化DS,上一页,2020/5/1,10,CALLCLEAR_SCREENLEADI,CARMOVDH,10;车身起始位置(10,10)MOVDL,10CALLMOVE_SHAPERETMAINENDP,2020/5/1,11,CLEAR_SCREENPROCNEARPUSHAX;保护现场PUSHBXPUSHCXPUSHDXMOVAH,6MOVAL,0MOVCH,0MOVCL,0MOVDH,24MOVDL,79MOVBH,7INT10H,上一页,BIOS功能调用:AH=6屏幕初始化AL=上卷行数,0表示窗口空白BH=卷入行属性CH=左上角行号CL=左上角列号DH=右下角行号DL=右下角列号,2020/5/1,12,POPDX;恢复现场POPCXPOPBXPOPAXRET;返回主程序CLEAR_SCREENENDP,上一页,2020/5/1,13,MOVE_SHAPEPROCNEARPUSHAX;保护现场PUSHBXPUSHCXPUSHDXPUSHDIMOVAH,0FHINT10HSUBCH,CHMOVCL,DI;CL=7INCDIMOVCHAR_CNT,CX;存字符个数MOVPOINTER,DI;指针指向首字符MOVLINE_ON,DH;车起始位置MOVCOL_ON,DL,上一页,2020/5/1,14,PLOT_NEXT:ADDDH,DI+2;改变行列位置ADDDL,DI+3CMPDL,80;出屏否?JBMOV_CRSRCALLERASE;擦除屏幕POPDI;恢复现场POPDXPOPCXPOPBXPOPAXRET;中断返回,上一页,2020/5/1,15,MOV_CRSR:MOVAH,2;移动光标位置INT10HMOVAL,DI;取字符MOVBL,DI+1;取字符属性PUSHCXMOVCX,1;显示次数MOVAH,09INT10H;显示字符POPCXADDDI,4;DI指向下一个字符LOOPPLOT_NEXTCALLDLY_QRTR;调用延时子程序,2020/5/1,16,CALLERASE;调用擦除子程序JMPSHORTPLOT_NEXTMOVE_SHAPEENDP,上一页,2020/5/1,17,ERASEPROCNEARMOVCX,CHAR_CNT;字符个数MOVDI,POINTER;字符R地址送DIMOVDH,LINE_ON;车起始位置MOVDL,COL_ONERASE_NEXT:ADDDH,DI+2;计算显示字符的行列值ADDDL,DI+3MOVAH,2INT10H;设置光标位置DH行,DL列,上一页,2020/5/1,18,MOVAL,DIMOVBL,0;黑底黑字PUSHCXMOVCX,1MOVAH,9INT10HPOPCXADDDI,4;指向下一个字符LOOPERASE_NEXT;擦除显示痕迹MOVCX,CHAR_CNT;重新初始化MOVDI,POINTERMOVDH,LINE_ONINCCOL_ON;指向下一行MOVDL,COL_ONRETERASEENDP,2020/5/1,19,DLY_QRTRPROCNEAR;延时子程序PUSHCXPUSHDXMOVDX,5000D11:MOVCX,2801D12:LOOPD12DECDXJNZD11POPDXPOPCXRETDLY_QRTRENDPCODEENDSENDMAIN,返回本节,上一页,2020/5/1,20,10.2发声系统程序开发,10.2.1系统发声途径10.2.2发声应用程序举例,返回本章首页,2020/5/1,21,10.2.1系统发声途径,18254(8253)定时器作为发声源28255端口B(PB1位)作为发声源,返回本章首页,2020/5/1,22,18254定时器作为发声源,将定时器产生的方波信号同8255的端口B相与来控制扬声器发声的(如图10.2所示),因此当PB1=1时,才能控制扬声器的音调。在系统中8255的B口地址为61H,用指令:INAL,61HORAL,3OUT61H,AL,2020/5/1,23,图10.2控制扬声器发声原理图,2020/5/1,24,ROMBIOS中的发声子程序如下:BEEPPROCNEARMOVAL,10110110BOUT43H,AL;给8253送控制字MOVAX,533HOUT42H,ALMOVAL,AHOUT42H,AL;给8253B口送计数值INAL,PORT_B;读8255PB口MOVAH,AL,2020/5/1,25,ORAL,03OUTPORT_B,AL;置8255PB1PB0=11,发声SUBCX,CXG7:LOOPG7;延时DECBLJNZG7MOVAL,AHOUTPORT_B,AL;恢复8255PB口原数据RETBEEPENDP,返回本节,2020/5/1,26,28255端口B(PB1位)作为发声源,使8255端口B(或相应的等效电路)最低位PB0=0,关闭定时器声源的输出,OUT2为常高电位(方式3所致)。又通过使8255端口B(或相应等效电路)的PB1位置1或置0(按指定的频率来编程),便能让“与”门输出一周期性变化的方波,使扬声器发声。,返回本节,2020/5/1,27,10.2.2发声应用程序举例,1扬声器发声通用子程序2演奏乐曲程序3定时报警程序,2020/5/1,28,1扬声器发声通用子程序,【例10.2】通用发声程序GENSOUND。PUBLICGENSOUNDCODESEGMENTPARACODEASSUMECS:CODEGENSOUNDPROCFARPUSHAX;保存将要用到的寄存器PUSHBXPUSHCXPUSHDXPUSHDI,2020/5/1,29,MOVAL,0B6HOUT43H,ALMOVDX,12HMOVAX,348CHDIVDI;DI为给定频率,商AX为预置计数值OUT42H,ALMOVAL,AHOUT42H,AL,向8253/8254计数器2写控制字,方式3、双字节写和二进制计数方式,设置被除数,给8253/8254的计数器2送计数值,先送低位,后送高位,2020/5/1,30,INAL,61HMOVAH,ALORAL,3OUT61H,ALWAIT1:MOVCX,2800HDELAY:LOOPDELAYDECBX;循环持续BX次,延时为10ms的BX倍JNZWAIT1MOVAL,AH;写回61H口原值,关闭扬声器OUT61H,AL,8255PB1PB0=11接通扬声器发声,8086/8088延时10ms,2020/5/1,31,POPDI;恢复寄存器POPDXPOPCXPOPBXPOPAXRETGENSOUNDENDPCODEENDSEND,返回本节,2020/5/1,32,和CPU无关延时程序:产生N*15.08s延时:,waitfprocnearpushaxwaitf1:inal,61handal,10hcmpal,ah;判断61H的PB4=1否?jewaitf1(15.08s延时到,PB4=1)movah,alloopwaitf1;CX初始值为15.08s的倍数Npopaxretwaitfendp,要产生10ms延时,Cx=10ms/15.08s=10*103/15.08s=663,2020/5/1,33,通用发声程序Sounf:,发声10ms的BX倍:将GENSOUND程序中的:WAIT1:MOVCX,2800HDELAY:LOOPDELAY修改为:WAIT1:MOV,663CALLWAITF,2020/5/1,34,2演奏乐曲程序,表10.1音律与频率对应表(HZ),2020/5/1,35,音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的。在4/4拍中,每小节4拍,全音符持续4拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍.如果给全音符分配1s(100*10ms),则二分音符持续时间为0.5s,四分音符持续时间为0.25s,等等。,2020/5/1,36,乐曲程序的编写步骤:,为乐曲定义一个频率表MUS_FREQ和一个节拍时间表MUS_TIME;节拍时间表中的数据是各音符的节拍持续时间相对10ms的倍数,频率表最后定义0FFFFH或-1作为结束。将MUS_FREQ的偏移地址送SI,将MUS_TIME的偏移地址送BP,指令如下:LEASI,MUS_FREQLEABP,DS:MUS_TIME从表中取出音符的频率送入DI,取出音符的持续时间送入BX指令为:MOVDI,SIMOVBX,DS:BP调用SOUNDF或GENSOUND子程序发出音调,2020/5/1,37,程序如下:TITLEMUSIC乐曲“玛丽有只小羊羔”EXTRNGENSOUND:FAR;定义外部调用程序STACKSEGMENTPARASTACKSTACKDB64DUP(STACK)STACKENDS,【例10.3】以乐谱“玛丽有只小羊羔”为例编写演奏程序,2020/5/1,38,DATASEGMENTPARADATA;为演奏的乐曲定义一个频率表MUS_FREQDW330,294,262,294,3DUP(330)DW3DUP(294),330,392,392;DW330,294,262,294,4DUP(330)DW294,294,330,294,262,-1;为演奏的乐曲定义一个节拍时间表MUS_TIMEDW6DUP(25),50DW2DUP(25,25,50)DW12DUP(25),100DATAENDS,2020/5/1,39,CODESEGMENTPARACODEASSUMECS:CODE,SS:STACK,DS:DATAMUSICPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEASI,MUS_FREQLEABP,DS:MUS_TIME,2020/5/1,40,FREQ:MOVDI,SI;取音符频率CMPDI,-1;结束?JEEND_MUS;是,退出MOVBX,DS:BP;取音符持续时间CALLGENSOUND;调用GENSOUND发音子程序ADDSI,2;频率表指针增2ADDBP,2;时间表指针增2JMPFREQ;继续演奏END_MUS:RET;返回DOSMUSICENDPCODEENDSENDMUSIC,2020/5/1,41,3定时报警程序,图10.3实时钟中断处理流程图,2020/5/1,42,;利用INT1AH中断实现定时报警,本程序在执行后,若设置成功则首先显示;字符串“Setupallright”并使扬声器发声,这表明设置成功;1分钟(为定时时间,;读者也可自己设定)后屏幕显示“!”并发声,以示报警。;汇编过程:MASM:ALARM.ASM;连接过程:LINK:ALARM+GENSOUNDEXTRNGENSOUND:FAR;定义外部调用程序,【例10.4】TITLEALARM定时报警程序,2020/5/1,43,STACKSEGMENTPARASTACKSTACKDB64DUP(STACKSTACKENDS;DATASEGMENTPARAPUBLICDATABJDBSetupallright.DB13,10,$DATAENDS;,2020/5/1,44,CODESEGMENTPARAPUBLICCODEASSUMECS:CODE,SS:STACK,DS:DATAENTRYPROCFARPUSHDS;保存旧的数据段SUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAL,4AH;读取INT4AH中断向量,上一页,2020/5/1,45,MOVAH,35HINT21HPUSHES;入栈保护PUSHBXSTEP1:MOVAH,7;清除实时钟报警INT1AHJCSTEP1;进位位为1则转移(成功则转移);MOVAL,4AH;设置新的INT4AH中断向量MOVDX,SEGALARMMOVDS,DX,上一页,2020/5/1,46,LEADX,ALARMMOVAH,25HINT21HCLI;关中断STEP2:MOVAH,2;利用INT1AH读当前实时钟时间INT1AH;时、分、秒分别置入CH、CL、DHJCSTEP2;不成功再读MOVAL,CLADDAL,1;增1分钟DAA;调整为BCD码格式CMPAL,60H;是60分吗(BCD数)?,上一页,2020/5/1,47,JLSTEP3;不是,则转移MOVAL,00H;是,改为0分STEP3:MOVCL,AL;得到报警时刻的分值MOVAH,6;CH、DH仍为原值INT1AH;设置报警时刻JCSTEP2;不成功重做STI;开中断MOVCX,12SETUP:MOVAH,2;设置成功发出“嘟嘟”声,上一页,2020/5/1,48,MOVDL,07H;07H是振铃控制码INT21H;用INT21H的2号功能实现LOOPSETUP;循环发声MOVAX,DATAMOVDS,AXMOVDX,OFFSETBJ;显示“Setupallright.”字符串MOVAH,9INT21H;,上一页,2020/5/1,49,MOVDX,32000MAINP1:MOVCX,25500;延时程序段,等待报警MAINP2:LOOPMAINP2DECDXJNEMAINP1RES:POPDX;恢复INT4AH原中断向量POPDSMOVAL,4AHMOVAH,35H,上一页,2020/5/1,50,INT21HRETENTRYENDP;ALARMPROC;报警中断服务程序PUSHAXPUAHBXPUSHDISTIMOVAH,2;显示字符!MOVDL,!INT21H,上一页,2020/5/1,51,MOVDI,300;发音频率MOVBX,1400;发音延迟时间CALLGENSOUND;调用通用发声子程序POPDIPOPBXPOPAXIRETALARMENDPCODEENDS;ENDENTRY;程序结束,上一页,2020/5/1,52,【例10.5】用软中断INT60H、发声中断服务程序INT61H以及软中断INT62H、INT63H,实现字符串“intel80486DX2/66CPU”显示、扬声器发声和变色三角形的显示功能,定时器ICH中断作为计数器使用。,DATASEGMENTPARADATA;数据段D1DB0DH,intel80486DX2/66CPU$D3DW0D20DB?DATAENDS;,2020/5/1,53,STACSEGMENTPARASTACKSTAC;堆栈段STA1DW100DUP(?)STACENDS;CODESEGMENTPARACODE;代码段ASSUMECS:CODE,DS:DATAASSUMESS:STAC,ES:DATASTARPROCFAR;主程序开始,上一页,2020/5/1,54,PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXCLI;关中断MOVAL,1CH;保存定时器时钟中断向量MOVAH,35HINT21HPUSHES,上一页,2020/5/1,55,PUSHBXPUSHDSMOVDX,OFFSETRING;设置定时器时钟中断向量MOVAX,SEGRINGMOVDS,AXMOVAL,1CHMOVAH,25HINT21HPOPDSINAL,21H;读IMR中的屏蔽码,上一页,2020/5/1,56,ANDAL,1111110B;开放中断0并保留中断屏蔽设置OUT21H,AL;将新屏蔽码写入IMR中PUSHDS;入栈保护DS寄存器MOVDX,OFFSETI60;取I60的偏移地址MOVAX,SEGI60;取I60的段基地址MOVDS,AXMOVAH,25HMOVAL,60HINT21H,上一页,2020/5/1,57,LEADX,I61;设置61H软中断向量MOVAX,SEGI61MOVDS,AXMOVAH,25HMOVAL,61HINT21HLEADX,I62;设置62H软中断向量MOVAX,SEGI62MOVDS,AX,上一页,2020/5/1,58,MOVAH,25HMOVAL,62HINT21HLEADX,I63;设置63H软中断向量MOVAX,SEGI63MOVDS,AXMOVAH,25HMOVAL,63HINT21HPOPDS;DS出栈STI;开中断MOVDI,8000,上一页,2020/5/1,59,DELAY:MOVSI,150INT60H;调用60H中断,使程序进入DELAY1:DECSI;循环状态JNZDELAY1DECDIJNZDELAYPOPDX;恢复定时器控制(ICH)中断向量POPDSMOVAL,1CHMOVAH,25HINT21HMOVAH,0;显示器恢复文本状态,上一页,2020/5/1,60,MIVAL,3INT10HRETSTARENDP;RINGPROCFAR;定时器中断服务程序PUSHDSPUSHAXMOVAX,DATAMOVDS,AXSTIINCD20;计数单元加1,上一页,2020/5/1,61,B11:POPAXPOPDSIRET;中断服务结束返回RINGENDP;I60PROCFAR;60H中断服务程序完成对PUSHAX;61H和62H中断的调用PUSHDXLEADX,D1;显示intel80486DX,上一页,2020/5/1,62,2/66CPUMOVAH,9INT21HCMPD20,2;中断延时到否?JNEC11;到,则转置C11MOVD20,0;否则使D20清0INT61H;用发声中断INT61HINT62H;用延时绘图中断INT62HC11:POPDXPOPAX,上一页,2020/5/1,63,IRET;中断服务结束返回I60ENDP;I61PROCFAR;声中断:INT61HPUSHAXPUSHCXPUSHDXMOVDX,140H;置发音持续时间INAL,61H;8255APB口内容到ALANDAL,11111100B;L的D1D0位置0,上一页,2020/5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-广东-广东家禽饲养员四级(中级工)历年参考题库典型考点含答案解析
- 2025年中级卫生职称-主治中医-中医耳鼻喉科学(中级)代码:337历年参考题库典型考点含答案解析
- 2025年计算机技术与软考-计算机技术与软考(中级)-网络工程师历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-铁路职业技能鉴定-铁路职业技能鉴定(轨道车司机)初级历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-老年照护职业-老年照护职业技能鉴定(初级)历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-热工职业-热工仪表检修职业技能鉴定(中级)历年参考题库含答案解析(5套)
- 2025年综合评标专家-海南-海南综合评标专家(医疗保障局)历年参考题库含答案解析(5套)
- 2025年综合评标专家-山西-山西综合评标专家(工程施工类)历年参考题库含答案解析(5套)
- 热爱集体主题队会课件
- 热源厂消防知识培训总结课件
- 公共场所卫生知识培训材料
- 证据目录范本
- 标准档案盒脊背(格式已设置好)
- GB/T 21475-2008造船指示灯颜色
- 园林绿化工高级技师知识考试题库(附含答案)
- 安医大生殖医学课件04胚胎的培养
- 可下载打印的公司章程
- 关于推荐评审高级工程师专业技术职务的推荐意见报告
- Q∕GDW 10356-2020 三相智能电能表型式规范
- 教研工作手册
- CINV化疗相关呕吐课件
评论
0/150
提交评论