2940.可编程作息时间控制器 设计报告 包含源代码,设计背景完整报告等内容
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与技术学院硬件课程设计报告
姓名:
专业:计算机科学与技术
班级:
设计题目:可编程作息时间控制器
成员:
指导教师:职称:
2008年6月30日
课程设计指导教师评阅书
指导教师评语:
成绩:指导教师签字:
年月日
控制器
摘要
在本次可编程作息时间控制器的设计的过程中我们三人分工合作,完成了:
1、键盘的扫描程序的设计,利用8255A并行口做一个扫描键盘程序,把按键输入的键码,通过8255 PC口输出显示在七段数码管上。
8255PA口低4位做键盘行的输入线,PB口低4位作为键盘的列输入线,同时其高4位读取键盘的行信息,这样一来,用输入指令读取B口状态时,可同时读取键盘的行列信息。
8255 PA口高4位作为四位七段数码管的位选线。
编写程序通过逐行逐列扫描,可获得所按键的行列信息,及该键所对应的键号并利用查表找出其所对应的数码管显示码。
将该信息通过8255 PC口输出到七段数码管上,显示当前按键值。
每次按键输出键值时,通过改变8255 PA口高4位状态,使四位七段数码管轮流显示不同的键值。
2、定时计时程序,通过上述所设计的键盘输入定时时间,计算初值,利用可编程的计数/定时器8253A进行计时,实现定时报告。
完成可编程作息时间控制器的设计。
本设计实现了设定时间的显示,到时提示等功能,基本上到达了我们最初设计的要求。
3、本设计中所用芯片:8255,8253,74LS138;
利用了4×4矩阵的小键盘,及指示灯。
所用做图工具:PROTELL99SE、WORD
关键词
8255A ;8253 ;键盘 ;设置定时时间 ;计数定时
目录
总体设计部分
1 设计任务与要求 (1)
1.1、题目理解 (1)
1.2、任务要求 (1)
2 总体方案 (1)
2.1、设计思路 (1)
2.2、总体设计电路图 (1)
3硬件方案 (2)
3.1、所用芯片简介 (2)
3.1.1、8255芯片简介 (2)
3.1.2、8253芯片简介 (4)
3.2、各部分电路图 (7)
3.2.1、键盘部分电路图 (7)
3.2.2、键盘及显示部分电路图 (9)
3.2.3、计时部分电路图 (10)
4软件方案 (10)
4.1、设计的原理 (10)
4.1.1、键盘的设计原理 (10)
4.1.2、显示部分的设计原理 (12)
4.1.3、计时部分的设计原理 (13)
4.2、程序流程图 (14)
4.2.1、键盘扫描流程图 (14)
4.2.2、显示部分程序图 (15)
专题设计部分
1 硬件(软件)详细设计 (16)
1.1、程序清单及相应的说明 (16)
1.2、设计方案测试 (22)
1.2.1、单个程序测试 (22)
1.2.2、总体程序测试 (23)
2总结 (23)
2.1、本设计的可行性与优点分析 (23)
2.2、设计中的不足分析与改进 (23)
3.心得体会 (26)
参考文献 (26)
总体设计部分
1 设计任务与要求
1.1、题目理解
可编程作息时间控制器可理解为可编程即可设置且可重置的闹钟。
设置一个时间,到设置时间时机器自动叫响且伴有指示灯亮。
1.2、任务要求
利用键盘输入预设定的时间,设计一个具有时.分计时,4位数字显示的时钟电路,能按设定时间自动叫响且伴有指示灯亮.
2 总体方案
2.1、设计思路
利用8255A设计4行×4列的矩阵键盘,并与4位七段数码管相连,实现按键的判断及显示。
8255A是的A口低4位连接键盘的行,C口低4位连接键盘的列;A口高4位连接4位七段数码管的位选端口,实现数码管的选择;B口8位连接七段数码管的8个段信号引脚。
输入4个数字由4个七段数码管分别显示,前两位为小时,后两位为分钟。
在由此及与系统时间的比较,判断到时转8253程序控制指示灯亮。
选用8253的0、1、2计数器,0计数器采用方式2,用系统时钟脉冲f=1MHZ,计数初值为2000,其输出端作为1计数器的输入脉冲,1计数器采用方式2,计数初值为2000,输出一个周期为2S的时钟脉冲。
2计数器采用方式0,产生定时中断,其OUT端连接一个发光二极管,到设定时间时发光。
2.2、总体设计电路图
3 硬件方案
3.1、所用芯片简介
3.1.1、8255芯片简介
(1)、8255可编程并行接口芯片简介:
CS CS 300-307
308-315
CS
8253 实现计数定时
CS
8255
实现键盘设
置闹铃时间 显示 时间
8255是一种通用可变成并行输入输出接口芯片,通过对它进行编程,芯片可工作于不同的工作方式,用8255作接口时,通常不需要附加外部逻辑电路就可直接为CPU与外设之间提供数据通道。
8255可编程并行接口芯片有三个输入输出端口,即A口、B口和C口,对应于引脚PA7~PA0、PB7~PB0和PC7~PC0。
其内部还有一个控制寄存器,即控制口。
通常A口、B口作为输入输出的数据端口。
C口作为控制或状态信息的端口,它在方式字的控制下,可以分成4位的端口,每个端口包含一个4位锁存器。
它们分别与端口A/B配合使用,可以用作控制信号输出或作为状态信号输入。
(2)、8255可编程并行接口芯片方式控制字格式说明:
8255有两种控制命令字;一个是方式选择控制字;另一个是C口按位置位/复位控制字。
其中C口按位置位/复位控制字方式使用较为繁难,说明也较冗长,故在此不作叙述。
方式控制字格式说明如表1:
表1
D7:设定工作方式标志,1有效。
D6、D5:A口方式选择
0 0 —方式0
0 1 —方式1
1 ×—方式2
D4:A口功能(1=输入,0=输出)
D3:C口高4位功能(1=输入,0=输出)
D2:B口方式选择(0=方式0,1=方式1)
D1:B口功能(1=输入,0=输出)
D0:C口低4位功能(1=输入,0=输出)
(3)、8255可编程并行接口芯片工作方式说明:
方式0:基本输入/输出方式。
适用于三个端口中的任何一个。
每一个端口都可以用作输入或输出。
输出可被锁存,输入不能锁存。
方式1:选通输入/输出方式。
这时A 口或B 口的8位外设线用作输入或输出,C 口的4条线中三条用作数据传输的联络信号和中断请求信号。
方式2 :双向总线方式。
只有A 口具备双向总线方式,8位外设线用作输入或输出,此时C 口的5条线用作通讯联络信号和中断请求信号。
3.1.2、8253芯片简介
(1)、可编程计数器/定时器8253芯片简介
8253是一种利用硬件电路和中断方法控制定时,定时时间和范围完全由软件来确定和改变,并有微处理器的时钟信号提供时间基准。
但该时钟信号频率太高,所以还可用8253进行分频。
8253内部有3个独立的16位计数器通道,通过对他进行编程,每个计数器通道均可按6种不同的方式工作,并且都可以按2进制或10进制格式进行计数,最高计数频率能达到2MHZ.8253还适用于许多其他场合,如用作可编程方波频率产生器、分频器、程控单脉冲发生器等等。
(2)、8253A 控制字的格式说明
在对8253进行编程时,由CPU 用输出指令向他写入控制字,来选定计数器通道,规定各计数器通道的工作方式,读写格式和数制。
控制字格式如表2: 表2:
10入控制字,11无效。
1RL 0RL ---读/写操作位,
01表示只读/写低8位字节数据,只写入低8位时,高8位自动置为
0;
10表示只读/写高8位字节数据,只写入高8位时,低8位自动置为
0;
11允许读/写16位数据。
00把通道中当前数据寄存器的值送到16位锁存器中,供CPU 读取该
值。
BCD--------计数方式选择位。
1表示采用BCD 码计数; 0表示采用二进制格式计数。
2M 1M 0M ----工作方式选择位。
000 方式0 001 方式1 X10 方式2 X11 方式3
100 方式4 101
方式5
(3)、8253 六种工作方式的说明
8253有6种工作方式,对它们的操作遵守以下3条基本原则: (1)当控制字写入8253时,所有的控制逻辑电路自动复位,这时输出端OUT 进入初始态。
(2)当初始值写入计数器以后,要经过一个时钟周期,减法计数器才开始工作,时钟脉冲的下降沿使计数器进行减1计数。
计数器的最大初始值是0,用二进制计数时0相当于216,用BCD 码时,0相当于104。
(3)对于一般情况下,在时钟脉冲CLK 的上升沿时,采样门控信号。
对门控信号(GATE)的触发方式是有具体规定的: 门控信号为电平触发的有:方式0,方式4。
门控信号为上升沿触发的有:方式1,方式5。
门控信号可为电平触发也可为上升沿触发的有:方式2,方式3。
计数方式的有:方式0,方式1,方式4,方式5
定时方式的有:方式2,方式3。
8253的工作方式:
方式0(计数结束产生中断的计数器)------------- -------------- --- 写入方式控制字后,输出端OUT为低电平;写入计数常数后,开始计数。
计数器减为0之前,输出端OUT维持低电平。
当计数值为0时,输出端OUT 才变为高电平,向CPU发出中断请求,直到CPU写入新的控制字或者写入新的计数值为止。
方式0可由门控信号控制暂停,GATE为低电平时,计数器暂停,GATE 信号变高后,就接着计数。
方式1(可重复编程的单脉冲)------------------------------- ----- 设定工作方式和写入计数值后,OUT输出高电平,GATE(触发信号)变为高电平后,OUT变为低电平,开始计数。
当计数器减到0时,OUT才输出高电平。
输出低电平期间,写入新计数值,不会影响原记数过程。
只有第一次计数完,GATE再来一个正跳变时才使用新的计数值计数
若在第一次计数末完成之前,GATE又产生正跳变(即下一个脉冲信号又到来)时,则从新的GATE的上升沿以后,开始重新计数,OUT端输出的低电平保持不变,2次的计数过程合在一起,因此使输出的负脉冲宽度加宽了
方式2 (分频器)--------------------------------------------------写入方式2的控制字后,OUT变高,设GATE为高先到,计数器对CLK 计数,设计数初值为N。
当计数器计到(N一1)个CLK信号时,OUT输出变低,计数器的值为l。
最后一个CLK信号输入后,计数器减到0,OUT回到高,计数器又自动从初值开始计数。
因此OUT端在每N个CLK信号中输出一个宽度等于CLK信号周期的负脉冲。
负脉冲的周期=计数值N×时钟CLK的周期T。
计数过程中要求门控脉冲GAT置保持为高,当GATE为低电平时,则计数被中止暂停,在GATE再变高后,计数器又被置入初值,重新计数。
方式3(方波发生器)------------------------------------------------写入方式3的控制字后,OUT变高,设GATE为高电平,则在写入计数初值后的下一个时钟脉冲时,将计数初值装入执行部件,并开始计时。
与方式2类似,但输出端得到的是方波或基本对称的矩形波。
初值为偶数时,每输入一个时钟脉冲,均使计数值减2,减为0时,OUT输出引脚由高电平变低电平,同时自动重新装入计数初值,继续计数。
初值为计数时,第一个时钟脉冲使计数器减1,以后均减2.
方式4(软件触发选通)----------------------------------------------写入方式4的控制字后,OUT变高,设GATE为高电平,则在写入计数初值后的下一个时钟脉冲时,将计数初值装入执行部件,并开始计时。
当计数初值减为0时,OUT端输出变低,经一个时钟周期又回到高电平,形成一个负脉冲。
一次计数,重新装入初值才可继续计数。
方式5(硬件触发选通)----------------------------------------------写入方式5的控制字后,OUT变高,装入计数初值后,只有当GATE从到到高跳变时才能在下一个时钟脉冲后把计数初值装入执行部件,并开始计时。
当计数初值减为0时,OUT端输出变低,经一个时钟周期又回到高电平,形成一个负脉冲。
自动重新装入初值,当再经历GATE从低到高跳变时继续减1计数。
3.2、各分电路图
3.2.1、键盘部分电路图
.
键盘各键作用说明:
0-9………………数字键
O(0A)………………四个数输入完成,(小时、分钟各两位)执行显示程序C(0B)………………输入显示完成,执行计数程序
0C-0F……………………未用
3.2.2、键盘及显示部分电路图
3.2.3、计时部分电路图
4 软件方案
4.1、设计的原理
4.1.1、键盘的设计原理
我们所设计的键盘是一个16位键的,分别为16进制数字0~9和A~F,其中,F键为复位键,键盘的排列,连线及接口电路如下图所示,16个键排成4行×4列的矩阵,接到微机的一对端口上。
端口由8255A构成,其中端口A作输出,端口B作为输入,端口C作为输出。
矩阵4条行线到输出端口A口的PA3~PA0,用程序能改变这4条线上的电平。
4条列线连到输入端口B 口的PB7~PB4. 编写程序通过逐行逐列扫描,可获得所按键的行列信息,及该键所对应的键号。
在无键压下时,由于接到+5V上的上拉电阻的作用,列线被置成高电平。
压下某一键后,该键所在列线和行线接通。
这时,如果向下键所在的行线上输出一个低电平信号,则对应的列线也呈现低电平。
当从B口读取列线信号时,便能检测到该列线的低电平。
说明该行列对应的键即为所按下的键。
识别键盘上哪个键被压下的过程称为键盘扫描,上述键盘的扫描包含以下几步:
a 、检测是否所有键都松开了,若没有则反复检测。
b、当所有键都松开了,再检测是否有键压下,若无键压下则反复检测。
c、若有键压下,要消除键抖动,确认有键压下。
d、对压下的键进行编码,将该键行列的信号转换16进制码,由此确定哪一个键被压下了。
如出现多键重按的情况,只有在其他键均释放后,仅剩下一个键闭合时,才把此键当作本次压下的键。
e、该键释放后,再回到b。
检测矩阵中是否有键压下的一种简单方法,自输出口A向所有行线输出0电平,再通过B口的低4位读取列值,若其中有0值,便是有键压下了。
在开始一次扫描时,先应确认上一次压下的键是否已松开。
既先向所有行线输出低电平,再读入各列线值,只有当所有的行线和列线均为高电平,表示以前压下的键都已释放,才开始检测是否有键压下。
当检测到有键压下后,必须消除键抖动(DEBANCE)。
即当检测到有键按下后,延长一定时间(通常延迟20MS),再检查该键是否仍被压者。
若是,才认定该键确实被按下后,而不是其他的振动干扰。
确认有键按下后,再确定被压下键所在的行号。
为获取行列信息,先从A口输出一个低电平到一行线上,再从B口读入各列的值,若没有一列为低电平,说明压下的键不在此行。
于是,再向下一行输出一个低电平,再检测各列线上是否有低电平,依次对每一行重复这个过程,直至查到某一列线上出现低电平为止。
被置成低电平的行和读到该低电平的列,便是被压下键所在的行列值。
已被压下的键所在的行号(0~3)和列号(0~3)后,就能得到该键扫
描码。
例如,对于数字0,它位于3行,3列,压下“0”键时,从B口可读得D7位和D3为0,其余位为1,所以数字0的编码为01110111B,即77H;对于数字6,处于2行,1列,压下“6”键时,D6为和D1位为0,其余位为1,所以数字6的编码为10111101B=BDH。
类似地,其余各键的编码也可—一求得。
将这些编码值列成键盘扫描表(TABLE),放在数据段中,用查表程序来查对,便能确定压下的位置。
键盘扫描码表:表1
0 1 2 3 4 5 6 7
77H 7BH 7DH 7EH 0B7H 0BBH 0BDH 0BEH
8 9 A B C D E F
0D7H 0DBH 0DDH 0DEH 0E7H 0EBH 0EDH 0EEH
根据七段LED显示器的原理,对16进制数字(0~F)进行编码,根据下图典型的七段LED,例如,对于数字“0”,二极管a, b, c, d, e ,f亮,g,h(DP)灭 ,故数字”0”的编码为0011111B,即为3FH,类似地,其余各键的编码也可一一求得.将这些编码值列成七段显示代码表(LED_CODE),通过编写程序实现键盘扫描表(TABLE)与七段显示代码表(LED_CODE)进行转换,并通过PC口输出显示到七段数码管上。
每次按键输出键值时,通过改变8255 PA口高4位状态,使四位七段数码管轮流显示不同的键值。
典型的七段LED 图2
LED显示码表:表2
多数利用了逐位快速轮循显示的方式。
即在一个轮循显示周期中让每位数码管显示一次各自的数。
当轮循显示周期的数目大于每秒50次时,人的眼睛就因视觉惰性而无法察觉显示的变化,从而感觉到现实的事多位静止的7段数。
将四个数码管的8个段信号引脚链接在一起,并共同由一个段驱动器提供8位的段显示码数据。
而每个数码管则各自都有独立的位选通信号。
无论段驱动器的输出什么显示码数据,只要位选通信号有效的数码管才会发亮。
所以只要先逐个送出每个数码管将要显示的段显示码数据后紧跟着仅送出使该位数据管位选信号有效的数据,并且保持一个短暂的时间(几毫秒到几十毫秒),就会让段码数据在数码管上显示一个短暂的时间。
当每位数码管显示的内容每秒轮循显示的次数大于50次时,我们就会看到每位数码管都稳定的地显示各自的内容
4.1.3、计数部分设计原理
利用8253的计数作用,实现倒计时功能。
通过设定时间与系统时间的比较,计算出计数初值。
利用8253的0、1计数器实现时钟的分频,选择工作方式2。
8253的2计数器利用1计数器的输出脉冲作为其输入脉冲,选择工作方式0,实现定时作用。
在OUT2端连接一个发光二极管,当定时结束时,OUT2输出变为高电平,二极管发光。
实验完成。
4.2、程序流程图
4.2.1、键盘扫描流程图图5
4.2.2、显示部分程序图
专题设计部分
1 硬件(软件)详细设计
1.1、程序清单及相应的说明
;8255A端口地址
PORT_A EQU 300H ;8255A口地址
PORT_B EQU 301H ;8255B口地址
PORT_C EQU 302H ;8255C口地址
PORT_CTL EQU 303H ;8255控制口地址
;8253A端口地址
PORT_C3 EQU 311H ;8253A控制口
地址
PORT_0 EQU 308H ;8253A通道0地
址
PORT_1 EQU 309H ; 8253A通道1
地址
PORT_2 EQU 310H ; 8253A通道2
地址
;数据段
;键盘扫描码表
DATA SEGMENT
; 0 1 2 3 4 5 6 7
TABLE DB 77H, 7BH, 7DH, 7EH, 0B7H, 0BBH, 0BDH, 0BEH
; 8 9 A B C D E
F
DB 0D7H, 0DBH, 0DDH, 0DEH, 0E7H, 0EBH, 0EDH, 0EEH
;LED_CODE显示码表
; 0 1 2 3 4 5 6 7 LED_CODE DB 3FH,06H, 5BH, 4FH, 66H, 6DH,7DH, 0EH
; 8 9 A B C D E F
DB 7FH, 6FH, 77H, 7CH,39H,5EH, 79H, 71H
;定时时间缓存区
TIME DB 4 DUP (0)
DATA ENDS
;堆栈段
STACK SEGMENT STACK
DW 50 DUP(0)
TOP_STACK LABEL WORD
STACK ENDS
;代码段
CODE SEGMENT
MAIN PROC FAR
ASSUME CS: CODE, DS: DATA, SS: STACK
START: MOV AX, STACK
MOV SS, AX
LEA SP, TOP_STACK
MOV AX, DATA
MOV DS, AX
CALL INIT ;调用数码管初始化子程序
MOV CX,4 ;循环次数
ROTATE: CALL KEY ;调用键盘部分子程序,用于监视是否有键按下 LOOP ROTATE ;循环
RET ;返回
MAIN ENDP
;
INIT PROC NEAR ;数码管初始化子程序,将数码管全部置灭 MOV CX,4 ;循环次数
MOV AH,10H
NEXT: MOV AL,AH
MOV DX, PORT_CTL ;指向控制口
MOV AL, 10001011B ;控制字
OUT DX, AL ;写入控制字
MOV DX,PORT_A ;A口地址
OUT DX,AL
MOV DX,PORT_B ;B口地址
MOV AL,00H ;0FFH对应于数码管的全灭
OUT DX,AL
ROR AH,1 ;位选选中下一个数码管
LOOP NEXT
RET
INIT ENDP
KEY PROC NEAR
;初始化8255A,方式0,A口和C口作为输出,B口作为输入
MOV DX, PORT_CTL ;指向控制口
MOV AL, 10001011B ;控制字
OUT DX, AL ;写入控制字
;向所有行送0
MOV DX, PORT_A ;指向A口
MOV AL, 00H ;向A口各位输出0
OUT DX, AL
;读列,查看是否所有键均松开
MOV DX, PORT_B WAIT_OPEN: IN AL, DX ;键盘状态读入B口
AND AL, 0FH ;只查低4列位(列值)
CMP AL, 0FH ;是否都为1(各键均松开)
JNE WAIT_OPEN ;否,继续查
;各键均已松开,在查列是否有0,即是否有键按下
WAIT_PRESS: IN AL, DX ;读B口状态
AND AL, 0FH ;只查低4位
CMP AL, 0FH ;是否有键按下
JE WAIT_PRES ;无,等待
;有键按下,延时20MS,去抖动
MOV CX, 16EAH
DELAY: LOOP DELAY
;再查列,看键是否仍被按着
IN AK, DX
AND AL, 0FH
CMP AL, 0FH
JE WAIT_PRES ;若松开了,转出等待压键;若键仍被压着,确定哪一个键被压下
D=0 MOV AL, 0FEH ;先使
0 MOV CL, AL ;CL=1111 1110B NEXT_ROW: MOV DX, PORT_A ;指向A口
OUT DX, AL ;向一行输出低电平
MOV DX, PORT_B ;指向B口
IN AL, DX ;读入B口的状态
AND AL, 0FH ;只截取列值
CMP AL, 0FH ;是否均为1?
JNE ENCODE ;否,说明有键压下转去编码
ROL CL, 01 ;若均为1,使下一行输出0
MOV AL, CL
JMP NEXT_ROW ;查看下一行;已找到有一列为低电平,对压键进行编码
ENCODE: MOV BX, 000FH ;建立地址指针,先指向F键对应地址IN AL, DX ;从B口读入行列号NEXT_TRY: CMP AL, TABLE[BX] ;读入的行列值列值与
;表中查得的相等吗?
JE DONE ;相等,转出
DEC BX ;不等,指向下一个(键值较小者)地址
JNS NEXT_TRY ;若地址尚未减为负数继续查
MOV AH, 01 ;若减为负数,置错误码01-AH
中
JMP EXIT ;退出
DONE: MOV AL, BL ;AL存放按键的偏移量
CMP AL, 0AH ;判断是否为数字键 JS BAOCUN ;若是,转出将定时时间保存 JZ DISPLAY ;若是确定键,转去显示 CMP AL,0BH ;判断是否是完成键 JZ CONT ;若是,转去计时
BAOCUN:PUSH AL
RET
DISPLAY:MOV CX,4
MOV CL, 7FH ;控制先显示最左端数码管NEXT: MOV BX,OFFSET LED _CODE ;BX 表格的首地址XLAT LED_CODE ;查表得到按键的LED
;显示码
MOV DX, PORT_C ;指向C口OUT DX, AL ;输出显示MOV DX,PORT_A ;指向A口
MOV CL, 7FH ;控制先显示最左端数码管OUT DX,CL
ROL CL
LOOP NEXT
RET
;8253端口号选308-315
CONT:MOV DI,OFFSET TIME ;取定时时间缓冲区首地址
ADD [DI],3 ;指向第4位
MOV CX,3 ;循环次数
QUT: POP DI ;从堆栈中取出时间放入缓冲区
DEC DI
LOOP QUT
MOV BH,[DI]
MUL BH,10
ADD BH,[DI+1] ;将设定时间小时存放入BH中
MOV BL,[DI+2]
MUL BL,10
ADD BL,[DI+3] ;将设定时间分钟存放入BL中
MUL BH,60
ADD BH,BL ;将设定时间存入BH中
MOV AH,2CH ;调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数INT 21H ;分别保存在CH,CL,DH中
MUL CH,60
ADD CH,CL ;将当前时间存入CH中
COMP:CMP BH,CH
JNZ WAIT
JMP DAOSHI
WAIT: MOV CX,30
JISHI:MOV DX,311H
MOV AL,00110101B
OUT DX,AL
MOV DX,308H
MOV AL,00H
OUT DX,AL
MOV AL,20H
OUT DX,AL
MOV DX,311H
MOV AL,01110001B
OUT DX,AL
MOV DX,309H
MOV AL,00H
OUT DX,AL
MOV AL,20H
OUT DX,AL
LOOP JISHI
INC CH
JMP COMP
RET
DAOSHI:
MOV DX,311H
MOV AL,10110001B
MOV DX,300H
MOV AL,05H
OUT DX,AL
MOV AL,00
OUT DX,AL
RET
CODE ENDS
END
1.2、测试
1.2.1、单个程序测试:
(1)、键盘程序测试
按图4连接好电路,调试此程序(JIANPAN.ASM),从小键盘输入一个数字,DOS界面输出显示该数字。
(2)、数码管显示程序测试
按图3相应部分连接本部分的电路图,调试程序(XIANSHI,ASM),4位七段数码管,分别显示1、2、3、4四个数字。
(3)、计时程序测试
按图6连接电路,调试程序(JISHI.ASM),DOS界面输出显示的数字以
1递增。
(4)、到时程序测试
连接相应的电路,调试程序(DAOSHI.ASM),指示红灯亮。
1.2.2、总体程序测试
连接好线路,调试程序(NAOZHONG.ASM),输入4位正确的24小时制的时间数字,按下完成键(O),4位七段数码管显示设定时间。
接着按下确定键(C),等到设定时间后,显示红灯亮。
验证此设计正确。
2 总结
2.1、本设计的可行性与优点分析
在本设计的过程中,我们遇到了一些困难但通过努力终于比较完整的完成了此次设计的任务:在键盘扫描程序中,其中最为重要的是当有键按下,如何确定是哪一个键被按下,采用逐行扫描法能够比较容易实现而且比较容易被人所理解;在按键显示程序中,其中最重要的是要4位七段数码管轮流显示不同的按键值,利用人的眼睛就因视觉惰性而无法察觉显示的变化,当轮循显示周期的数目大于每秒50次时,从而感觉到现实的事多位静止的7段数。
在计时程序设计中,最重要的是如何判断定时时间到,用设定时间与系统时间比对,直到相同为止即定时时间到。
2.2、设计中的不足分析与改进
本设计也存在缺陷:首先,这个设计不够精确,定时只到分,而忽略了秒。
因此可改进为时分秒定时的更精确的设计:改用六位七段数码管,用8255A的PC口连接键盘的行列,PB口输出到七段数码管上,PA口实现六位七段数码管的位选。
键盘的部分查找按键号及其相应LED显示码的程序改为如下所示:通过逐行逐列扫描,键号存入BL中,行号加1,BL加4,列号加1,BL加1,最终确定按下键的号,再在LED显示码表中找到相应的显示码,输出显示。
;初始化8255,方式0,C口低四位作输出,高四位作输入,A口和B口为输出MOV DX,PORT_CTL ;指向控制口
MOV AL,10000001B ;控制字
OUT DX,AL ;写入控制字
;判断是否有键按下
WAIT1: MOV DX,PORT_C ;C口
MOV AL,0F0H
OUT DX,AL ;PA3-PA0输出为“0”,PA7-PA4输出为“1”;读PC3-PC0,查看是否有键均松开
MOV DX,PORT_C
IN AL,DX ;键盘状态读入C口
AND AL,0FH ;只查低4位(列值)
CMP AL,0FH ;是否都位1(各键均松开)?
JZ WAIT1 ;否,继续查
;各键均已松开,再查列是否有0,即是否有键按下
WAIT_PRES:
IN AL,DX ;读C口
AND AL,0FH ;只查低4位
CMP AL,0FH ;是否有键按下
JE W AIT_PRES ;无,等待
;有键按下,延时20ms,消抖动
MOV CX,16EAH
DELAY: LOOP DELAY ;延时20ms
;再查列,看键是否仍被压着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE W AIT1 ;已松开,转出等待压键
;键仍被压着,确定哪一个键被压下
MOV BL,0 ;首先将K0键号送BL
MOV CL,0FEH ;设置行扫描,首先使PA0输出为“0”
MOV CH,1 赋行数初值
WAIT2:
MOV AL,CL ;AL=1111 1110B
NEXT_ROW:
MOV DX,PORT_A ;A口
OUT DX,AL ;使对应PAi行输出低电平
MOV DX,PORT_C ;C口
IN AL,DX ;读入C口状态,列线
AND AL,0FH ;只截取列值
CMP AL,0FH ;是否均为1
JNE W AIT3 ;否,表示有键按下,转去查列号
ROL CL,1 ;均为1,使下行输出0
MOV AL,CL
ADD BL,04 ;键号加4分指向K4,K8,K12行键
INC CH ;当前行号加1
CMP CH,05
JNZ W AIT2 ;4行未扫描完,继续扫描
JMP W AIT1 ;4行扫描结束,重新扫描
WAIT3:RCR AL,1 ; 右移,判断被按下键是否在此列JNC WAIT4 ;当前列有键按下,转W AIT4
INC BL ;指向K1(PC1),K2(PC2),K3(PC3)列
INC SI
JMP W AIT3
WAIT4:MOV AL,[SI] ;从TABLE中获取7断码键号最小值为“0”
OUT 8255_B,AL ;显示键号
MOV AL,0FH ;PA7-PA4均为“0”,PA3-PA0均为“1”
………………;显示
………………;计时
………………
DELAY:LOOP DELAY ;
JMP W AIT1
CODE ENDS
END
3 心得体会
通过本次的设计,使我们对整个设计的原理有比较深刻的理解,在设计的过程中,我们遇到了很多的困难,特别在刚开始时,由于是第一次,我们对有关设计方面的知识非常的缺乏,对如何设计仍是一个问号,但也正是由于这样要求我们需要很强的自学的能力,通过图书馆查阅相关的知识和利用网络搜索有关的资料,同时在老师的指导下,让我们从未知渐渐变的清晰,而且有了一定的设计的思路。
在设计过程中,我觉的团队的合作精神是非常重要的,在设计过程中,我们肯定要遇到许多我们以前未曾遇到过的一些难题,没有我们的共同的努力是很难很好地完成的,在这次的硬件课程设计中的确让我们知道有许多知识需要我们自己去获取,去领悟,去消化的,而不是等着老师来喂的,在设计中,更让学习了如何与别人进行合作,而这正是我们以前所欠缺的,无论是自学能力还是团队的合作精神,相信对我们以后无论是学习还是工作都将有着非常重要的意义的。
参考文献
微型计算机原理与接口技术…………………………………周荷琴、吴秀清编微机原理与接口技术实验及课程设计…………杨斌编
微型计算机原理与接口技术……………………李兰友、万振凯、李静东编
附录源代码:
///==============================================================。