第 6章 应用系统开发
第 6章 应用系统开发
﹡ 6.1 汽车动画程序开发
﹡ 6.2 发声系统程序开发
开 始
第 6章 应用系统开发
6.1 汽车动画程序开发
﹡ 6.1.1 字符图形显示
﹡ 6.1.2 动画程序的开发
返回本章首页
第 6章 应用系统开发
6.1.1 字符图形显示
字符图形既可以在显示器上以简单的黑白
图形字符显示, 也可以在彩色显示器上以
彩色的图形字符显示 。 通过调用 INT 10H的
AH=0,AL=0~7可设置不同的显示方式,
调用 INT 10H的 AH=09H,AH=0AH等可
显示字符 。
返回本节
第 6章 应用系统开发
1,动画显示的基础
2,程序举例
6.1.2 动画程序的开发
第 6章 应用系统开发
在屏幕上显示出动画的效果, 可分 5步进行:
l 在屏幕上显示图形 ( 单字符或多字符图形 ) 。
l 延迟一个时间周期, 这样图形更清晰 。
l 清除图形 。
l 改变图形的行列坐标 。
l 返回第一步, 重复上述过程 。
1.动画显示的基础
第 6章 应用系统开发
图 6.1,汽车”各字符的相对位移
量
(- 2,1) (0,1)
(0,0)
(0,- 3) (0,1) (0,1) (1,0)
上 一 页
第 6章 应用系统开发
?【 例 6.1】 在屏幕上显示一个开动的汽车如图 6.1所示
源程序如下,DATA SEGMENT
CAR DB 7 ;字符图形表
DB 52H,7,0,0
DB 0B1H,7,0,1
DB 0DBH,7,0,1
DB 0DBH,7,0,1
DB 4FH,7,1,0
DB 4FH,7,0,-3
DB 2,7,-2,1
2.程序举例
第 6章 应用系统开发
CHAR_CNT DW? POINTER DW?
LINE_ON DB? COL_ON DB?
DATA ENDS;
CODESEGMENT
ASSUME CS,CODE,DS,DATA
MAIN PROC FAR PUSH DS
SUB AX,AXPUSH AX
MOV AX,DATA ;初始化 DS
上 一 页
第 6章 应用系统开发
MOV DS,AX
MOV AH,0;设置 300× 200彩色图形方式
MOV AL,4 INT 10H
MOV AH,0BH ;设置背景颜色
MOV BH,0 MOV BL,2
INT 10
MOV AH,0BH ;设置彩色调板
MOV BH,01 MOV BL,00
INT 10H
CALL CLEAR_SCREEN ;清屏
上 一 页
第 6章 应用系统开发
LEA DI,CAR ; DI指向字符图形表
MOV DH,5;从第 5行 5列位置开始
MOV DL,5 ;显示汽车
CALL MOVE_SHAPE
RET MAIN ENDP;
CLEAR_SCREEN PROC NEAR
PUSH AX ;保护寄存器
PUSH BX
PUSH CX
上 一 页
第 6章 应用系统开发
PUSH DX
MOV AH,6;屏幕上卷功能
MOV AL,0
MOV CH,0;左上角行号
MOV CL,0 ;左上角列号
MOV DH,24 ;右下角行号
MOV DL,79 ;右下角列号
MOV BH,7;卷入行属性
INT 10H ;调用显示属性
POP DX ;恢复寄存器
上 一 页
第 6章 应用系统开发
POP CX
POP BX
POP AX
RET ;返回主程序
CLEAR_SCREEN ENDP;
MOVE_SHAPE PROC NEAR
PUSH AX ;保护寄存器
PUSH BX PUSH CX
PUSH DX PUSH DI
上 一 页
第 6章 应用系统开发
MOV AH,0FH ;取当前显示方式
INT 10H
SUB CH,CH ;清除计数器 CX的高字节
MOV CL,[DI] ; CL放循环次数
INC DI ; DI指向字符图形表中的第一个字符
MOV CHAR_CNT,CX ;保存循环次数
MOV POINTER,DI
MOV LINE_ON,DH
MOV COL_ON,DL
上 一 页
第 6章 应用系统开发
PLOT_NEXT:
ADD DH,[DI+2] ;改变行列指针
ADD DL,[DI+3]
CMP DL,80 ;出屏否?
JB MOV_CRSR
CALL ERASE
POP DI
POP DX
POP CX
POP BX
POP AX
RET
上 一 页
第 6章 应用系统开发
MOV_CRSR:
MOV AH,2 ;移动光标位置
INT 10H MOV
AL,[DI]
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 ;调用延时子程序
第 6章 应用系统开发
CALL ERASE ;调用擦除子程序
JMP SHORT PLOT_NEXT
MOVE_SHAPE ENDP;
ERASE PROC NEAR
MOV CX,CHAR_CNT
MOV DI,POINTER
MOV DH,LINE_ON
MOV DL,COL_ON
上 一 页
第 6章 应用系统开发
ERASE_NEXT:
ADD DH,[DI+2] ADD DL,[DI+3]
MOV AH,2 INT 10H
MOV AL,[DI] MOV BL,0
PUSH CX MOV CX,1
MOV AH,9 INT 10H
POP CX ADD DI,4
LOOP ERASE_NEXT
MOV CX,CHAR_CNT
上 一 页
第 6章 应用系统开发
MOV DI,POINTER
MOV DH,LINE_ON
INC COL_ON
MOV DL,COL_ON
RET
ERASE ENDP;
DLY_QRTR PROC NEAR ;延时子程序
PUSH CX
第 6章 应用系统开发
PUSH DX
MOV DX,5000
D11,MOV CX,2801
D12,LOOP D12 DEC DX
JNZ D11 POP DX
POP CX RET
DLY_QRTR ENDP
CODE ENDS
END MAIN
返回本节上 一 页
第 6章 应用系统开发
6.2 发声系统程序开发
﹡ 6.2.1 系统发声途径
﹡ 6.2.2 发声应用程序举例
返回本章首页
第 6章 应用系统开发
6.2.1 系统发声途径
1,8254定时器作为发声源
2,8255端口 B( PB1位)作为发声源
返回本章首页
第 6章 应用系统开发
1,8254定时器作为发声源
将定时器产生的方波信号同 8255的端口 B相与来控
制扬声器发声的 ( 如图 6.2所示 ), 因此当 PB1=1时,
才能控制扬声器的音调 。 在系统中 8255的 B口地址
为 61H,用指令:
IN AL,61H
OR AL,3
OUT 61H,AL
第 6章 应用系统开发
图 6.2 控制扬声器发声原理图
第 6章 应用系统开发
ROM BIOS中的发声子程序如下:
BEEP PROC NEAR
MOV AL,10110110B
OUT 43H,AL
MOV AX,533H
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,PORT_B
第 6章 应用系统开发
MOV AH,AL
OR AL,03
OUT PORT_B,AL
SUB CX,CX
G7,LOOP G7
DEC BL
JNZ G7
MOV AL,AH
OUT PORT_B,AL
RET BEEP ENDP
返回本节
第 6章 应用系统开发
2,8255端口 B( PB1位)作为发声源
使 8255端口 B( 或相应的等效电路 ) 最低位
D0=0,关闭定时器声源的输出, OUT2为常
高电位 ( 方式 3所致 ) 。 又通过使 8255端口
B( 或相应等效电路 ) 的 D1位置 1或置 0( 按
指定的频率来编程 ), 便能让, 与, 门输出
一周期性变化的方波, 使扬声器发声 。
返回本节
第 6章 应用系统开发
6.2.2 发声应用程序举例
1.扬声器发声通用子程序
2.演奏乐曲程序
3.定时报警程序
第 6章 应用系统开发
1.扬声器发声通用子程序
【 例 6.2】 通用发声程序 GENSOUND。
PUBLIC GENSOUND
CODE SEGMENT PARA ‘CODE’
ASSUME CS,CODE
GENSOUND PROC FAR
PUSH AX ;保存将要用到的寄存器
PUSH BX
第 6章 应用系统开发
PUSH CX PUSH DX
PUSH DI
MOV AL,0B6H;向 8253-5/8254-2计数器 2写控制字
OUT 43H,AL;方式 3,双字节写和二进制计数方式写到控制口
MOV DX,12H;设置被除数
MOV AX,533H*896
DIV DI;其商 ( AX) 为预置值
OUT 42H,AL;先送 LSB
第 6章 应用系统开发
MOV AL,AH
OUT 42H,AL;后送 MSB
IN AL,61H;读 8255端口 B( 61H) 原值
MOV AH,AL;保存端口原值
OR AL,3
OUT 61H,AL;接通扬声器
WAIT1,MOV CX,8FF0H;在 80486/DX2/66中取
DELAY,LOOP DELAY;循环次数为 8FF0H
DEC BX;循环持续 BX次
JNZ WAIT1
第 6章 应用系统开发
MOV AL,AH;写回 61H口原值, 关闭扬声
OUT 61H,AL
POP DI;恢复寄存器
POP DX POP CX
POP BX POP AX
RET ;子程序结束返回
GENSOUND ENDP
CODE ENDS
END
返回本节
第 6章 应用系统开发
2.演奏乐曲程序
音名 C D E F G A B C D E F G A B C
唱名 1 2 3 4 5 6 7 1 2 3 4 5 6 7 i
频率
(Hz)
1
3
1
1
4
7
1
6
5
1
7
5
1
9
6
2
2
0
2
4
7
2
6
2
2
9
4
3
3
0
3
4
9
3
9
2
4
4
0
4
9
2
5
2
3
表 6.1 音律与频率对应表
第 6章 应用系统开发
程序如下:
TITLE MUSIC –乐曲, 玛丽有只小羊羔,;汇编过程,MASM MUSIC.ASM 连接过程;
LINK MUSIC+GENLOUND
EXTRN GENSOUND,FAR;定义外部调用程序
STACK SEGMENT PARA STACK ?STACK?
DB 64 DUP( ‘ STACK?)
STACK ENDS;
【 例 6.3】 以乐谱, 玛丽有只小羊羔, 为例编写
演奏程序
第 6章 应用系统开发
DATA SEGMENT PARA ?DATA?
MUS_FREQ DW 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,-1MUS_TIME
DW 6 DUP( 25*8), 50*8;为演奏的乐曲定义一
个
DW 2 DUP( 25*8,25*8,50*8) ;节拍时间表
第 6章 应用系统开发
DW 12 DUP( 25*8), 100*8
DATA ENDS;
CODESEGMENT PARA ?CODE?
ASSUME CS,CODE,SS,STACK
ASSUME DS,DATA
MUSIC PROC FAR
PUSH DS SUB AX,AX
PUSH AX
MOV AX,DATA ;指向数据指针
第 6章 应用系统开发
MOV DS,AX
LEA SI,MUS_FREQ;将频率表的偏移地址送入 SI
LEA BP,DS,MUS_TIME;将节拍时间表的偏移地址送
入 BP
FREQ,MOVDI,[SI];取音符频率
CMP DI,-1;结束?
JE END_MUS;是, 退出
MOV BX,DS,[BP];取音符持续时间
第 6章 应用系统开发
CALL GENSOUND ;调用 GENSOUND发音子程序
ADD SI,2 ;频率表指针增 2
ADD BP,2 ;时间表指针增 2
JMP FREQ ;继续演奏
END_MUS,RET ;返回 DOS
MUSIC ENDP;
CODE ENDS
END MUSIC
返回本节
第 6章 应用系统开发
3.定时报警程序
图
6.
3
实
时
钟
中
断
处
理
流
程
图
第 6章 应用系统开发;利用 INT 1AH中断实现定时报警, 本程序在执行后,
若设置成功则首先显示;字符串, Set up all right,并使扬声器发声, 这表明
设置成功; 1分钟 ( 为定时时间,;读者也可自己设定 ) 后屏幕显示, !, 并发声, 以
示报警 。;汇编过程,MASM,ALARM.ASM;连接过程,LINK, ALARM+GENSOUND
EXTRN GENSOUND,FAR;定义外部调用程序
【 例 6.4】 TITLE ALARM——定时报警程序
第 6章 应用系统开发
STACK SEGMENT PARA STACK ?STACK?
DB 64 DUP( ‘ STACK﹒﹒﹒ ?
STACK ENDS;
DATA SEGMENT PARA PUBLIC ?DATA?
BJ DB ?Set up all right,?
DB 13,10,’ $?
DATA ENDS;
第 6章 应用系统开发
CODE SEGMENT PARA PUBLIC ?CODE?
ASSUME CS,CODE,SS,STACK,DS,DATA
ENTRY PROC FAR
PUSH DS;保存旧的数据段
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,4AH;读取 INT 4AH中断向量
上 一 页
第 6章 应用系统开发
MOV AH,35H INT 21H
PUSH ES;入栈保护 PUSH BX
STEP1,MOV AH,7;清除实时钟报警
INT 1AH
JC STEP1;进位位为 1则转移 ( 成功则转移 );
MOV AL,4AH;设置新的 INT 4AH中断向量
MOV DX,SEG ALARM
MOV DS,DX
上 一 页
第 6章 应用系统开发
LEA DX,ALARM MOV AH,25H
INT 21H CLI ;关中断
STEP2,MOV AH,2 ;利用 INT 1AH读当前实时钟时间
INT 1AH ;时, 分, 秒分别置入 CH,CL,DH
JC STEP2 ;不成功再读
MOV AL,CL
ADD AL,1 ;增 1分钟
DAA ;调整为 BCD码格式
CMP AL,60H ;是 60分吗 ( BCD数 )?
上 一 页
第 6章 应用系统开发
JL STEP3 ;不是, 则转移
MOV AL,00H;是, 改为 0分
STEP3,MOV CL,AL ;得到报警时刻的分值
MOV AH,6 ; CH,DH仍为原值
INT 1AH ;设置报警时刻
JC STEP2 ;不成功重做
STI ;开中断
MOV CX,12
SETUP,MOV AH,2;设置成功发出, 嘟嘟, 声
上 一 页
第 6章 应用系统开发
MOV DL,07H; 07H是振铃控制码
INT 21H;用 INT 21H 的 2号功能实现
LOOP SETUP;循环发声
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BJ;显示, Set up all
right,”字符串
MOV AH,9
INT 21H;
上 一 页
第 6章 应用系统开发
MOV DX,32000
MAINP1,MOV CX,25500;延时程序段, 等待报警
MAINP2,LOOP MAINP2
DEC DX
JNE MAINP1
RES,POP DX;恢复 INT 4AH 原中断向量
POP DS
MOV AL,4AH
MOV AH,35H
上 一 页
第 6章 应用系统开发
INT 21H RET
ENTRY ENDP;
ALARM PROC ;报警中断服务程序
PUSH AX PUAH BX
PUSH DI STI
MOV AH,2;显示字符 ‘ ! ’
MOV DL,‘ ! ’
INT 21H
上 一 页
第 6章 应用系统开发
MOV DI,300 ;发音频率
MOV BX,1400 ;发音延迟时间
CALL GENSOUND ;调用通用发声子程序
POP DI POP BX
POP AX IRET
ALARM ENDP
CODE ENDS;
END ENTRY ;程序结束
上 一 页
第 6章 应用系统开发
【 例 6.5】 用软中断 INT 60H、发声中断服务程序 INT 61H
以及软中断 INT 62H,INT 63H,实现字符串, intel
80486 DX2/66 CPU”显示、扬声器发声和变色三角形的显
示功能,定时器 ICH中断作为计数器使用。;
DATA SEGMENT PARA ?DATA? ;数据段
D1 DB 0DH,‘ intel 80486 DX2/66 CPU $?
D3 DW 0
D20 DB? DATA ENDS;
第 6章 应用系统开发
STAC SEGMENT PARA STACK ?STAC?;堆栈段
STA1 DW 100 DUP(?)
STAC ENDS;
CODE SEGMENT PARA ?CODE? ;代码段
ASSUME CS,CODE,DS,DATA
ASSUME SS,STAC,ES,DATA
STAR PROC FAR ;主程序开始
上 一 页
第 6章 应用系统开发
PUSH DS XOR AX,AX
PUSH AX MOV AX,DATA
MOV DS,AX MOV ES,AX
CLI;关中断
MOV AL,1CH;保存定时器时钟中断向量
MOV AH,35H
INT 21H
PUSH ES
上 一 页
第 6章 应用系统开发
PUSH BX PUSH DS
MOV DX,OFFSET RING;设置定时器时钟中断向量
MOV AX,SEG RING
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
IN AL,21H ;读 IMR中的屏蔽码
上 一 页
第 6章 应用系统开发
AND AL,1111110B;开放中断 0并保留中断屏蔽
设置
OUT 21H,AL;将新屏蔽码写入 IMR中
PUSH DS;入栈保护 DS寄存器
MOV DX,OFFSET I60;取 I60的偏移地址
MOV AX,SEG I60;取 I60的段基地址
MOV DS,AX
MOV AH,25H
MOV AL,60H
INT 21H
上 一 页
第 6章 应用系统开发
LEA DX,I61 ;设置 61H软中断向量
MOV AX,SEG I61
MOV DS,AX
MOV AH,25H
MOV AL,61H
INT 21H
LEA DX,I62 ;设置 62H软中断向量
MOV AX,SEG I62
MOV DS,AX
上 一 页
第 6章 应用系统开发
MOV AH,25H MOVAL,62H
INT 21H
LEA DX,I63;设置 63H软中断向量
MOV AX,SEG I63 MOV DS,AX
MOV AH,25H MOV AL,63H
INT 21H POP DS ; DS出栈
STI ;开中断
MOV DI,8000
上 一 页
第 6章 应用系统开发
DELAY,MOV SI,150
INT 60H ;调用 60H中断, 使程序进入
DELAY1,DEC SI ;循环状态
JNZ DELAY1 DEC DI
JNZ DELAY
POP DX ;恢复定时器控制 ( ICH) 中断向量
POP DS MOV AL,1CH
MOV AH,25H INT 21H
MOV AH,0 ;显示器恢复文本状态
上 一 页
第 6章 应用系统开发
MIV AL,3 INT 10H
RET STAR ENDP;
RING PROC FAR ;定时器中断服务程序
PUSH DS PUSH AX
MOV AX,DATA
MOV DS,AX STI
INC D20 ;计数单元加 1
上 一 页
第 6章 应用系统开发
B11,POP AX
POP DS
IRET ;中断服务结束返回
RING ENDP;
I60 PROC FAR ; 60H中断服务程序完成对
PUSH AX ; 61H和 62H中断的调用
PUSH DX
LEA DX,D1;显示 ‘ intel 80486 DX
上 一 页
第 6章 应用系统开发
2/66 CPU? MOV AH,9
INT 21H
CMP D20,2;中断延时到否?
JNE C11 ;到, 则转置 C11
MOV D20,0;否则使 D20清 0
INT 61H ;用发声中断 INT 61H
INT 62H ;用延时绘图中断 INT 62H
C11,POP DX
POP AX
上 一 页
第 6章 应用系统开发
IRET ;中断服务结束返回
I60 ENDP;
I61 PROC FAR ;声中断,INT 61H
PUSH AX PUSH CX
PUSH DX
MOV DX,140H ;置发音持续时间
IN AL,61H ; 8255A PB 口内容到 AL
AND AL,11111100B ; L的 D1D0位置 0
上 一 页
第 6章 应用系统开发
L1:
XOR AL,00000010B; L的 D1取反
OUT 61H,AL; L送 PB口, 控制扬声器发声
MOV CX,0F600H ;置方波信号频率变换时间常数
L2,LOOP L2 DEC DX
JNZ L1 POP DX;恢复现场
POP CX POP AX
IRET
I61 ENDP
上 一 页
第 6章 应用系统开发;
I62 PROC FAR ;延时调用绘图中断 INT 63H
PUSH CX PUSH DX MOV DX,40H
K1,MOV CX,440H
K2,LOOP K2 DEC DX
JNZ K1
INT 63H;调用软中断 63H
POP DX POP CX IRET
I62 ENDP
上 一 页
第 6章 应用系统开发;
I63 PROC FAR ;绘图中断程序 INT 63H
PUSH AX PUSH BX
PUSH CX PUSH DX
PUSH DS MOV AH,0
MOV AL,12H;设置显示模式 4( 图形方式
320*200)
INT 10N
MOV AL,1 ;设图形色号
A0,MOV DX,1;设置图形起点行坐标 DX=10
上 一 页
第 6章 应用系统开发
MOV D3,1 ;设图形第一行点数 D3=1
MOV CX,320;设图形起点列坐标 CX=160
A1,PUSH CX;入栈保护 CX
PUSH D3
A2,MOV AH,12
PUSH AX
INT 10H;写点 ( 12号功能调用 )
POP AX
INT CX;修改写点列坐标 CX=CX+1
上 一 页
第 6章 应用系统开发
SUB D3,1 ;修改写点计数 D3=D3-1
JNZ A2 ;判断 D3=0? 非 0到 A2
POP D3 ; D3=0,D3出栈
ADD D3,2 ; D3=D3+2修改点数
POP CX ; CX出栈
INC DX ; DX=DX+1( 起点行坐标 )
DEC CX ; CX=CX-1(起点列坐标)
JNE A1 ; CX=0? 非 0到 A1
JNC AL ; CX=0,AL=AL+1
上 一 页
第 6章 应用系统开发
CMP AL,4 ; AL=4?
JNE A0 ;非, 转到 A0
MOV AH,0;设置文本 80*25模式
MOV AL,3
INT 10H
POP DS ;恢复现场
POP DX
POP CX
POP BX
上 一 页
第 6章 应用系统开发
POP AX
IRET
I63 ENDP;
CODE ENDS
END STAR ;结束
上 一 页 返回本节
第 6章 应用系统开发
﹡ 6.1 汽车动画程序开发
﹡ 6.2 发声系统程序开发
开 始
第 6章 应用系统开发
6.1 汽车动画程序开发
﹡ 6.1.1 字符图形显示
﹡ 6.1.2 动画程序的开发
返回本章首页
第 6章 应用系统开发
6.1.1 字符图形显示
字符图形既可以在显示器上以简单的黑白
图形字符显示, 也可以在彩色显示器上以
彩色的图形字符显示 。 通过调用 INT 10H的
AH=0,AL=0~7可设置不同的显示方式,
调用 INT 10H的 AH=09H,AH=0AH等可
显示字符 。
返回本节
第 6章 应用系统开发
1,动画显示的基础
2,程序举例
6.1.2 动画程序的开发
第 6章 应用系统开发
在屏幕上显示出动画的效果, 可分 5步进行:
l 在屏幕上显示图形 ( 单字符或多字符图形 ) 。
l 延迟一个时间周期, 这样图形更清晰 。
l 清除图形 。
l 改变图形的行列坐标 。
l 返回第一步, 重复上述过程 。
1.动画显示的基础
第 6章 应用系统开发
图 6.1,汽车”各字符的相对位移
量
(- 2,1) (0,1)
(0,0)
(0,- 3) (0,1) (0,1) (1,0)
上 一 页
第 6章 应用系统开发
?【 例 6.1】 在屏幕上显示一个开动的汽车如图 6.1所示
源程序如下,DATA SEGMENT
CAR DB 7 ;字符图形表
DB 52H,7,0,0
DB 0B1H,7,0,1
DB 0DBH,7,0,1
DB 0DBH,7,0,1
DB 4FH,7,1,0
DB 4FH,7,0,-3
DB 2,7,-2,1
2.程序举例
第 6章 应用系统开发
CHAR_CNT DW? POINTER DW?
LINE_ON DB? COL_ON DB?
DATA ENDS;
CODESEGMENT
ASSUME CS,CODE,DS,DATA
MAIN PROC FAR PUSH DS
SUB AX,AXPUSH AX
MOV AX,DATA ;初始化 DS
上 一 页
第 6章 应用系统开发
MOV DS,AX
MOV AH,0;设置 300× 200彩色图形方式
MOV AL,4 INT 10H
MOV AH,0BH ;设置背景颜色
MOV BH,0 MOV BL,2
INT 10
MOV AH,0BH ;设置彩色调板
MOV BH,01 MOV BL,00
INT 10H
CALL CLEAR_SCREEN ;清屏
上 一 页
第 6章 应用系统开发
LEA DI,CAR ; DI指向字符图形表
MOV DH,5;从第 5行 5列位置开始
MOV DL,5 ;显示汽车
CALL MOVE_SHAPE
RET MAIN ENDP;
CLEAR_SCREEN PROC NEAR
PUSH AX ;保护寄存器
PUSH BX
PUSH CX
上 一 页
第 6章 应用系统开发
PUSH DX
MOV AH,6;屏幕上卷功能
MOV AL,0
MOV CH,0;左上角行号
MOV CL,0 ;左上角列号
MOV DH,24 ;右下角行号
MOV DL,79 ;右下角列号
MOV BH,7;卷入行属性
INT 10H ;调用显示属性
POP DX ;恢复寄存器
上 一 页
第 6章 应用系统开发
POP CX
POP BX
POP AX
RET ;返回主程序
CLEAR_SCREEN ENDP;
MOVE_SHAPE PROC NEAR
PUSH AX ;保护寄存器
PUSH BX PUSH CX
PUSH DX PUSH DI
上 一 页
第 6章 应用系统开发
MOV AH,0FH ;取当前显示方式
INT 10H
SUB CH,CH ;清除计数器 CX的高字节
MOV CL,[DI] ; CL放循环次数
INC DI ; DI指向字符图形表中的第一个字符
MOV CHAR_CNT,CX ;保存循环次数
MOV POINTER,DI
MOV LINE_ON,DH
MOV COL_ON,DL
上 一 页
第 6章 应用系统开发
PLOT_NEXT:
ADD DH,[DI+2] ;改变行列指针
ADD DL,[DI+3]
CMP DL,80 ;出屏否?
JB MOV_CRSR
CALL ERASE
POP DI
POP DX
POP CX
POP BX
POP AX
RET
上 一 页
第 6章 应用系统开发
MOV_CRSR:
MOV AH,2 ;移动光标位置
INT 10H MOV
AL,[DI]
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 ;调用延时子程序
第 6章 应用系统开发
CALL ERASE ;调用擦除子程序
JMP SHORT PLOT_NEXT
MOVE_SHAPE ENDP;
ERASE PROC NEAR
MOV CX,CHAR_CNT
MOV DI,POINTER
MOV DH,LINE_ON
MOV DL,COL_ON
上 一 页
第 6章 应用系统开发
ERASE_NEXT:
ADD DH,[DI+2] ADD DL,[DI+3]
MOV AH,2 INT 10H
MOV AL,[DI] MOV BL,0
PUSH CX MOV CX,1
MOV AH,9 INT 10H
POP CX ADD DI,4
LOOP ERASE_NEXT
MOV CX,CHAR_CNT
上 一 页
第 6章 应用系统开发
MOV DI,POINTER
MOV DH,LINE_ON
INC COL_ON
MOV DL,COL_ON
RET
ERASE ENDP;
DLY_QRTR PROC NEAR ;延时子程序
PUSH CX
第 6章 应用系统开发
PUSH DX
MOV DX,5000
D11,MOV CX,2801
D12,LOOP D12 DEC DX
JNZ D11 POP DX
POP CX RET
DLY_QRTR ENDP
CODE ENDS
END MAIN
返回本节上 一 页
第 6章 应用系统开发
6.2 发声系统程序开发
﹡ 6.2.1 系统发声途径
﹡ 6.2.2 发声应用程序举例
返回本章首页
第 6章 应用系统开发
6.2.1 系统发声途径
1,8254定时器作为发声源
2,8255端口 B( PB1位)作为发声源
返回本章首页
第 6章 应用系统开发
1,8254定时器作为发声源
将定时器产生的方波信号同 8255的端口 B相与来控
制扬声器发声的 ( 如图 6.2所示 ), 因此当 PB1=1时,
才能控制扬声器的音调 。 在系统中 8255的 B口地址
为 61H,用指令:
IN AL,61H
OR AL,3
OUT 61H,AL
第 6章 应用系统开发
图 6.2 控制扬声器发声原理图
第 6章 应用系统开发
ROM BIOS中的发声子程序如下:
BEEP PROC NEAR
MOV AL,10110110B
OUT 43H,AL
MOV AX,533H
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,PORT_B
第 6章 应用系统开发
MOV AH,AL
OR AL,03
OUT PORT_B,AL
SUB CX,CX
G7,LOOP G7
DEC BL
JNZ G7
MOV AL,AH
OUT PORT_B,AL
RET BEEP ENDP
返回本节
第 6章 应用系统开发
2,8255端口 B( PB1位)作为发声源
使 8255端口 B( 或相应的等效电路 ) 最低位
D0=0,关闭定时器声源的输出, OUT2为常
高电位 ( 方式 3所致 ) 。 又通过使 8255端口
B( 或相应等效电路 ) 的 D1位置 1或置 0( 按
指定的频率来编程 ), 便能让, 与, 门输出
一周期性变化的方波, 使扬声器发声 。
返回本节
第 6章 应用系统开发
6.2.2 发声应用程序举例
1.扬声器发声通用子程序
2.演奏乐曲程序
3.定时报警程序
第 6章 应用系统开发
1.扬声器发声通用子程序
【 例 6.2】 通用发声程序 GENSOUND。
PUBLIC GENSOUND
CODE SEGMENT PARA ‘CODE’
ASSUME CS,CODE
GENSOUND PROC FAR
PUSH AX ;保存将要用到的寄存器
PUSH BX
第 6章 应用系统开发
PUSH CX PUSH DX
PUSH DI
MOV AL,0B6H;向 8253-5/8254-2计数器 2写控制字
OUT 43H,AL;方式 3,双字节写和二进制计数方式写到控制口
MOV DX,12H;设置被除数
MOV AX,533H*896
DIV DI;其商 ( AX) 为预置值
OUT 42H,AL;先送 LSB
第 6章 应用系统开发
MOV AL,AH
OUT 42H,AL;后送 MSB
IN AL,61H;读 8255端口 B( 61H) 原值
MOV AH,AL;保存端口原值
OR AL,3
OUT 61H,AL;接通扬声器
WAIT1,MOV CX,8FF0H;在 80486/DX2/66中取
DELAY,LOOP DELAY;循环次数为 8FF0H
DEC BX;循环持续 BX次
JNZ WAIT1
第 6章 应用系统开发
MOV AL,AH;写回 61H口原值, 关闭扬声
OUT 61H,AL
POP DI;恢复寄存器
POP DX POP CX
POP BX POP AX
RET ;子程序结束返回
GENSOUND ENDP
CODE ENDS
END
返回本节
第 6章 应用系统开发
2.演奏乐曲程序
音名 C D E F G A B C D E F G A B C
唱名 1 2 3 4 5 6 7 1 2 3 4 5 6 7 i
频率
(Hz)
1
3
1
1
4
7
1
6
5
1
7
5
1
9
6
2
2
0
2
4
7
2
6
2
2
9
4
3
3
0
3
4
9
3
9
2
4
4
0
4
9
2
5
2
3
表 6.1 音律与频率对应表
第 6章 应用系统开发
程序如下:
TITLE MUSIC –乐曲, 玛丽有只小羊羔,;汇编过程,MASM MUSIC.ASM 连接过程;
LINK MUSIC+GENLOUND
EXTRN GENSOUND,FAR;定义外部调用程序
STACK SEGMENT PARA STACK ?STACK?
DB 64 DUP( ‘ STACK?)
STACK ENDS;
【 例 6.3】 以乐谱, 玛丽有只小羊羔, 为例编写
演奏程序
第 6章 应用系统开发
DATA SEGMENT PARA ?DATA?
MUS_FREQ DW 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,-1MUS_TIME
DW 6 DUP( 25*8), 50*8;为演奏的乐曲定义一
个
DW 2 DUP( 25*8,25*8,50*8) ;节拍时间表
第 6章 应用系统开发
DW 12 DUP( 25*8), 100*8
DATA ENDS;
CODESEGMENT PARA ?CODE?
ASSUME CS,CODE,SS,STACK
ASSUME DS,DATA
MUSIC PROC FAR
PUSH DS SUB AX,AX
PUSH AX
MOV AX,DATA ;指向数据指针
第 6章 应用系统开发
MOV DS,AX
LEA SI,MUS_FREQ;将频率表的偏移地址送入 SI
LEA BP,DS,MUS_TIME;将节拍时间表的偏移地址送
入 BP
FREQ,MOVDI,[SI];取音符频率
CMP DI,-1;结束?
JE END_MUS;是, 退出
MOV BX,DS,[BP];取音符持续时间
第 6章 应用系统开发
CALL GENSOUND ;调用 GENSOUND发音子程序
ADD SI,2 ;频率表指针增 2
ADD BP,2 ;时间表指针增 2
JMP FREQ ;继续演奏
END_MUS,RET ;返回 DOS
MUSIC ENDP;
CODE ENDS
END MUSIC
返回本节
第 6章 应用系统开发
3.定时报警程序
图
6.
3
实
时
钟
中
断
处
理
流
程
图
第 6章 应用系统开发;利用 INT 1AH中断实现定时报警, 本程序在执行后,
若设置成功则首先显示;字符串, Set up all right,并使扬声器发声, 这表明
设置成功; 1分钟 ( 为定时时间,;读者也可自己设定 ) 后屏幕显示, !, 并发声, 以
示报警 。;汇编过程,MASM,ALARM.ASM;连接过程,LINK, ALARM+GENSOUND
EXTRN GENSOUND,FAR;定义外部调用程序
【 例 6.4】 TITLE ALARM——定时报警程序
第 6章 应用系统开发
STACK SEGMENT PARA STACK ?STACK?
DB 64 DUP( ‘ STACK﹒﹒﹒ ?
STACK ENDS;
DATA SEGMENT PARA PUBLIC ?DATA?
BJ DB ?Set up all right,?
DB 13,10,’ $?
DATA ENDS;
第 6章 应用系统开发
CODE SEGMENT PARA PUBLIC ?CODE?
ASSUME CS,CODE,SS,STACK,DS,DATA
ENTRY PROC FAR
PUSH DS;保存旧的数据段
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,4AH;读取 INT 4AH中断向量
上 一 页
第 6章 应用系统开发
MOV AH,35H INT 21H
PUSH ES;入栈保护 PUSH BX
STEP1,MOV AH,7;清除实时钟报警
INT 1AH
JC STEP1;进位位为 1则转移 ( 成功则转移 );
MOV AL,4AH;设置新的 INT 4AH中断向量
MOV DX,SEG ALARM
MOV DS,DX
上 一 页
第 6章 应用系统开发
LEA DX,ALARM MOV AH,25H
INT 21H CLI ;关中断
STEP2,MOV AH,2 ;利用 INT 1AH读当前实时钟时间
INT 1AH ;时, 分, 秒分别置入 CH,CL,DH
JC STEP2 ;不成功再读
MOV AL,CL
ADD AL,1 ;增 1分钟
DAA ;调整为 BCD码格式
CMP AL,60H ;是 60分吗 ( BCD数 )?
上 一 页
第 6章 应用系统开发
JL STEP3 ;不是, 则转移
MOV AL,00H;是, 改为 0分
STEP3,MOV CL,AL ;得到报警时刻的分值
MOV AH,6 ; CH,DH仍为原值
INT 1AH ;设置报警时刻
JC STEP2 ;不成功重做
STI ;开中断
MOV CX,12
SETUP,MOV AH,2;设置成功发出, 嘟嘟, 声
上 一 页
第 6章 应用系统开发
MOV DL,07H; 07H是振铃控制码
INT 21H;用 INT 21H 的 2号功能实现
LOOP SETUP;循环发声
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BJ;显示, Set up all
right,”字符串
MOV AH,9
INT 21H;
上 一 页
第 6章 应用系统开发
MOV DX,32000
MAINP1,MOV CX,25500;延时程序段, 等待报警
MAINP2,LOOP MAINP2
DEC DX
JNE MAINP1
RES,POP DX;恢复 INT 4AH 原中断向量
POP DS
MOV AL,4AH
MOV AH,35H
上 一 页
第 6章 应用系统开发
INT 21H RET
ENTRY ENDP;
ALARM PROC ;报警中断服务程序
PUSH AX PUAH BX
PUSH DI STI
MOV AH,2;显示字符 ‘ ! ’
MOV DL,‘ ! ’
INT 21H
上 一 页
第 6章 应用系统开发
MOV DI,300 ;发音频率
MOV BX,1400 ;发音延迟时间
CALL GENSOUND ;调用通用发声子程序
POP DI POP BX
POP AX IRET
ALARM ENDP
CODE ENDS;
END ENTRY ;程序结束
上 一 页
第 6章 应用系统开发
【 例 6.5】 用软中断 INT 60H、发声中断服务程序 INT 61H
以及软中断 INT 62H,INT 63H,实现字符串, intel
80486 DX2/66 CPU”显示、扬声器发声和变色三角形的显
示功能,定时器 ICH中断作为计数器使用。;
DATA SEGMENT PARA ?DATA? ;数据段
D1 DB 0DH,‘ intel 80486 DX2/66 CPU $?
D3 DW 0
D20 DB? DATA ENDS;
第 6章 应用系统开发
STAC SEGMENT PARA STACK ?STAC?;堆栈段
STA1 DW 100 DUP(?)
STAC ENDS;
CODE SEGMENT PARA ?CODE? ;代码段
ASSUME CS,CODE,DS,DATA
ASSUME SS,STAC,ES,DATA
STAR PROC FAR ;主程序开始
上 一 页
第 6章 应用系统开发
PUSH DS XOR AX,AX
PUSH AX MOV AX,DATA
MOV DS,AX MOV ES,AX
CLI;关中断
MOV AL,1CH;保存定时器时钟中断向量
MOV AH,35H
INT 21H
PUSH ES
上 一 页
第 6章 应用系统开发
PUSH BX PUSH DS
MOV DX,OFFSET RING;设置定时器时钟中断向量
MOV AX,SEG RING
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
IN AL,21H ;读 IMR中的屏蔽码
上 一 页
第 6章 应用系统开发
AND AL,1111110B;开放中断 0并保留中断屏蔽
设置
OUT 21H,AL;将新屏蔽码写入 IMR中
PUSH DS;入栈保护 DS寄存器
MOV DX,OFFSET I60;取 I60的偏移地址
MOV AX,SEG I60;取 I60的段基地址
MOV DS,AX
MOV AH,25H
MOV AL,60H
INT 21H
上 一 页
第 6章 应用系统开发
LEA DX,I61 ;设置 61H软中断向量
MOV AX,SEG I61
MOV DS,AX
MOV AH,25H
MOV AL,61H
INT 21H
LEA DX,I62 ;设置 62H软中断向量
MOV AX,SEG I62
MOV DS,AX
上 一 页
第 6章 应用系统开发
MOV AH,25H MOVAL,62H
INT 21H
LEA DX,I63;设置 63H软中断向量
MOV AX,SEG I63 MOV DS,AX
MOV AH,25H MOV AL,63H
INT 21H POP DS ; DS出栈
STI ;开中断
MOV DI,8000
上 一 页
第 6章 应用系统开发
DELAY,MOV SI,150
INT 60H ;调用 60H中断, 使程序进入
DELAY1,DEC SI ;循环状态
JNZ DELAY1 DEC DI
JNZ DELAY
POP DX ;恢复定时器控制 ( ICH) 中断向量
POP DS MOV AL,1CH
MOV AH,25H INT 21H
MOV AH,0 ;显示器恢复文本状态
上 一 页
第 6章 应用系统开发
MIV AL,3 INT 10H
RET STAR ENDP;
RING PROC FAR ;定时器中断服务程序
PUSH DS PUSH AX
MOV AX,DATA
MOV DS,AX STI
INC D20 ;计数单元加 1
上 一 页
第 6章 应用系统开发
B11,POP AX
POP DS
IRET ;中断服务结束返回
RING ENDP;
I60 PROC FAR ; 60H中断服务程序完成对
PUSH AX ; 61H和 62H中断的调用
PUSH DX
LEA DX,D1;显示 ‘ intel 80486 DX
上 一 页
第 6章 应用系统开发
2/66 CPU? MOV AH,9
INT 21H
CMP D20,2;中断延时到否?
JNE C11 ;到, 则转置 C11
MOV D20,0;否则使 D20清 0
INT 61H ;用发声中断 INT 61H
INT 62H ;用延时绘图中断 INT 62H
C11,POP DX
POP AX
上 一 页
第 6章 应用系统开发
IRET ;中断服务结束返回
I60 ENDP;
I61 PROC FAR ;声中断,INT 61H
PUSH AX PUSH CX
PUSH DX
MOV DX,140H ;置发音持续时间
IN AL,61H ; 8255A PB 口内容到 AL
AND AL,11111100B ; L的 D1D0位置 0
上 一 页
第 6章 应用系统开发
L1:
XOR AL,00000010B; L的 D1取反
OUT 61H,AL; L送 PB口, 控制扬声器发声
MOV CX,0F600H ;置方波信号频率变换时间常数
L2,LOOP L2 DEC DX
JNZ L1 POP DX;恢复现场
POP CX POP AX
IRET
I61 ENDP
上 一 页
第 6章 应用系统开发;
I62 PROC FAR ;延时调用绘图中断 INT 63H
PUSH CX PUSH DX MOV DX,40H
K1,MOV CX,440H
K2,LOOP K2 DEC DX
JNZ K1
INT 63H;调用软中断 63H
POP DX POP CX IRET
I62 ENDP
上 一 页
第 6章 应用系统开发;
I63 PROC FAR ;绘图中断程序 INT 63H
PUSH AX PUSH BX
PUSH CX PUSH DX
PUSH DS MOV AH,0
MOV AL,12H;设置显示模式 4( 图形方式
320*200)
INT 10N
MOV AL,1 ;设图形色号
A0,MOV DX,1;设置图形起点行坐标 DX=10
上 一 页
第 6章 应用系统开发
MOV D3,1 ;设图形第一行点数 D3=1
MOV CX,320;设图形起点列坐标 CX=160
A1,PUSH CX;入栈保护 CX
PUSH D3
A2,MOV AH,12
PUSH AX
INT 10H;写点 ( 12号功能调用 )
POP AX
INT CX;修改写点列坐标 CX=CX+1
上 一 页
第 6章 应用系统开发
SUB D3,1 ;修改写点计数 D3=D3-1
JNZ A2 ;判断 D3=0? 非 0到 A2
POP D3 ; D3=0,D3出栈
ADD D3,2 ; D3=D3+2修改点数
POP CX ; CX出栈
INC DX ; DX=DX+1( 起点行坐标 )
DEC CX ; CX=CX-1(起点列坐标)
JNE A1 ; CX=0? 非 0到 A1
JNC AL ; CX=0,AL=AL+1
上 一 页
第 6章 应用系统开发
CMP AL,4 ; AL=4?
JNE A0 ;非, 转到 A0
MOV AH,0;设置文本 80*25模式
MOV AL,3
INT 10H
POP DS ;恢复现场
POP DX
POP CX
POP BX
上 一 页
第 6章 应用系统开发
POP AX
IRET
I63 ENDP;
CODE ENDS
END STAR ;结束
上 一 页 返回本节