单片机-BIOS、DOS系统功能调用
- 格式:doc
- 大小:81.00 KB
- 文档页数:11
目录
一、课程设计目的
二、任务介绍及小组成员任务分配
三、设计思想及主要流程图
四、主要程序清单
五、运行结果及分析
六、收获、体会及建议
- 1 - 一、课程设计目的
1. 进一步熟悉BIOS、DOS系统功能调用,了解基本的显存读写技术;
2. 了解响铃符以及利用PC扬声器发出不同频率声音的方法;
2. 学会用汇编语言编写一个较完整的实用程序,培养自己的动手操作能力;
3. 学习汇编语言程序设计的基本思路和方法,编程、调试、撰写报告等;
二、任务介绍及小组成员任务分配
小组成员 任务分配
祝丹丹 写程序
林哈特 写程序
胡耀斌 写程序
三、设计思想及主要流程图
1、时间的获取
调用系统日期和时间,并将调用的日期和时间数转换成ASCII码存在系统内存区的字符串中。将存在系统内存区的日期和时间用字符串存入显存区(显存的起始地址:B800:0000)并在合适的位置显示出来。由于获取了的系统时间不会自动刷新,所以我们要设计成刷新的方式(如利用定时器中断,中断类型号为1CH)来不断获取系统的时间,这样就形成了会跳动的电子钟了。
2、屏幕特定位置显示字符
对应屏幕上的每个字符位置,显存空间都有相应的存储单元与之对应。对应显示在屏幕上的每个字符,在存储器中由连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。属性字节对单色显示和彩色显示都是有效的。我们可以使用BOIS显示中断10H的各项功能来进行显示字符的编程。
3、主要流程图 - 2 - 主程序流程图 中断处理程序流程图
四、主要程序清单
data segment
count dw 1
mess1 db '------------------',0dh,0ah,'$'
info db 'Current time is :',0dh,0ah,'$' ;提示语
datestr db '00-00-0000',0dh,0ah,'$' ;日期显示信息:month-day-year
timestr db '00:00:00',0dh,0ah,'$' ;时间提示信息:hour:minute:second
mess2 db '------------------',0dh,0ah,'$'
mess3 db 'Please input"Q",to quit!',0dh,0ah,'$';提示语
data ends
code segment
assume cs:code,ds:data
mainproc far
start:
mov ax,data
mov ds,ax
mov ah,6 ;ah=06(滚动)al=00(全屏空白) 开 始
获取原1CH中断向量
保存原中断类型设置新1CH的中断向量
恢复原1CH的中断向量
结束 保护现场
中断返回 读取系统日期、时间 保存原中断向量
分别将时间的时、分、秒转换为ASCII码
在指定位置显示日期和时间
恢复现场 开定时器中断
执行中断处理程序断 - 3 - mov al,0
mov bh,60h ;设置背景颜色和前景颜色
mov cx,0
mov dx,1950h ;右下角行号,列号
int 10h
mov dh,5
mov dl,24
mov bh,0
mov ah,2
int 10h
mov dx,offset mess3
mov ah,09h
int 21h
mov dh,11
mov dl,24
mov bh,0
mov ah,2
int 10h
mov dx,offset mess2
mov ah,09h
int 21h
mov dh,7
mov dl,24
mov bh,0
mov ah,2
int 10h
mov dx,offset mess1
mov ah,09h
int 21h
;--------------------
mov dh,8 ;设置到7行30列 - 4 - mov dl,25
mov bh,0
mov ah,2
int 10h
mov dx,offset info
mov ah,09h
int 21h
;保存原中断向量
mov al,1ch
mov ah,35h
int 21h
push es ;获取1ch中断向量到es:bx
push bx
push ds ;保存
;设置新的中断向量
mov dx,offset intpro
mov ax,seg intpro
mov ds,ax
mov al,1ch
mov ah,25h
int 21h ;设置中断向量ds:dx
pop ds
in al,21h ;读中断屏蔽寄存器
and al,11111110b ;开定时器中断
out 21h,al ;写中断屏蔽寄存器
sti ;开中断
;等待中断
s:
mov ah,0 ;调用键盘I/O中断功能号0,获取键值到AL
int 16h
cmp ah,10H
jz quit ;是Q键,退出程序
jmp s
;恢复1ch原中断向量
quit: pop dx - 5 - pop ds
mov al,1ch
mov ah,25h
int 21h
mov ax,4c00h
int 21h
mainendp
;-------------------------------------------------------------------
;中断处理程序intpro
;-------------------------------------------------------------------
intpro proc near
;保护现场
push ds
push ax
push cx
push dx
push bp
push es
mov ax,data
mov ds,ax
sti
dec count
jnz exit
call dispdate ;调用函数显示日期和时间
call disptime
MOV count,18
;声音
mov dl,07
mov ah,2
int 21h
exit: - 6 - cli
pop bp
pop es
pop dx
pop cx
pop ax
pop ds
iret
intpro endp
;---------------------------------------------------------------------
;显示日期子程序dispdate
;---------------------------------------------------------------------
dispdate proc near
push ax
push cx
push dx
push si
;获取系统日期:入口:ah<-2ah,出口:cx<-year,dh<-month,dl<-day
mov ah,2ah
int 21h
mov ax,cx ;年份转4位ascii码
mov bx,10
lea si,datestr+9 ;指向字符串年份最后一位
mov cx,4 ;年份4位,循环4次
push dx ;保存月日
y: xor dx,dx ;dx清零,保存余数即个位
div bx ;商存ax,余数存dx
add dl,30h ;转ascii码,存datestr字符串末尾
mov [si],dl
dec si
loop y
pop dx ;还原dx,处理日