汇编语言程序设计-第十章_图形与发声系统的程序设计.ppt_第1页
汇编语言程序设计-第十章_图形与发声系统的程序设计.ppt_第2页
汇编语言程序设计-第十章_图形与发声系统的程序设计.ppt_第3页
汇编语言程序设计-第十章_图形与发声系统的程序设计.ppt_第4页
汇编语言程序设计-第十章_图形与发声系统的程序设计.ppt_第5页
免费预览已结束,剩余57页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十章 图形与发声系统的程序设计,河南师范大学计算机与信息技术学院,2,2019/2/6,本章内容提要,河南师范大学计算机与信息技术学院,3,2019/2/6,10.1 显示方式,河南师范大学计算机与信息技术学院,4,2019/2/6,10.1.1 显示分辨率,河南师范大学计算机与信息技术学院,5,2019/2/6,10.1.2 bios设置显示方式,河南师范大学计算机与信息技术学院,6,2019/2/6,10.2 视频显示存储器,河南师范大学计算机与信息技术学院,7,2019/2/6,10.2.1 图形存储器影像,河南师范大学计算机与信息技术学院,8,2019/2/6,10.2.2 数据到颜色的转换,河南师范大学计算机与信息技术学院,9,2019/2/6,10.2.3 直接视频显示,河南师范大学计算机与信息技术学院,10,2019/2/6,10.3 ega/vga图形程序设计,河南师范大学计算机与信息技术学院,11,2019/2/6,10.3.1 读写像素,河南师范大学计算机与信息技术学院,12,2019/2/6,10.3.2 图形方式下的文本显示,河南师范大学计算机与信息技术学院,13,2019/2/6,10.3.3 彩色绘图程序,河南师范大学计算机与信息技术学院,14,2019/2/6,10.3.4 动画显示技术,河南师范大学计算机与信息技术学院,15,2019/2/6,10.4 通用发声程序,河南师范大学计算机与信息技术学院,16,2019/2/6,主要内容,可编程时间间隔定时器8253/54(programmable interval timer , pit),能根据程序提供的计数值和工作模式,产生各种形状和各种频率的技术/定时脉冲,提供给系统的各个部件使用。,例如,它可以产生不同频率的脉冲作为扬声器的声源。,本节先介绍计算机发声的原理,然后在10.5节介绍乐曲的编程方法。,河南师范大学计算机与信息技术学院,17,2019/2/6,10.4.1 可编程时间间隔定时器8253/54,在8253/54定时器内部有: 3个独立工作的计数器:counter0,counter1,counter2,每个计数器都分配一个端口地址,分别为40h、41h、42h。 一个公用的控制寄存器,端口地址为43h。,端口地址输入到8253/54的cs,a1,a0端,分别对3个计数器和控制器寻址。,如图10.7所示的8253/54的编程结构。,河南师范大学计算机与信息技术学院,18,2019/2/6,对8253/54编程,首先设定控制字,以选择计数器,确定工作模式和计数值的格式。,8253/54的三个计数器是分别编程的,在对任何一个计数器编程时,,首先将控制字节写入控制寄存器。以选择计数器,确定输出什么样的脉冲波形。 向选定的计数器送入一个8位或16位的计数初值,由于8253/54的数据总线是8位的,所以要用两条输出指令来写入初值。,河南师范大学计算机与信息技术学院,19,2019/2/6,8253/54的控制器,d0选择计数值的格式。,d3、d2、d1选择操作模式。六种模式决定了输出脉冲的形状。,d5、d4读写指示位。 计数器锁存:锁定当前计数值,以便读出; 只读/写高字节(msb); 只读/写低字节(lsb); 先读/写lsb,紧接着读/写msb。,d7、d6选择计数器。确定控制字对那一个计数器进行初始化。,河南师范大学计算机与信息技术学院,20,2019/2/6,图10.8 8253/54的控制格式,河南师范大学计算机与信息技术学院,21,2019/2/6,8253/54的初始化程序,例10.12,计数器0 初始化程序段,计数器1 初始化程序段,计数器2 初始化程序段,河南师范大学计算机与信息技术学院,22,2019/2/6,10.4.2 扬声器驱动方式,pc机上大多数i/o都是由主板上的8255(或8255a)可编程外围接口芯片(ppi)管理的。,ppi包括三个8位寄存器: 两个输入寄存器,端口地址分别是60h、62h; 一个输出寄存器,端口地址为61h。,由ppi输出寄存器中的,也就是61h端口的d0、d1位来控制扬声器的驱动方式。,见图10.9扬声器驱动系统。,河南师范大学计算机与信息技术学院,23,2019/2/6,声音产生方式,位触发方式:直接控制61h的pb1交替为1或为0,以产生一个脉冲电流,经过放大器后控制扬声器交替地接通与断开,从而推动扬声器的纸盆振动,发出不同音高和音长的声音。如例8.1。,利用8253/54定时器来驱动扬声器。连接到扬声器上的是定时器2。,图10.9所示的,couter2的gate2与端口61h的pb0相连,当pb0=1时,gate2获得高电平,使counter2在模式3下工作。couter2的out2与端口61h的pb1通过一个与门与扬声器的驱动电路相连。当pb1=1时,允许out2的输出信号到达扬声器。即pb1、pb011时,扬声器发声。,河南师范大学计算机与信息技术学院,24,2019/2/6,10.4.3 通用发声程序,bios中的beep子程序: 只能发出896hz的声音; 产生的音长只能是0.5s的倍数。,编写通用发声程序应该: 能发出任意频率的声音,可由1193100给定频率12348c给定频率计算出来。 声音的持续时间更易于调整。利用cpu来产生延迟时间是最常用的一种方法。,通用发声程序 例10.13,河南师范大学计算机与信息技术学院,25,2019/2/6,10.4.4 80x86 pc的时间延迟,ibm采用了一种利用硬件产生时间延迟的方法,这种方法产生的时间延迟与处理器无关。,即通过61h端口的pb4,使pb4每15.08微秒触发一次,以产生一个固定不变的时间基准。,在ibm pc at bios中的wait子程序,就是一个产生n15.08微秒时间延迟的程序。调用wait子程序时,cx必须装入15.08微秒的倍数n。,例10.14 修改后的gensound,河南师范大学计算机与信息技术学院,26,2019/2/6,10.5 乐曲程序,河南师范大学计算机与信息技术学院,27,2019/2/6,10.5.1 音调与频率和时间的关系,组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。,音符的频率可从图10.10中查到。,实际送入计数器2的是输入频率1.1931mhz与音符频率相除的值,通用发声程序soundf的前半部分就是完成这个计算,并将计数值送入计数器2的功能。,音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的。,河南师范大学计算机与信息技术学院,28,2019/2/6,音符的持续时间,在4/4(四四拍)中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。,如果全音符分配1s(10010ms)的时间,则二分音符的持续时间为0.5s(5010ms),四分音符的持续时间为0.25s (2510ms),八分音符的持续时间为0.125s (12.510ms)。,河南师范大学计算机与信息技术学院,29,2019/2/6,10.5.2 演奏乐曲的程序,编写乐曲程序可分为四个步骤:,为演奏乐曲定义一个频率表和一个节拍时间表。频率表可从图10.10中查到,节拍表中的数据是延迟时间10ms的倍数; 分别将两个表的偏移地址放入si和bp; 从表中取出音符的频率放入di,取出音符的持续时间(实际上是10ms的倍数)放入bx。乐曲的结束符可以用数据0ffffh表示,也可以用0或其他特定值来代替。 调用soundf子程序发出音调。,例10.15 演奏乐曲程序music,河南师范大学计算机与信息技术学院,30,2019/2/6,10.5.3 键盘控制发声程序,音符和频率之间又一定的对应关系,如果计算机键盘上的某些键和音符、频率形成一种对应关系,则可通过键盘控制扬声器发出各种音符声音,这是就可用计算机键盘弹奏出简单的音乐了。,例10.16是一个八度音程的钢琴程序。,这里让数字键18对应一个音阶的八个音符。,河南师范大学计算机与信息技术学院,31,2019/2/6,练习与作业,练习: 10.11、10.13、10.17、10.18,河南师范大学计算机与信息技术学院,32,2019/2/6,图10.7 8253/54的编程结构,每个计数器包含一个16位的、倒计数方式计数的计数寄存器,即从计数初值开始逐次减1,直到减为0为止。,在ibm pc机中,8253/54的: clk0clk2的输入频率都是1.1931817mhz; gate0、gate1接5v; gate2与8255(可编程外围接口芯片)的端口pb0相连。,河南师范大学计算机与信息技术学院,33,2019/2/6,例10.12-1,;将计数器0设定为模式3,计数初值为4282(bcd) mov al , 00110111b out 43h , al mov ax , 4282 out 40h , al mov al , ah out 40h , al,河南师范大学计算机与信息技术学院,34,2019/2/6,例10.12-2,;将计数器2设定为模式3,计数初值为65536 mov al , 10110110b out 43h , al sub al , al out 42h , al out 42h , al,河南师范大学计算机与信息技术学院,35,2019/2/6,计时器0的初始化程序-1,计数器0作为定时器为系统时钟提供计时基准。 计数器0的out端与中断控制器8259a的中断请求端irq0相连,为irq0提供18.2次/秒的中断信号,即out0的输出频率应当是 18.2hz,这正是clk0的输入频率1.1931817mhz与216相除的结果。 计数器0选择mode3;读/写lsb、msb。 则控制字应为:00110110b36h 在ibm pc bios中,计数器0的初始化程序如下:,河南师范大学计算机与信息技术学院,36,2019/2/6,计时器0的初始化程序-2,22 timer equ 40h e277 b036 695 mov al , 36h e279 e643 696 out timer+3 , al e27b b000 697 mov al , 0 ;write lsb to timer0 reg e27d e640 698 out timer , al ;write msb to timer0 reg e284 e640 704 out timer , al,河南师范大学计算机与信息技术学院,37,2019/2/6,计时器1的初始化程序-1,计数器1作为定时器,其输出脉冲用作dram刷新的定时信号。 在ibm pc中,刷新dram的任务由8237 dma来完成。 dma要求每隔15微秒刷新一次,这样,out1的输出频率应当是66.2khz,因为clk1的输入频率1.1931817mhz,所以计数初值应为18( 1.1931817mhz /18=66.2khz)。 在mode2下,out1连续输出周期为15微秒的定时信号,这个定时信号就作为dram的刷新请求信号。 则控制字应为:01010100b54h 在ibm pc bios中,计数器1的初始化程序如下:,河南师范大学计算机与信息技术学院,38,2019/2/6,计数器1的初始化程序-2,mov al , 54h out 43h , al mov al , 18 out 41h , al,河南师范大学计算机与信息技术学院,39,2019/2/6,计数器2的初始化程序-1,计数器2用来控制扬声器发声。 在ibm pc 中有个beep子程序,它在mode3下,能产生频率为896hz的声音,装入计数器2的计数初值为533h(1.19318mhz/896hz=1331=533h),这样得到的控制字为10110110b=0b6h。 即counter2,lsb和msb,mode3,二进制格式。 bios中计数器2的初始化程序如下:,河南师范大学计算机与信息技术学院,40,2019/2/6,计数器2的初始化程序-2,mov al , 0b6h out 43h , al mov al , 33h out 42h , al mov al , 05 out 42h , al,河南师范大学计算机与信息技术学院,41,2019/2/6,图10.9 扬声器驱动系统,河南师范大学计算机与信息技术学院,42,2019/2/6,控制扬声器的代码,in al , 61h mov ah , al or al , 00000011b ;turn on out 61h , al ; the speaker ;how long the beep sound goes here ;get the original setting of port b ;turn off the speaker mov al , ah out 61h , al,对ibm pc及兼容机来所,80x86系列机,驱动扬声器的过程都是相同的。 至于音调发出的时间量(音长),则取决于它延迟的时间,这个延迟时间可以在pc机的80x86主处理器的帮助下实现。,河南师范大学计算机与信息技术学院,43,2019/2/6,发声频率,从10.4.1小节知道,给计数器2装入计数值533h能产生896hz的声音(1.1931mhz/896hz=533h),同样,产生其他频率声音的计数值也可以用这种方法计算出来。 假定发声频率存放在di寄存器中,下面的指令使ax中得到送往定时器2的计数值。 mov dx , 12h mov ax , 348ch div di,河南师范大学计算机与信息技术学院,44,2019/2/6,产生延迟时间-1,对8088/86、80286、386、486以及pentium,它们产生的延迟时间都是不一样的。对基于8088/86的pc/xt,ps/2等pc机,可用下面的代码来产生时间延迟: mov cx , n delay: loop delay,在8088/86cpu中,执行一条loop指令需要17个时钟周期,因此执行上面的指令大约需要n17t时钟周期。若n2800,系统频率为4.7mhz(时钟周期约为212ns),那么得到的延迟时间为10ms(280017212ns)。,河南师范大学计算机与信息技术学院,45,2019/2/6,产生延迟时间-2,;在bios中,利用上述方法来产生250ms延迟时间的程序如下: sub cx , cx g7: loop g7 ;65535212ns17236ms,如果要产生与10ms成倍数的延迟时间,可在bx寄存器中放入倍数。例如,要产生1s的持续时间,可在bx中放入100,以控制loop执行1002800次,也就是10ms的100倍。指令如下: mov bx , 100 wait: mov cx , 2800 delay: loop delay dec bx jnz wait,河南师范大学计算机与信息技术学院,46,2019/2/6,例10.13-1,这是一个任一频率(由di指定)和任意持续时间(由cx和bx指定)的通用发声程序。 它包括三个步骤: 在8253/54中的43h端口送一个控制字0b6h(10110110b),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。 在8253/54中的42h端口(timer2)装入一个16位的计数值(533h896/频率),以建立将要产生的声音频率。 把输出端口61h的0、1两位置1,发出声音。 通用发声程序gensound,如下:,河南师范大学计算机与信息技术学院,47,2019/2/6,例10.13-2,public gensound cseg segment para code assume cs:cseg gesound proc far push ax push bx push cx push dx push di mov al , 0b6h out 43h , al mov dx , 12 mov ax , 348ch,河南师范大学计算机与信息技术学院,48,2019/2/6,例10.13-3,div di out 42h , al mov al , ah out 42h , al in al , 61h mov ah , al or al , 3 out 61h , al wait1: mov cx , 2800 delay: loop delay dec bx jnz wait1,河南师范大学计算机与信息技术学院,49,2019/2/6,例10.13-4,mov al , ah out 61h , al pop di pop dx pop cx pop bx pop ax ret gensound endp cseg ends end,河南师范大学计算机与信息技术学院,50,2019/2/6,gensound程序产生的声音不仅与输入频率有关,而且与cpu有关。,如果80x86的工作频率为8mhz,则t=125ns(1/8mhz125ns),那么该程序产生的时间延迟就要短的多。,在80286中,loop指令只需8个执行周期,这也会使延迟时间短的多。,因此从pc/at开始,对所有的80286/80386/80486/pentium计算机,ibm都提供一种利用硬件产生时间延迟的方法,这种方法不仅与频率无关,也与cpu无关。10.4.4小节将介绍这种方法。,河南师范大学计算机与信息技术学院,51,2019/2/6,wait子程序,;(cx)=count of 15.08s waitf proc near push ax waitf1: in al , 61h and al , 10h cmp al , ah je waitf1 mov ah , al loop waitf1 pop ax ret waitf1 endp,在80x86各种型号pc机中,61h端口既可作为输入寄存器, 也可作为输出寄存器;但在8088/86中,该端口只能作输出 寄存器用。,河南师范大学计算机与信息技术学院,52,2019/2/6,例10.14,;调用waitf子程序,产生1.5s的延迟时间。 ;因为1.5s的延迟时间需要设置计数值99436(1.5s/15.08 s=99346)而16位寄存器表示的最大数为65535,所以可以连续调用3次产生0.5s延迟的程序。 mov bl , 03 back: mov cx , 33144 ;3314415.08 s=o.5s call waitf dec bl jnz back,河南师范大学计算机与信息技术学院,53,2019/2/6,修改后的gensound,;可用waitf代替循环指令来产生延迟。计数值设为663(10ms/15.08 s=663.13)。 soundf proc far ;same as gensound wait1: mov cx , 663 call waitf ;same as gensound,河南师范大学计算机与信息技术学院,54,2019/2/6,图10.10 两个音阶的琴键,河南师范大学计算机与信息技术学院,55,2019/2/6,soundf前半部分,;(di)=the desired output frequency mov al , 0b6h ;启动定时器2 out 43h , al mov dx , 12h ;设定计数值 mov ax , 384ch ;即确定发声频率 div di out 42h , al mov al , ah out 42h , al ,河南师范大学计算机与信息技术学院,56,2019/2/6,例10.15-1,.model small .stack 64kb .data mus_freq dw 330,294,262,294,3dup (330) ;bar 1bar 5&6 .code extrn soundf:far,河南师范大学计算机与信息技术学院,57,2019/2/6,例10.15-2,.startup lea si , ds:mus_freq lea bp , ds:mus_time freq: mov di , si cmp di , -1 je end_mus mov bx , ds:bp call soundf add si , 2 add bp , 2 jmp fr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论