《汇编语言课程设计报告显示系统时间.doc》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告显示系统时间.doc(18页珍藏版)》请在三一办公上搜索。
1、 汇编语言课程设计报告课程名称: 汇编语言课程设计 设计题目: 显示系统时间 院 系: 计算机科学与技术学院班 级: 计专10703 设 计 者: 学 号: 200700172 序 号: 33 指导教师: 设计时间: 2009.06.08-2009.06.19目录1. 课程设计题目2. 课程设计内容3. 设计目的4. 设计图形5. 源代码6. 运行界面7. 感想体会一, 课程设计目的。 1.掌握中断的使用方法。2.掌握BIOS系统功能调用。3.掌握基本的显存读写技术。 4.学会用汇编语言编写一个较完整的实用程序, 培养自己的动手操作能力。5. 学习程序设计的基本思路和方法,编程、调试、撰写报告
2、等。二、程序内容: 第一部分:定义显示界面。 第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入显存区。(显存的起始地址:B8000H) 第三部分:将存在系统内存区的时间用字符串的形式显示出来。 第四部分:定时响铃功能,指定时间和倒计时。响铃为一首自写音乐。注意:1、如果用图形方式显示更好,2、注意设置显示时候的背景颜色3、可以增加键盘设置的功能,设置显示颜色,显示位置4、闹铃如果不关闭,可以设置为间隔1分钟再响三、程序设计原理 首先在数据段开辟一显示缓冲区,用来存储系统时间。调用BIOS中断,返回系统时间,并将来返回的二进制时间转换成ASCII码,方便时
3、间显示时的调用。分别将来小时数、分钟数、秒数存入显示缓冲区。通过写显存将时间显示出来。由于获取了的系统时间不会自动刷新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子钟了。定时功能主要指定一个报警时间作为比较,到了需要响铃时间调用一个音乐程序表示时间到。四、程序流程图 开 始获取原中断类型1CH 保存原中断类型 设置新的中断类型 执行中断处理程序 结束 保护现场 中断返回 读取系统时间 保存原中断类型分别将时间的BCD码转换为字符在指定位置写显存以显示时间 恢复现场 图一 主程序流程图 图二 中断处理程序流程图 开始播放音乐输入#输入1-7间隔1分钟停止闹铃开关是否关
4、开始闹铃A=B取系统时间A设置闹铃时间B结束五、程序代码eraserScreen macro ab ;清除过时显示的时间 push ax push cx push bx mov bx ,cloAddre ;当前地址 sub bx,ab ;得按键前地址 mov ax,0b800h mov es,ax mov di,bx lea si,blank call disptime pop bx pop cx pop ax endmclearscreen macro clor ;相当于清屏 ,指定颜色 push cx push si push di mov cx,1 lea si, blank write
5、char 0,0,clor,2000 pop di pop si pop cx endm writechar macro arra,row,color,cc ;在指定位置写入数据 local LP mov dl,arra ;第几列 LP: mov dh ,row ;第几行 mov ah,02 ;设置位置 mov bh, 0 int 10h mov al,si mov ah,09h mov bl,color ;颜色 push cx mov cx,cc int 10h add si,1 add dl,1 pop cx loop LP endm .model small.stack .data ;
6、-学生个人信息 MESS1 DB 0DH,0AH,0DH,0AH,0DH,0AH DB 9,9,9,-,0DH,0AH ;0DH,0AH是回车换行的意思 DB 9,9,9,| Students,33, information |,0DH,0AH DB 9,9,9,| name: zhangshuguang |,0DH,0AH DB 9,9,9,| class: three |,0DH,0AH DB 9,9,9,| Grade: Tow |,0DH,0AH DB 9,9,9, | Number: 200700172 |,0DH,0AH DB 9,9,9,- ,0DH,0AH,$ MSG1 DB
7、0DH,0AH,9,9,9,press any key to continue.,0DH,0AH,$ ;提示信息 ; - 菜单 MESS2 DB 0DH,0AH,0DH,0AH,0DH,0AH db 9,9,9,-,0DH,0AH DB 9,9,9,| 1- Create a music |,0DH,0AH DB 9,9,9,| 2- Time to ring a bell |,0DH,0AH DB 9,9,9,| 3- Exit |,0DH,0AH DB 9,9,9,- ,0DH,0AH,$ MSG2 DB 0DH,0AH,9,9,9, PRESS 1 OR 2 OR 3 ,0DH,0AH,
8、$ ;提示信息 ; - 变量数据 showMusicBook DB 0DH,0AH,0DH,0AH,0DH,0AH db 9,9,9 ,PRESS # TO CONCLUDE,0DH,0AH db 9, The Music book is: ,$ showMSG db PRESS Q TO STOP THE CLOCK,0DH,0AH db PRESS ESC TO EXIT,0DH,0AH db PRESS B TO BACK THR MAIN MU ,$ cloAddre dw 850h msgdown db the last:,?, ,S len equ $-msgdown blank
9、db 25 dup( ),0,0 msgring db Ring Ok!,10 dup( ) music db 337665654444334555666# INITAB dw 8E5H,7F4H,6ADH,5F1H,54BH,4B7H,472H setTime db Please set the time to ring,$ timer0 db ?,? timer1 db 0ffh sign db 0 year db ?,?,?,? db / mounth db ?,? db / day db ?,?,0,0 msg db The time is: time0 db ?,? db : tim
10、e1 db ?,? db : time2 db ?,?,0,0 .code.startup ; -程序开始 MOV AH,09H LEA DX, MESS1 INT 21H MOV AH,09H LEA DX, MSG1 INT 21H mov ah,07h int 21H START0: clearscreen 6fh mov ah,09h lea DX,MESS2 INT 21H LEA DX, MSG2 ;显示提示信息 MSG2 INT 21H LOP1: MOV AH,08H ;从标准输入设备输入一个字符,在此是用户输入所选菜单 INT 21H ;-判断从键盘输入的选项 PUSH AX
11、 CMP AL,3 JZ C3 POP AX PUSH AX CMP AL,1 ; JZ (相等的时候跳转) JZ C1 ;若等于1,则跳转到C1 POP AX ;否则AX出栈,并与2比较 PUSH AX CMP AL,2 JZ C2 POP AX JMP LOP1 ;否则跳转到LOP1,即重新输入一个字符(1/2/3) ;- 此为前面所要跳转的程序 C1: clearscreen 6fh call creatMiusic ;创作铃声 mov byte ptr sign,1 ;闹铃开启 call clock mov byte ptr sign,0 ;闹铃关闭 JMP START0 C2: JM
12、P START1 C3: JMP over;- 设置闹钟闹铃时间 START1: clearscreen 6fh push dx push bx mov dl,10 ;第几列 mov dh ,5 ;设置光标位置 mov ah,02 mov bh, 0 int 10h lea dx, setTime mov ah,09h int 21h pop bx pop dx push si push cx lea si,timer0 mov cx ,2 ;-;输入需闹铃时间 input: mov ah,02h mov dl,: ;冒号输出 int 21h mov ah,01h int 21h ;- ;以下
13、为输入有效值的判断,时针在00-23有效,分针在00-59有效 .if cx=2 ;输入时高位 .if al2 pop cx pop si jmp START1 .elseif al5 pop cx pop si jmp START1 .elseif al3 pop cx pop si jmp START1 .elseif al9 pop cx pop si jmp START1 .elseif al9 pop cx pop si jmp START1 .elseif al0 pop cx pop si jmp START1 .else sub al,0 sub bl,0 push cx mo
14、v cl,4 shl bl,cl pop cx add bl,al mov byte ptr si,bl add si,1 .endif .endif dec cx jnz input startcha: PUSH DX PUSH BX mov dl,0 ;第几列 mov dh ,0;设置光标位置 mov ah,02 mov bh, 0 int 10h POP BX POP DX mov dx,offset showMSG mov ah,09h int 21h ; - 读取系统时间 startloop: push cx push dx push es push si push di mov a
15、h,2ah ;获取系统时间,cxyear dhmouth dlday,为十六进制表示 int 21h call translate ;转化寄存器中值为BCD码格式 mov al,ch lea si,year call bcd ;将BCD码转化为可以输出的相应字符 mov al,cl lea si,year2 call bcd mov al,dh lea si,mounth call bcd mov al,dl lea si,day call bcd mov ax,0b800h ;将年月日写入显存 mov es,ax mov di,720h lea si,year call disptime p
16、op di pop si pop es pop dx pop cx mov ax,0200h ;获取系统时间,chhours clminutes DHseconds,均为BCD码格式 int 1ah mov al,ch lea si,time0 call bcd mov al,cl lea si,time1 call bcd mov al,dh lea si,time2 call bcd mov ax,0b800h ;显存地址 采用直接写显存的方法输出字符 mov es,ax ;es:di 指向显存地址 mov di,cloAddre ;变量cloAddre为偏移地址 lea si,msg c
17、all disptime ;显示时间 ; - 判断是否闹铃 mov al,sign ;判断闹铃是否开着sign为1表示没有开着 or al,al jnz to ;若闹铃没关,整分闹铃 mov al,ch xor al,timer00 ;比较时针 jnz disp0 mov al,cl xor al,timer01 ;继续比较分针 jnz downc or dh,dh jnz disp0 mov byte ptr sign,1 ;闹铃开启 call clock ;闹铃 jmp disp0 ; - 判断倒计时 to : mov al,dh cmp al,51h jb to1 sub al,51h
18、call countDown to1: mov al,cl cmp al,timer1 jna to2 ;分针变化则闹 call clock to2: mov byte ptr timer1,cl jmp disp0 downc : mov al,cl ;判断分针,是否可以准备闹铃 add al,1 xor al,timer01 jnz disp0 mov al,dh cmp al,51h ;倒数十秒开始闹铃 jb disp0 sub al,51h call countDown ; - 键盘控制时间显示位置 disp0: mov ah,01h int 16h ;从键盘缓冲区读取扫描码 ;- 是
19、否按了Q键 cmp ah,10h jne i0 mov byte ptr sign,0 ;关闭闹铃 call clear jmp startloop ;- 是否按了上方向键 i0: cmp ah,48h jne i1 sub cloAddre,160 call clear eraserScreen 0ff60h ;当前地址减160 jmp intend ;直接结束一次中断,以避免修改其它单元内容 ;- 是否按了左方向键 i1: cmp ah,4bh jne i2 sub cloAddre,2 call clear eraserScreen 0fffeh ;当前地址减2 jmp intend ;
20、-是否按了下方向键 i2: cmp ah,50h jne i3 add cloAddre,160 call clear eraserScreen 160 ;当前地址加160 jmp intend ;- 是否按了右方向键 i3: cmp ah,4dh jne i4 add cloAddre,2 call clear eraserScreen 2 ;当前地址加2 jmp intend ;直接结束一次中断,以避免修改其它单元内容 ; - ;是否按了ESC键 i4: cmp ah,01h jne i5 jmp over ; - ;按以下键变化不同种颜色 i5: .if ah=1eh ;按A键变色 cl
21、earscreen 04h call clear jmp startcha .elseif ah=1fh ;按S键变色 clearscreen 1eh call clear jmp startcha .elseif ah=20h ;按D键变色 clearscreen 0e0h call clear jmp startcha .elseif ah=21h clearscreen 23h call clear jmp startcha .elseif ah=22h clearscreen 41h call clear jmp startcha .else jmp i6 .endifi6: cmp
22、ah,30h ; 按B 键 je START0 ;返回主菜单 intend : call clear jmp startloop ; -bcd码转换 bcd: mov ah,al push cx mov cl,4 shr ah,cl pop cx and al,0fh add ax,00 xchg ah,al mov ds:si,ax ret ; -退出 over: mov ax,4c00h int 21h ; - 显示时间子程序 disptime proc disp : mov al,si inc si or al,al jz back cld stosb ;将al传送到es:di inc di jmp disp back: ret disptime endp ; -编写音乐子程序 creatMiusic proc push ax push si push cx push dx mov dx,offset showMusicBook mov ah,09h int 21h