《《微型计算机系统原理及应用》课程设计电子时钟显示程序设计.doc》由会员分享,可在线阅读,更多相关《《微型计算机系统原理及应用》课程设计电子时钟显示程序设计.doc(16页珍藏版)》请在三一办公上搜索。
1、目录一、课程设计的目的 (2)二、课程设计的题目 (2)三、课程设计的主要内容 (2) (一)、程序论述 (2)(二)、程序设计的步骤 (2)(三)程序流程图(2)(四)程序 (4)(五)结果显示(14)四、总结(14)(一)、本设计主要用到的DOS、BIOS调用及功能 (14)(二)、心得体会 (15)五、参考文献(16)一、课程设计的目的:本次微型计算机原理及应用课程设计我选择了用汇编语言做电子时钟,其主要目的是加强软件编程能力。通过本次设计复习并熟练掌握微机原理中的基本操作指令、DOS中断功能调用以及BIOS中断功能调用。最主要的是使用汇编语言编程来实现现实中许多电子产品的功能。二、课程
2、设计的题目:电子时钟显示程序设计三、课程设计的主要内容:(一)、程序论述本次微型计算机原理及应用课程设计我做的题目是“电子时钟显示程序设计”,是使用汇编语言编程实现电子时钟显示的功能。主要提供了系统时间的调用,设置时间及显示时间等功能。在我所做的程序中主要以下面的内用运行。主程序首先注册新的中断处理程序从系统中取得时间,然后持续等待,直到在中断程序中检测到有按键时间的发生,然后主程序取消中断处理程序。判断输入的键,然后根据相应的按键提供相应的设置功能。中断处理程序每次得到系统定时器中断时间、,判断是否到达1秒,如果到达则更新时间,存入数据区,然后更新数据的显示。当有按键事件发生时,设置数据区的
3、按键标记为真。当主程序检查到该标记为真时,则取消中断程序的驻留。然后处理相应的事件。(二)程序设计的步骤:1、定义显示界面2、调用系统时间,并将调用的二进制表示的时间数转换成ASC码,并将时间存入内存区。3、将存在系统内存区的 时间数用显示字符串的形式显示出来。4、获取键盘的按键值,判断键值并推出系统。(三)程序流程图:开始设置输入字符串用缓冲区,定义变量初始化界面输入的ASC码转换成16进制数DOS调用,显示:welcome to Simple clock取得系统时间,时、分、秒分别存CH、CL、DH时间定时更新关中断开中断DH清零,CL加1CL清零,CH加1CH清零显示时间16进制转换成1
4、0进制显示字符串外部中断?结束(DH)60H??(CL)60H??(CH)24H?YYYYNNNN延时1秒(四)程序:.model small;- .stack;- .dataHOUR db ?MIN db ?SEC db ?MSEC db ? NHOUR db 0 ;设置时间使用NMIN db 0 ;设置时间使用NSEC db 0 ;设置时间使用FUNKEY db ? ;功能设置使用keySw db 00h ;是否按键开关SWITCH db 0FFh ;刷新开关,真,则不断在定时器中断函数中刷新,否则不刷新 n db 0dh,0ah,$ count dw 1 sMsg db * welcom
5、e to Simple clock *,0dh,0ah,$ qMsg db * Please Input q to quit *,0dh,0ah db ,* Input s to set new Time *,0dh,0ah,$ setTMsg db Please Input new Time(HH:MM:SS),0dh,0ah,$ authorMsg db _,0dh,0ah db Author: DingChuanxiang,0dh,0ah db E-mail: dingsg3c16,0dh,0ah db class: xin gong_042_08 hao,0dh,0ah db Date
6、: 2007/07/07,0dh,0ah db _,0dh,0ah,$;- .codePUSHA MACRO PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX ENDMPOPA MACRO POP DX POP CX POP BX POP AX POP DS ENDMmain proc far start: mov ax,data mov ds,ax push ds call GETTIME ;取得系统时间 call initUI ;初始化界面 mov al,1ch mov ah,35h int 21h ;DOS调用取中断向量 push es push bx pu
7、sh ds mov dx,offset tUpdate mov ax,seg tUpdate mov ds,ax mov al,1ch mov ah,25h int 21h ;DOS调用设置中断向量 pop ds in al, 21h and al, 11111100b out 21h,al stidelay: PUSHA cmp ds:keySw,0FFh ;检查是否有按键 jz exitdelay ;有按键则跳转 POPA jmp delayexitdelay: POPA pop dx pop ds mov al, 1ch mov ah, 25h int 21h ;DOS调用设置中断向量
8、pop ds ;restore ds ;读敲入的按键 mov ah,07h int 21h cmp al,s jne next1;判断读入字符然后进行相应处理,此时中断函数已经取消,只是单线程setT: mov ds:FUNKEY,al call SETTIME ;调用子函数设置时间 mov ds:keySw,00h jmp startnext1: cmp al,q je endmain mov ds:keySw,00h jmp startendmain: mov ax,4c00h ;exit int 21hmain endp;定时中断程序()tUpdate proc near push ds
9、 ;保存工作寄存器 push ax push bx push cx push dx mov ax, data mov ds, ax sti dec count ;时间间隔总数(约18.2次为1秒) jnz exit ;不到一秒则跳转 mov count,18 call CALTIME ;更新时间;检测刷新开关是否打开 mov bl,ds:SWITCH cmp bl,00 jz exit;检测是否有按键按下,取适当的值进行退出控制 PUSHA MOV AH, 0BH ;检测是否输入消息(按键消息) INT 21H INC AL JNZ nokey mov ds:keySw,0FFh ;设置已经被
10、按键 POPA jmp exitnokey: POPA call DISPLYH ;显示小时 call DISPLYM ;显示分钟 call DISPLYS ;显示秒exit: cli mov al,20h out 20h,al pop dx pop cx pop bx pop ax pop ds iret ;返回中断tUpdate endp;-;关闭定时刷新开关closeSw proc near PUSHA mov bl,0h mov ds:SWITCH,bl ;关闭刷新开关 POPA retcloseSw endp;-;打开定时刷新开关openSw proc near PUSHA mov
11、bl,0FFh mov ds:SWITCH,bl ;打开刷新开关 POPA retopenSw endp;-;初始化显示界面initUI proc near PUSHA ;设置显示方式(4025 黑白文本,16级灰度) mov ah,0h mov al,00h ;BIOS调用设置显示方式 int 10h ;显示头标题 mov dh,00h mov dl,00h call MOVCUR mov dx,offset sMsg mov ah,09h ;DOS调用显示字符串 int 21h ;call DOS ;显示结尾标题 mov dh,06h mov dl,02h call MOVCUR mov
12、dx,offset qMsg mov ah,09h ;DOS调用显示字符串 int 21h ;显示作者信息 mov dh,0bh mov dl,00h call MOVCUR mov dx,offset authorMsg mov ah,09h ;DOS调用显示字符串 int 21h POPA retinitUI endp;-;移动光标(dh:row,dl:col); dh ;参数设置行; dl ;参数设置列MOVCUR proc near PUSHA ;设置光标位置 mov ah,2h mov bh,0 int 10h POPA ret MOVCUR endp;-;显示小时DISPLYH P
13、ROC NEAR PUSHA ; 设置光标位置 mov dh,3h mov dl,13d. call MOVCUR mov dh,0 mov dl,ds:HOUR call output ;调用output函数输出小时 mov dl,: mov ah,02h int 21h POPA RETDISPLYH ENDP;-;显示分钟DISPLYM PROC NEAR PUSHA ;设置光标位置 mov dh,3h ;set Row No. mov dl,16d ;set Column NO. call MOVCUR mov dh,0 mov dl,ds:MIN call output mov dl
14、,: mov ah,02h int 21h POPA RETDISPLYM ENDP;-;显示秒DISPLYS PROC NEAR PUSHA ;设置光标位置 mov dh,3h ;set Row No. mov dl,19d ;set Column NO. call MOVCUR mov dh,0 mov dl,ds:SEC call output POPA retDISPLYS endp;-;调用DOS中断取得系统时间GETTIME PROC NEAR PUSHA mov ah,2ch ; 取得系统时间,CH:CL=(H:M),DH:DL=(s:1/100s) int 21h mov ds
15、:HOUR,CH ;取得小时 mov ds:MIN,CL ;取得分钟 ; dec DH ;延迟1秒 mov ds:SEC ,DH ;取得秒 mov ds:MSEC,DL POPA retGETTIME endp;-;调整时间,累加秒,分,时CALTIME proc near PUSHA ;调整秒 inc ds:SEC cmp ds:SEC,60d jb endc mov ds:SEC,0h setM: ;调整分钟 inc ds:MIN cmp ds:MIN,60d jb endc mov ds:MIN,0h setH: ;调整小时 inc ds:HOUR cmp ds:HOUR,24d jb
16、endc mov ds:HOUR,0h endc: POPA retCALTIME endp;-;设置时间SETTIME proc near PUSHA call closeSw ;关闭定时刷新 mov dh,11h mov dl,00h call MOVCUR ;移动光标 mov dx,00h mov ah,09h ;输出提示信息,提示输出设置时间 mov dx,offset setTMsg int 21h call READNT ;读取时间(HH:MM:SS);设置时间 mov ch,ds:NHOUR ;HOUR mov cl,ds:NMIN ;MIN mov dh,ds:NSEC ;SE
17、COND mov dl,0h ;1/100 SECOND mov ah,2Dh int 21h cmp al,00h je SetSuccess mov ah,02h ;设置时间中断调用失败处理 mov dl,! int 21h SetSuccess: call openSw ;打开刷新开关 POPA retSETTIME endp;-rSetSuccess: call openSw ;打开刷新开关 POPA ret;-;读取时间(从ASCII码到16进制数值的转换)(HH:MM:SS)READNT proc near PUSHA mov ah,01h int 21h mov bx,0h ;b
18、x存放得到的数值(16进制) loop1: cmp al,0 ;读取小时 jl endloop1 cmp al,9 jg endloop1 sub al,30h cbw xchg ax,bx mov cx,0ah mul cx xchg ax,bx add bx,ax mov ah,01h int 21h jmp loop1 ;存取小时endloop1: mov ds:NHOUR,bl; mov bx,0h; loop2: mov ah,01h int 21h ;bx存放得到的数值(16进制) cmp al,0 ;读取分钟 jl endloop2 cmp al,9 jg endloop2 su
19、b al,30h cbw xchg ax,bx mov cx,0ah mul cx xchg ax,bx add bx,ax jmp loop2 ;存取分钟endloop2: mov ds:NMIN,bl mov bx,0h loop3: mov ah,01h int 21h ;bx存放得到的数值(16进制) cmp al,0 ;读取秒 jl rlast cmp al,9 jg rlast sub al,30h cbw xchg ax,bx mov cx,0ah mul cx xchg ax,bx add bx,ax jmp loop3rlast: ;存取秒 mov ds:NSEC,bl PO
20、PA retREADNT endp;-;输出字符(dx中存放十进制数值)output proc near PUSHA mov ax,dx mov dx,00h mov cx,0h trans: mov bx,000ah div bx add dl,30h mov dh,0h push dx inc cx mov dx,00h cmp ax,00h jg trans cmp cx,01h jg print addZero: ;增加前导0,比如:02 mov dh,0 mov dl,0 push dx inc cx print: cmp cx,0h jle endout pop dx mov dh
21、,0 dec cx mov ah,02h int 21h jmp print endout: POPA retoutput endp ;- end start ;end assemble .end(五)结果显示: 四、总结: 1、本设计主要用到的DOS、BIOS调用及功能 DOS中断功能调用:AH功能调用参数返回参数01键盘输入并回显AL = 输入字符02显示输出DL = 输出字符07键盘输入(无回显)AL = 输入字符09显示字符串DS : DX = 串地址(S为串结束字符)0B检验键盘状态AL = 00 有输入 = FF 无输出25设置中断向量DS : DX = 中断向量 AL = 中断类
22、型号2C取时间CH :CL = 时 :分DH :DL =秒:1/100秒2D设置时间CH :CL = 时 :分DH :DL =秒:1/100秒AL =00 成功 = FF无效35取中断向量AL=中断类型号ES :BX = 中断向量4C带返回码结束AL = 返回码BIOS中断功能调用;AH功能调用参数返回参数0设置显示方式AL=00 4025黑白方式2设置光标位置BH = 页号DH、DL = 行、列2、心得体会 课程设计是培养学生综合运用所学的知识,发现、提出、分析和解决实际问题和锻炼能力的主要过程,是对学生实际能力的综合体现。这次微机原理课程设计历时两个星期,在这两个星期的日子里,可谓是历尽艰
23、难,但到最后还是取得了成功,学到了很多的东西。同时不仅巩固了以前所学的知识,而且学到了很多在书本上所没有学到的知识。 通过本次课程设计使我懂得了理论与实际相结合的重要性。只有理论知识其实是所谓的“纸上谈兵”那是远远不够的,只有把所学的理论知识与实践结合起来,从理论得出结论,从结论中分析过程,才能达到当代大学生必备的素质,从而为自己走向社会打下基础。 在整个设计过程中遇到的问题非常多,但在这方面处理上我摆正自己的位置,认识到自己基础知识的欠缺和对以前学习中对学过的知识理解的不够深刻,掌握的不牢固,所以在设计过程中我努力查阅资料,力求老师和同学的帮助,才得以顺利完成。 做程序设计是一个非常艰苦的过程。虽然编写程序一个人有一个人的方法,但是一步走错,程序就不能运行,以前在课本上接触的都是一些小的程序,但是这次设计我的程序长达10篇之多,要分析起来确实困难,好在我的写流程图的时候下了一番功夫,又对每个子程序进行推敲,也使较长的程序变的简单。在设计中使用了大量的DOS调用和BIOS调用,也对里面常用的功能号有了深刻的记忆。其次,以前对于编程工具的使用还处于一知半解的状态,但是经过一段时间的调试,对怎么去排错、查错、怎么去看每一步的运行结果都有了很大的提高。 微机原理课程设计很快结束了,在设计中有失落也有惊喜,有付出也有收获,最主要的是自己学到了知识,为下学期的单片机的课程设计打下了基础。