计时器汇编语言程序设计 (1)Word文档格式.doc
《计时器汇编语言程序设计 (1)Word文档格式.doc》由会员分享,可在线阅读,更多相关《计时器汇编语言程序设计 (1)Word文档格式.doc(20页珍藏版)》请在冰豆网上搜索。
当时的十位达到2时,个位为4时,程序跳到清零部分,程序从零开始计时。
数码管显示部分的功能是实现时、分、秒的显示,可以用六个数码管从左至右一次显示时间,采用分配存储单元的形式,地址从低到高分别显示秒、分、时。
延时部分是对秒的个位进行延时,延时中调用系统时钟显示程序,以便连续不断地显示并实现一秒延时的计时功能,从而实现电子时钟的设计。
2.2方案二
利用DOS功能设计界面显示时间00:
00:
00,在MFS中的微机原理实验集成环境MF2KP中编写程序,根据设计要求,需要界面设置,键盘按键输入检测,显示初值时间,显示形式,键盘控制设置,时间进位处理,设置中断频率,暂停和继续计时。
通过调用系统的08h号或者1ch号中断来进行设置,使其能够产生100Hz即10ms一次的中断,同时修改原08号中断的入口地址,使其每次中断执行一次计时的中断服务程序,进而动态显示时间。
2.3方案论证
方案一要用到8155芯片和数码管,而且计时器是调用系统时钟完成的,这种方法必须每秒或者每更短的时间调用系统时钟然后进行相减操作才能达到计时的每秒时时显示动态时间,虽然理论上可以实现计时功能,但是会比较的麻烦。
方案二通过调用系统的08h号或者1ch号中断来进行设置,使其能够产生100Hz即10ms一次的中断进而动态显示时间。
这种方法不仅简单易行,而且较方便。
而且方案二在DOS环境下运行的,不需要额外的芯片,所以方案二更好更合适。
3程序流程图
3.1主程序流程图
主程序流程图如图3-1所示,主程序是用来完成屏幕初始化:
清屏和显示初始界面,同时对键盘按键输入检测和对键盘按下的键值进行判断,执行相应键值所对应的程序,达到开始、暂停、继续、清零、退出的功能。
进而动态显示和控制时间。
3.2中断服务子程序流程图
中断服务子程序流程图如图3-2所示,中断服务子程序的功能是每次中断执行一次该程序,对十毫秒位、百毫秒位、秒位、十秒位、分钟位、十分钟位、小时位和十小时位进行加1和判断是否进位操作,即达到该时间的情况下就给该时间对应位进行加1操作,使其能够显示正确的动态的时间。
停止计时
显示停止计时时间
清零
显示初始时间
继续计时
显示动态时间
开中断计时
结束
按ESC键
按c/C键
按g/G键
检验键盘状态
按下p/P键
按下s/S键
读字符
显示提示语和初值时间
清屏
开始
图3-1主程序流程图清零
退出中断
十小时位加1
十h位<
3
小时位<
10
N<
24
小时位加1
N加1(N初值为0)
十分位<
6
十分钟位加1
ms位<
分钟位加1
十秒位<
十秒位加1
秒位<
十ms位<
秒位加1
十ms位加1
毫秒位加1
设置中断频率
开中断
设置中断屏蔽器
设置中断入口地址
图3-2中断服务子程序流程图
4.程序设计步骤
4.1界面设置
在DOS界面中显示时间,要输入输出数据,需要设置界面。
界面设置需要用到DOS功能调用的INT10H指令。
INT10H是由BIOS对屏幕及显示器所提供的服务程序,使用INT10H中断服务程序时,先指定AH寄存器为下表编号其中之一,该编号表示欲调用的功用,当一切设定好之后再调用INT10H。
1.设置光标形状:
movah,1;
置光标类型,不显示光标
movch,20h
int10h
2.设置光标位置:
movdh,0;
行号
movdl,0;
列号:
movbh,0;
页号
movah,2;
置光标位置
3.在Teletype模式下显示字符:
show3:
movah,0eh;
显示字符(光标前移),al字符,bl前景色
moval,[si]
incsi
loopshow3
为了使计时器的显示界面更加直观更加清楚,所以可以在int10h的情况下将AH赋值为06,初始化屏幕,同时置AL为00H而且为全屏空白,同时颜色通过在int10H的情况下BH=000ch显示为红色,这样计时器会更加醒目。
4.2检验键盘状态
由于要实现键盘按下不同的键值实现各种不同的功能,所以需要判断键盘输入的为哪个键。
首先检查键盘是否有输入,若没有输入,则跳过检查键盘输入的键值的程序,若有输入则比较输入为何种键,接着执行该键值对应要完成的功能的程序。
检验键盘状态程序如下:
movah,0bh;
检验键盘状态,有输入al=00,无输入al=0f
int21h
incal
jnzs1
movah,08h;
键盘输入无回显,(al)=输入字符
cmpal,1bh;
按下Esc键结束程序
jegoout
cmpal,'
p'
;
按下p键停止计时
jepause
P'
c'
按下c键清零
jeclear
C'
按下C键清零
jmps1
4.3中断子程序
1.08H号中断入口地址设置
由于要使用08H号中断来实现,计时功能,所以首先要获得08H号中断的原来的入口地址,AL里存中断类型号,将其存在了ES:
BX里,接着设置其新入口地址,将新的中断向量存在DS:
DX里就可以实现设置新入口地址。
具体的代码实现如下:
moval,08h
movah,35h;
获取08h号中断的原入口地址
pushes
pushbx
pushds
movax,segint08h
movds,ax
movdx,offsetint08h;
设置08h号中断的新入口地址
moval,08h
movah,25h
int21h;
调用08h号中断的服务程序
popds
2.中断屏蔽器设置
中断屏蔽寄存器的I/O端口地址是21H,它的8位对应控制8个外部设备。
某位为0允许某外部设备中断,为1则表示某外部设备的中断请求被屏蔽。
由上图可以看出要使键盘和定时器允许外部中断,则令其对应的位置零,同时使其他设备不允许外部中断。
于是可通过以下代码进行设置:
inal,21h
pushax
moval,11111100b
out21h,al
3.中断频率设置
根据设计要求,需要使系统内部8253输出方波频率为100Hz,所以要对08H号中断设置,使其能够10ms一次中断,同时要使其工作在通道0方式3的方波发生器。
8253是微机系统常用的定时器芯片,它有三个独立的16位减法计数器,每个计数器分配一个端口地址,分别为40h,41h,42h。
还有一个控制寄存器,端口地址为43h。
把中断子程序的段地址和偏移地址送到08H中断向量中,由于08H中断向量硬件中断,计数器0的输出端OUT与中断控制器8259A的一位相连每秒中断18.2次,故需要把18.2HZ改为100HZ,而CLK0的输入频率是1.1931817MHZ,故需把1.1931817除以100的初始值送到40H端口就可以实现每秒100次的中断。
所以设置计数初值为11932,这样就可以达到10ms中断一次。
实现该功能的代码如下:
moval,00110110b;
设置通道0的方式3
out43h,al
movax,11932;
定时器的时钟频率为1.1931817MHz,计数初值=1193182/100=11932
out40h,al
moval,ah
4.4判断计时进位
当十毫秒位超过9的时候,要对百毫秒位进1,如果百毫秒位超过9时,要对秒位进1,当秒位超过,9时,对十秒位进1,如果十秒位超过5时,才对分钟位进1,分钟位超过9时,对十分钟位进1,如果十分钟位超过5时,对小时位进1。
小时位的进位设计就要考虑到小时最多24的特殊性了,所以设置一个变量,在小时位加1的同时给它也加1.如果这个变量加到了24则重新开始计时,此时再把变量置零。
实现此部分功能的程序代码如下:
incmsec2;
十毫秒位加1
cmpmsec2,3ah;
十毫秒位是否小于100
jbt
movmsec2,30h
incmsec1
cmpmsec1,3ah;
百毫秒位是否小于10
movmsec1,30h
incsec2
cmpsec2,3ah;
秒位是否小于10
movsec2,30h
incsec1
cmpsec1,36h;
十秒位是否小于6
movsec1,30h
incmin2
cmpmin2,3ah;
分钟位是否小于10
movmin2,30h
incmin1
cmpmin1,36h;
十分钟位是否小于6
movmin1,30h
inchou2
incn
cmpn,24;
比较是否到了24小时,到了就跳到清零程序
jzqinling
cmphou2,3ah;
小时位是否小于10
movhou2,30h
inchou1
cmphou1,33h;
十小时位是否小于3
movhou1,30h
t:
moval,2