基于TPC-USB实验系统的时钟系统设计方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于TPC-USB实验系统的时钟系统设计方案第一部分概论
随着计算机使用的日益普及,计算机已成为了人们日常生活中不可分割的一部分。
而时钟,不仅早已是人们日常生活的必需品,更是计算机系统核心运行中作为中流砥柱的其中一部分。
这点在分时操作系统中尤为体现。
微机系统常需要为处理机和外设提供时间标记,或对外部事件进行技术。
例如系统的程序切换,向外设定是周期性地输出控制信号,外部事件发生次数达到规定值后产生中断,以及统计外部事件发生的次数等,因此,需要解决系统的定时问题。
定时的本质就是计数。
只要把若干小片计时单元累加起来,就可获得一段时间。
而微机系统中的定时分为两类:一类是计算机本身运行的时间基准——内部定时,是计算机每种操作按照严格的时间节拍执行;另一类是外部设备实现某种功能时,在外设与CPU之间,或外设与外设之间的时间配合——外部定时。
前者,已由CPU硬件结构确定,有固定的时许关系,无法修改;后者,由于外设或被控对象的任务不同,功能各异,没有一定的模式,需要用户自己设定。
而用户在考虑外设和CPU连接时,不能脱离计算机的定时要求,应以计算机的时序关系作为一句,设计外部定时机构,以满足计算机的时序要求,进行时序配合。
至于在一个过程控制中,用户可以按照各个控制对象的性质和规律独立进行设计各自的定时关系。
本文基于TPC-USB试验系统,通过可编程计数/定时器8253、可编程并行I/O接口8255A 及LED七段显示器进行具有可取当前系统时间、可自定义时间并运行及显示功能的时钟系统设计。
经实验验证,该设计方案是完全可行的。
第二部分硬件设计
1. 硬件基础
1.1 TPC-USB实验系统简介
TPC-USB通用微机接口实验系统是清华大学计算机系研制,清华大学科教仪器厂生产的学生实验系统。
该系统由一块USB总线接口模块、一个扩展实验台及软件集成实验环境组成。
USB总线接口模块直接通过USB总线电缆与PC机相连,模块与实验台之间由一条50芯扁平电缆连接。
(1)50芯总线信号插座及总线信号插孔
50芯总线信号插座在实验台左上方,总线插座信号安排如上表。
各总线信号采用“自锁紧”插孔在标有“总线”的区域引出,有数据线D0-D7、地址线A19-A0、I/O读写信号IOR IOW、存储器读写信号MEMR MEMW、中断请求IRQ、DMA申请DRQ、DMA回答DACK、AEN 等。
(2)时钟电路
如下图所示,输出1MHZ、2MHZ两种信号,供定时器/计数器、A/D转换器、串行接口实验使用。
2. 硬件设计
2.1 基于TPC-USB实验系统总线与时钟系统的连接
基于TPC-USB实验系统总线与时钟系统的连接入下图2.1:
8253
芯
片
8255
芯
片
图2.1:系统连接框图
(1)如图2.1所示,频率为1MHZ的脉冲输入经过8253通道0的CLK1 ,变成频率为100HZ的方波由OUT0输入,再将OUT0输出的脉冲由CLK1输送给8253的通道1,最后由OUT1输出1个每秒产生一个长度为1/100秒长度的低电平的脉冲信号;再将这个信号经过反相输入到TPC-USB实验系统的中断口IRQ3,从而实现每秒送出一个中断信号给CPU,CPU实现计时功能。
CPU经由8255芯片将时间信息输送到7段数码管显示。
(2)主要信号线连接论述:
D0~D7:TPC-USB实验系统上的D0~D7是8088上的数据线,用来传送数据;而8255、8253是I/O芯片,它们的数据线是用于CPU与芯片间传送数据的,因此可以把8255、8253上的数据线直接与TPC-USB实验系统上的D0~D7相连。
RD与WR:8255、8253芯片对于CPU来说是I/O设备,要使8255、8253芯片上的RD和WR信号有效,必须使CPU的I/O与WR、RD同时有效,而PC/XT总线上的IOR和IOW 是I/O读和I/O写,所以只要把8255、8253芯片上的WR、RD分别与PC/XT总线上的IOR 和IOW直接相连就可以了。
当CPU执行外设写操作时,WR有效;当CPU执行外设读操作时,RD有效。
CLK:TPC-USB实验系统上提供了1MHZ和2MHZ的时钟,因此,只需把TPC-USB系统板上的1MHZ直接连接到8253的CLK0信号.
A0、A1:A0、A1是8255、8253芯片的控制/与端口选择,分时复用。
用来区分当前读/写的是控制端口还是其他端口(8255为A、B、C口地址;8253则为选择3个通道中的一个)。
将A0、A1直接与8255、8253芯片相连,通过改变A0、A1的值可以实现片内选。
PA0~PA6:PA0~PA6是8255 端口A的口,与7段数码管的a~g直接相连,输送时间信息.
PC0、PC1:PC0、PC1是8255端口C的口,与7段数码管的s1、s2直接相连,其中s1、s2是7段数码管的端口,系统通过C口输送信息到s1、s2选通数码管工作.
GA TE0、GATE1:门控输入信号——控制计数器工作(允许/禁止计数,启动/停止计数),可分成电平控制和上升沿控制两种类型。
用于系统要求门控信号总为高,因此直接与5V相连
CLK1-OUT0:由于系统要求获得1HZ的中断频率,TPC-USB只能提供1MHZ的脉冲信号,而8253的初始字最大为65563,不能满足要求.因此需把1MHZ的脉冲信号降频来满足8253对输入频率的要求.因此先将1MHZ经过8253通道0降频后由OUT0输出到通道1的CLK1,因此直接将CLK1连接到OUT0上。
OUT1-非门:由8253通道1产生的1MHZ的脉冲信号通过中断IRQ3引起系统中断程序实现时钟功能。
IRQ3当有高电平时就向CPU发出个中断请求,而通道1产生的脉冲信号为每秒由OUT1发出个长度为0.01秒的低电平;因此需要通过非门将信号转换成高电平。
2.2可编程计数/定时器8253
2.2.1 8253主要特性
•有3个独立的16位计数器/定时器,即3个独立通道
•每个计数器有6种工作方式
•按二进制或十进制(BCD码)计数
•计数脉冲可以是系统脉冲,也可以是外部事件
•触发方式可以是软禁啊出发或硬件触发
2.2.2 8253的内部结构和引脚
8253为24脚,双列直插式芯片。
其引脚排列与内部结构如图所示。
和8255A一样,其内部有一个三态数据缓冲器,以保证未选中时内部数据线和系统数据总线是“脱开”的。
三个计数器在使用时是独立的。
每一个计数器对外有三个引脚:CLK为计数脉冲输入,GATE为门控信号(允许/禁止计数),OUT为输出信号。
每一个计数器占用一个I/O端口地址,加上控制字口,一片8253共占用4个I/O端口地址。
和8255A一样,8253也设置了两个用于端口寻址的引脚A1和A0。
这两个信号与片选信号、CPu读/写信号相配合,实现对8253内部端口的操作。
CLK时钟输入信号——在计数过程中,此引脚上每输入一个时钟信号(下降沿),计数器的计数值减1
GA TE门控输入信号——控制计数器工作(允许/禁止计数,启动/停止计数),可分成电平控制和上升沿控制两种类型
OUT计数器输出信号——当一次计数过程结束(计数值减为0),OUT引脚上将产生一个输出信号
2.2.3 8253的工作方式
8253共有6种工作方式,下面分别说明每一种方式的要点。
2.2.
3.1 方式0——计数到终点输出变为高电平
当将某计数器设置成方式0后,其输出OUT变低电平,装入初值后,仍保持低电平。
门控为高电平开始计数。
每来一个计数脉冲CLK,计数器的值减1,当计数到达终点即计数器的值变为0时,OUT变为高电平。
在计数期间可用门控信号暂停计数(即门控为低电平时,计数暂停)。
输出端OUT由低变高可以用来作为中断请求信号,也可作为查询信号,也可直接去控制某个操作,如让某个开关动作。
2.2.
3.2.方式1——可编程单稳
所谓单稳,是指这样的电路,它有两种状态,但只能稳定在一种状态。
在一定的外界作用下,它能从这一种状态进入到另一种状态,但经过一定时间后,又自动恢复到原来的状态。
这个时间参数一般是由外加电阻、电容的值决定的。
8253的方式1就是模拟单稳电路,其处于非稳定状态的时间可通过程序进行设置。
一旦8253的某计数器被设置成方式1后,其OUT变高电平,装入初值后,仍保持高电平,等待门控上升沿到来。
门控为电平高后的第一个CLK下降沿时0UT变低电平,初值又被重新装
入一次,并开始计数,每来一个计数脉冲,计数器的值减1。
当减到0时OUT变高电平。
此后门控的上升沿可再次启动此过程。
门控上升沿的到来使得OUT开始输出负脉冲(这种现象叫触发),其宽度为CLK的周期乘以预置值。
如果在负脉冲期间,即计数未到达终点,GATE再来一个上升沿,则再次赋初值,重新开始计数。
2.2.
3.3 方式2——分频脉冲发生器(分频器)
方式2用来对输入脉冲(即计数脉冲CLK)N分频(N为预置的初值),在输出信号周期中低电平的时间为一个CLK周期。
设置此方式后,OUT变高电平,装入初值后便自动开始计数,减到1时OUT变低电平。
经过一个CLK周期,OUT恢复高电平,且计数器又自动装入初值,重新开始计数。
如此循环下去。
如图6.23所示是工作在方式2的示意图。
在上述过程中GATE应一直保持高电平。
若GATE 变低电平将禁止计数,并使输出为高电平。
在GA TE再次变高电平时,计数器将重新装入预置的初值,并开始计数。
2.2.
3.4 方式3——方波发生器
方式3类似于方式2,输出是周期性的。
不同的是方式3输出方波。
如果预置的初值N为偶数,则输出周期中高电平和低电平的宽度相等;如果N为奇数,则输出周期中高电平比低电平多一个CLK周期的时间,当N相当大时,也可认为是方波。
当然,一般采用方式3时,置初值为偶数。
设置成方式3后,OUT变高电平,装入初值后便自动开始计数。
如初值为偶数,每个CLK使计数器减2,计到终点改变电平。
如初值为奇数,则输出为高电平时第一个CLK使计数器减1,随后每个CLK使计数器减2;输出为低电平时第一个CLK使计数器减3,随后每个CLK使计数器减2。
每当计数到终点都会改变电平,初值又被重新装入,并开始计数。
如此循环下去,如图6.24所示。
和方式2一样,GA TE变低可暂停计数。
2.2.
3.5 方式4——软件触发选通
设置成方式4后,OUT变高电平,写入计数值后自动开始计数(所以称之为软件触发),计数到终点输出一个CLK周期的低电平脉冲。
GATE变低可暂停计数,用GATE的上升沿可重新赋初值,并开始计数。
2.2.
3.6 方式5——硬件触发选通
设置成该方式后,OUT变高电平,写入计数值后需等待GATE上升沿的到来才开始计数(所以称之为硬件触发)。
计数到终点也输出一个CLK周期的低电平脉冲。
计数过程中不受GATE电平的影响。
此后,用GATE的上升沿可重新赋初值,并开始计数。
在本时钟系统设计中,分别使用了8253的方式3和方式2作为系统工作的方式。
2.3可编程并行I/O接口8255A
2.3.1 可编程并行输入/输出接口8255A 的结构
Intel 8255A是一种可编程并行输入/输出接口。
所谓并行,是指数据的各位同时传送。
8255A只支持字节数据的并行传送。
8255A为40引脚、双列直插封装。
其引脚排列及内部结构示意图如图所示。
由图可看出,它由数据端口、组控制电路、数据总线缓冲器、读/写控制逻辑等组成。
2.3.1.1.数据端口
8255A有3个8位数据端口:端口A、端口B和端口c,分别简称为A口、B口和C口。
它们对外的引线分别是PA7~PA0、PB7~PB0和PC7~PC0。
每一个端口都可由程序设定为输入或输出。
c口可分成两个4位的端口:c高4位口(Pc7~PC4)和c低4位口(PC3~PC0)。
2.3.1.2 A组、B组控制电路
在8255A内部,3个端口分成两组来管理。
A口及c高4位口为A组,B口及c低4位
口为B组。
两组分别设有控制电路,控制电路根据“控制字”进行相应的控制。
2.3.1.3 数据总线缓冲器
这是一个8位三态双向缓冲器,作为8255A与系统总线的接口。
对于和系统数据总线直接相连的接口芯片来说,一般都应具有三态缓冲器,以保证在芯片未被选中时和系统总线处于“脱开”状态。
数据总线缓冲器还有抑制噪音、增强驱动能力的功能。
2.3.1.4 读/写控制逻辑
该电路根据CPU读、写等有关信号对8255A内部进行读、写控制,用于管理所有的数据、控制字和状态字的传送。
对8255A进行控制的信号有:
CS(上划线)——片选信号,低电平有效。
为低时,8255A被选中。
RD(上划线)——读信号,低电平有效。
该信号为低且CS(上划线)有效时,8255A送指定端口的数据或状态至CPU。
WR(上划线)——写信号,低电平有效。
该信号为低且CS(上划线)有效时,将数据总线上的数据写到指定的数据端口或控制字寄存器。
RESET--复位信号,高电平有效。
该信号用来清除所有的内部寄存器,并将A口、B口和c 口均置成输入状态。
A1、A0——端口寻址信号。
8255A含有3个数据端口和一个控制字端口,需要有两个输
入端来进行端口选择,这就是A1和A0。
一般情况下,A1和A0分别接系统地址总线的最低两位(A1和A0)。
但在8086系统中由于地址的最低位A0兼作低8位的数据传送控制信号,不能再参与8255A内部端口的寻址,所以端口寻址引脚Al、A0一般接系统地址总线的A2和A1。
当确定了端口寻址引脚的接法,8255A 的各个端口的地址也就确定下来。
一片8255A要占用4个I/O端口地址,A口的地址可作为
其他端口地址的基准,因此A口的地址被称为基地址(简称基址)。
和存储器芯片片选信号的产生相类似,8255A的片选信号由用于片内端口寻址以外的地址(高位地址)译码产生。
2.3.2 8255A有三种基本的工作方式:
2.3.2.1方式0
方式0为基本的输入/输出方式,传送数据时不需要联络信号。
A口、B口和c口(或C高4位口及c低4位口)均可独立设置成方式0输入口或方式0输出口。
2.3.2.2方式1
方式l为选通输入/输出方式,即需要进行联络的输入/输出。
A组、B组的8位口(A口或B 口)可被设置为方式1输人口或方式1输出口,而这时要用相应C口的3根线作联络线。
2.3.2.3 方式2
方式2为双向传送。
该方式要使用c口的5根线作联络线。
由于c口只有8根线,因
此只能有一组使用方式2确定为A组。
当A组被设置成方式2时,A口被设置成双向端口,即既可以输入数据,也可以输出数据,c口的5根线被指定为联络线。
2.3.2.4 方式1、2用到的联络信号
当将8255A设置为方式1或方式2时,要使用c口中的一些线传输联络信号。
这些信号可归结为五种(方式1仅使用其中的三种):
(1)STB(上划线)(Strobe)
选通,输入信号,由外设提供,低电平有效。
该信号将外设提供的数据送人端口的输入缓冲器。
(2)IBF(Input Buffer Full)
输入缓冲器满,输出信号,高电平有效。
该信号有效表示来自外设的数据已经进入输入缓冲器,但CPIJ尚未取走,外设暂时不要送新的数据。
.
(3)OBF(上划线)(Output Buffer Full)
输出缓冲器满,输出信号,低电平有效。
为低时表示CPU已把数据送到指定端口,该端口外围引线上的数据有效,外设可以利用了。
(4)ACK(上划线)(Acknowledge)
来自外设的回答,输入信号。
为低时表示输出的数据已被外设接收,CPU可以输出下一个数据。
(5)INTR
中断请求,送往CPU。
输入和输出都可以引起中断。
对于输入,外设的数据进入输入缓冲器后8255A产生INTR,请求CPU取走数据;对于输出,当外设利用完输出缓冲器中的数据之后会发出一个回答信号ACK(上划线),8255A在ACK(上划线)后沿的作用下产生INTR,请求CPU输出下一个数据。
本时钟系统设计中选用8255A作为8位LED接口电路,端口方式A和B都工作于方式0,端口B作为8个显示器共用的字型码输出线。
端口A提供位选码,任何时候只有一位输出0,即低电平,经反相,只有一个显示器阳极高电平,只有一个显示器能显示其代码。
2.4 LED七段显示器
七段显示器是有七段LED适当地排列并封装在一起而构成的。
在常用的七段显示器内,各个LED可按共阳极或共阴极连接。
他们分别用不同的驱动电路来驱动。
2.4.1 共阳极LED显示器
对于共阳极显示器,其段驱动电路的输出位低电平时,改段的LED导通并点亮,段驱动电路应能吸收额定的段导通电流。
2.4.2 共阴极LED显示器
在共阴极显示器情况下,其段驱动电路的输出为高电平时,该段的LED导通并点亮,段驱动电路能供给额定的段导通电流。
2.4.3 多位数字静态显示及其接口
在多为数字静态显示系统中,每位数字显示器分别都应有各自的锁存、译码和驱动器。
用它们分别缩唇每位待显数字的BCD码,经各自的译码器将4位BCD数码变换为7位段码,供段驱动电路去连续地驱动相应数字显示器的每个显示段。
2.4.4 多位数字动态显示及其接口
由软件译码、硬件驱动:选用8255A作为8位LED接口电路,端口方式A和B都工作于方式0,端口B作为8个显示器共用的字型码输出线。
端口A提供位选码,任何时候只有一位输出0,即低电平,经反相,只有一个显示器阳极高电平,只有一个显示器能显示其代码。
由硬件译码、驱动:各数字显示器公用一个公共的锁存、译码和驱动器。
在锁存器仲,待显数字的BCD数码经译码驱动器,驱动各个数字显示器并联着的每个显示段。
能被驱动点亮的数字显示器,能分显示出相应的BCD数码,取决于其相应的公共极被选通
本时钟系统设计选用多位数字动态显示的软件译码、硬件驱动方式。
2.5 硬件测试
硬件测试主要有两种:静态测试和动态测试。
➢静态测试:查看硬件的连接是否正确
➢动态测试:测试系统的时钟显示功能
第三部分软件设计
在软件设计中我们要实现7段数码管的显示时间信息,CPU与接口之间可按查询方式或中断方式进行数据传送,本设计采用中断方式。
CPU与时钟系统之间用中断方式来交互.通过硬件中断,实现时钟的计时功能.每次中断就秒数增 1.主程序将时间信息送到寄存器,将寄存器作为显示子程序的程序入口,通过压栈保护寄存器内容,循环调用子程序输出时间信息到7段数码管.通过DOS功能调用,监视键盘输入,选择相应的功能.
3.1 8253、8255、8259的初始化
3.1.1 8253的初始化
时钟系统最基本的要求就是时间变化
的正确时钟系统的,要能准确的反映时间的变
化,系统要及时的处理计时到达的信号.因此我
们的时钟系统采用的是中断方式.8253有6种
工作方式,通过比较8253芯片的方式2输出的
信号经过非门后能满足中断方式的要求。
时钟
的正确性,对于方式确定好后,8253的初始
化字的选择是至关重要。
由于TPC-USB系统
只能提供1MHZ的脉冲, 系统要求中断频率
为每秒1次,即是要求初始化字为1000000,远
大于8253初始字的范围(0~65553)。
因此我们
将使用8253的通道0(工作于方式3)与通道
1(工作于方式2)。
3.1.1.1 设置8253方式选择控制字
对于通道0,采用的是方式3:方波频率发生器。
选择通道0,D7D6=00;采用16位读写,D5D4=11;选择工作方式3,D3D2D1=011;初始字采用2进制,D0=0。
即D7~D0=00110110=36H
初始化代码:MOV AL,36H
MOV DX,283H
OUT DX,AL
对于通道1,采用的是方式2:频率发生器。
选择通道0,D7D6=01;采用16位读写,D5D4=11;选择工作方式2,D3D2D1=010;初始字采用2进制,D0=0。
即D7~D0=01110100=74H 初始化代码:MOV AL,74 H
MOV DX,283H
OUT DX,AL
3.1.1.2 设置初始化字
基于本时钟系统与实验环境的客观要求,我们需要将1MHZ的脉冲信号转换成1HZ的脉冲信号。
因此我们对通道0的初始字置为10000=2710H,
代码为: MOV AX,2710H
MOV DX,280H
OUT DX,AL
MOV AL,AH
OUT DX,AL
通道1的初始字置为100=64H,代码为:
MOV AX,64H
MOV DX,281H
OUT DX,AL
MOV AL,AH
OUT DX,AL
3.1.2 8255的初始化
由于本时钟系统是通过7段数码管显示时间信息,不需要8255芯片控制,只需要有信号到,就直接输送到数码管,所以可以用8255芯片的方式0直接输送信号到7段数码管.所以8255的初始化相对比较简单。
3.1.2.1设置8255的方式字
本系统使用8255工作在方式0只完成简单的并行输入输出。
故8255的初始化为最高3位是100,A、C低4位口负责输
出,故D4、D3、D0为0,其他
位置任意。
我们设置为80H
代码为:
MOV AL,80H
MOV DX,288H
OUT DX,AL
3.1.3 8259的初始化
3.1.3.1 设置8259的方式字
在本系统中,由于TPC-USB实验环境集成了8259芯片并已初始化。
TPC-USB实验板上,固定的接到了3号中断IRQ3上,即进行中断实验时,所用中断类型号为0BH。
只需要在程序中设置中断矢量,
代码为:
MOV AX,SEG INT_TIMER
MOV DS,AX
LEA DX,INT_TIMER
MOV AX,250BH
INT 21H
IN AL,21H
AND AL,0F7H
OUT 21H,AL
3.2 时钟程序设计
本系统在8253芯片保证计时准确的前提下,通过8253芯片发送的信号进入中断处理程序,实现时钟的准确性。
在程序运行过程中,可以从键盘接收指令,从而实现功能的多样化。
系统的主程序流程图,见图 3.21
中断处理程序采用比较的方式实现时钟计时功能与时钟的数制(逢60进1归0或逢24归0),中断程序流程图见图 3.22
图3.22 中断程序流程图
3.3程序清单
;===================================================================== ; 8253时钟程序
;功能:
;1.显示当前系统时间2.自定义时间3.可用作秒表
;原理:
;利用8253的方式3(作用为降频)、方式2(等于频率发生器)产生每秒1次中断信号
;实现计时功能,利用8255并行口输出时间信息到7段LED灯显示
;===================================================================== ;===================================================================== ;数据段
;===================================================================== DA TA SEGMENT
IO8255A EQU 28AH ;8255 C口
IO8255B EQU 28BH ;8255控制口
IO8255C EQU 288H ;8255 A口
CHAN1 EQU 280H ;8253通道0
CHAN2 EQU 281H ;8253通道1
CONTR EQU 283H ;8253控制口
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H;段码
MESG1 DB 0DH,0AH,0AH,0AH,'1->Clock Mode(Default:Local Computer)',0DH,0AH DB '2->Set Time',0DH,0AH
DB 'ESC->Exit',0DH,0AH,'$'
MESG2 DB 'Input Hour(00-23;q to Exit):','$'
MESG3 DB 0AH,0DH,'Input Minute(00-59;q to Exit):','$'
MESGERR DB 0DH,0AH,'Input Error!',0DH,0AH,'Input Again:','$'
MAX DB 0
COUNTER DB 0
BUFF DB 4 DUP(4,?,0,?)
STARTED DB 0 ;判断是否已初始化.
SETTIME DB 0 ;判断是否已设置过时间
MODE DB 0
HOUR DB 00
SECOND DB 00
MINUTE DB 00
TMP DB 0 ;返回程序界面控制字AL=1BH则返回
DA TA ENDS
;===================================================================== ; 代码段
;===================================================================== CODE SEGMENT
ASSUME CS:CODE,DS:DA TA
START:
MOV AX,CS ;设置中断
MOV DS,AX
MOV AX,SEG INT_TIMER
MOV DS,AX
LEA DX,INT_TIMER
MOV AX,250BH ;中断矢量为0BH
INT 21H
IN AL,21H
AND AL,0F7H ;开中断IRQ3
OUT 21H,AL
MOV AX,DATA
MOV DS,AX
STARTCLOCK:
CALL INTERFACE
MOV TMP,0
CMP STARTED,1 ;检查程序是否已初始化,是则跳过JE REC
CALL INIT ;初始化程序
MOV STARTED,1 ;设置为已初始化
REC:
MOV MODE,0
MOV BL,HOUR ;显示HOUR:MINUTE
CALL DISPTIME ;DISPTIME子程序,入口为BL CMP TMP,1BH
JE STARTCLOCK
MOV BL,MINUTE
CALL DISPTIME
CMP TMP,1BH
JE STARTCLOCK
MOV BL,0AAH ;送入BL=0AAH,使LED灯全黑CALL DISPTIME
CMP TMP,1BH
JE STARTCLOCK
CMP MODE,1 ;MODE=1则跳转显示SECOND JE DISPSEC
JMP REC
DISPSEC:
MOV MODE,0 ;MODE=0,不跳转
MOV BL,SECOND ;显示SECOND
CALL DISPTIME
CMP TMP,1BH
JE STARTCLOCK
CMP MODE,1 ;跳转至显示HOUR:MINUTE
JE REC
JMP DISPSEC
EXIT:MOV AH,4CH ;程序结束,返回DOS
INT 21H
;===================================================================== ;子程序,初始界面
;===================================================================== INTERFACE PROC
BEGINCLK:
LEA DX,MESG1 ;初始个比较友好的界面
MOV AH,09H
INT 21H
MOV AH,07H ;无回显输入,功能选择
INT 21H
CMP AL,'1'
JE JMPOUT
CMP AL,'2'
JE SETTING
CMP AL,1BH
JNE EXIT
JMP BEGINCLK
SETTING: ;设置时间
LEA DX,MESG2
MOV AH,09H
INT 21H
MOV MAX,23H ;限制输入范围
CALL GETINPUT
CMP AH,'q'
JE BEGINCLK
MOV HOUR,AL ;得到输入的小时
LEA DX,MESG3
MOV AH,09H
INT 21H
MOV MAX,59H
CALL GETINPUT
CMP AH,'q'
JE BEGINCLK
MOV MINUTE,AL ;得到输入的分钟
MOV SETTIME,1
JMPOUT:RET
INTERFACE ENDP
;===================================================================== ;子程序;功能为输出7段LED显示BL为入口
;===================================================================== DISPTIME PROC
MOV CX,0F0H ;设置时延
RECYCLE:
MOV AL,0 ;灭灯
MOV DX,IO8255A
OUT DX,AL
PUSH CX
PUSH BX
MOV CL,BL ;以下显示个位数
AND CL,0FH ;屏蔽高4位,BL为要显示的数的个位数MOV CH,0
LEA SI,LED ;置LED数码表偏移地址为SI
ADD SI,CX ;求出对应的LED数码
MOV AL,BYTE PTR [SI]
MOV DX,IO8255C ;自8255A的口输出
OUT DX,AL
MOV AL,1 ;使相应的数码管亮
MOV DX,IO8255A
OUT DX,AL
MOV CX,3000
DELAY3:LOOP DELAY3
MOV AL,0 ;以下显示十位数
MOV DX,IO8255A
OUT DX,AL
POP BX
MOV CL,BL ;BL为要显示的数
SHR CL,4 ;BL为要显示的数的十位数
MOV CH,0
LEA SI,LED ;置LED数码表偏移地址为SI
ADD SI,CX ;求出对应的LED段码
MOV AL,BYTE PTR [SI]
MOV DX,IO8255C ;自8255A的口输出
OUT DX,AL
MOV AL,2 ;使相应的数码管亮
MOV DX,IO8255A
OUT DX,AL
MOV DX,0FFH ;有键按下则置位MODE、TMP
MOV AH,06 ;无则循环显示
INT 21H
JE DISPEND
MOV MODE,01
MOV TMP,AL
DISPEND:
POP CX
LOOP RECYCLE
RET
DISPTIME ENDP
;===================================================================== ;中断处理程序;功能为每中断10次second增1
;===================================================================== INT_TIMER PROC ;中断处理程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
CLI ;关中断
MOV AX,DATA
MOV DS,AX
MOV AL,20H
OUT 20H,AL
MOV AL,SECOND
INC AL
CALL HEXTODEC
MOV SECOND,AL
CMP SECOND,60H
JB INTOFF
MOV SECOND,0
MOV AL,MINUTE
INC AL
CALL HEXTODEC
MOV MINUTE,AL
CMP MINUTE,60H
JB INTOFF
MOV MINUTE,0
MOV AL,HOUR
INC AL
CALL HEXTODEC
MOV HOUR,AL
CMP HOUR,24H
JB INTOFF
MOV HOUR,0
STI ;开中断
INTOFF:
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET
INT_TIMER ENDP
;===================================================================== ;子程序,功能为获取输入的数字并转化,出口为AL
;===================================================================== GETINPUT PROC
REINPUT:
LEA DX,BUFF ;DOS 10号功能,获取输入字符串,首位=[BUFF+2]
MOV AH,0AH
INT 21H
LEA SI,BUFF
MOV AL,[SI+1]
CMP AL,02H ;限制输入字数
JG DISPERR
MOV AH,[SI+2]
CMP AH,'q' ;检查是否q退出
JE RETURN
CMP AH,'0' ;检查输入数字范围是否0-9
JL DISPERR
CMP AH,'9'
JG DISPERR
MOV AL,[SI+3]
CMP AL,'0'
JL DISPERR
CMP AL,'9'
JG DISPERR
AND AL,0FH ;屏蔽高4位
SHL AH,04H ;AH左移4位
ADD AL,AH ;AL=输入的数
CMP AL,0H
JL DISPERR
CMP AL,MAX ;MAX= 23 OR 59
JG DISPERR
JMP RETURN
DISPERR: ;输入错误处理,警告并提示重新输入
MOV DX,OFFSET MESGERR
MOV AH,09H
INT 21H
JMP REINPUT
RETURN:RET
GETINPUT ENDP
;=====================================================================
;子程序,初始化,设置外部硬件工作方式,并判断是否需初始化时间
;===================================================================== INIT PROC
CMP SETTIME,1 ;检查是否已设置过时间;否则获取系统时间显示
JE KK
MOV AH,2CH ;DOS 2CH号功能,获取系统时间
INT 21H ;HOUR->CH,MINUTE->CL,SECOND->DH
MOV AL,CH
CALL HEXTODEC ;HEXTODEC子程序,入出口皆为AL
MOV HOUR,AL
MOV AL,CL
CALL HEXTODEC
MOV MINUTE,AL
MOV AL,DH
CALL HEXTODEC
MOV SECOND,AL
KK:
MOV AL,36H ;设置通道0工作方式为3.
MOV DX,CONTR ;00110111H 通道0,16位读写,方式3,bcd码
OUT DX,AL
MOV AX,2710H ;计数初值为10000,BCD码
MOV DX,CHAN1
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV AL,74H ;设置通道1工作方式为2
MOV DX,CONTR ;01110100H 通道1,16位读写,方式2,2进制
OUT DX,AL
MOV AX,64H ;初始值为100
MOV DX,CHAN2
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,IO8255B ;将8255设为A口输出
MOV AL,80H ;1000000 方式控制字A、B组方式0,A、B、C口都是输出
OUT DX,AL
RET
INIT ENDP
;===================================================================== ;子程序,将16进制转换成10进制,入出口都为AL,AX受影响
;===================================================================== HEXTODEC PROC
PUSH BX
MOV AH,0。