重大课程设计电子钟
『壹』 电子钟课程设计(微机原理)
BUFF_KEY EQU 21H ;键盘键
BUFF_LED1 EQU 22H ;数码管显示缓存
BUFF_LED2 EQU 23H
BUFF_LED3 EQU 24H
BUFF_LED4 EQU 25H
BUFF_LED5 EQU 26H
BUFF_LED6 EQU 27H
BUFF_LED_LP EQU 28H ;T0键盘显示扫描缓存
HOR EQU 30H ;小时值缓存
MIN EQU 31H ;分钟值缓存
SEC EQU 32H ;秒值缓存
F_BEEP BIT 01H
LED_PORT EQU P0
DIG_PORT EQU P2
KEY_PORT EQU P2
SW1 BIT P2.7
SW2 BIT P2.6
SW3 BIT P2.5
SW4 BIT P2.4
SW5 BIT P2.3
SW6 BIT P2.2
BEEP BIT P2.0
KEY BIT P3.3
org 000h
JMP main
ORG 00BH
JMP T0_INT
ORG 100H
MAIN: MOV SP ,#40H
MOV PSW,#00H
MOV R0,#7FH ;初始化区,
CLR_RAM:MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_RAM
MOV P1,0FFH ;INIT
MOV P2,0FFH
MOV P0,0FFH
MOV P3,0FFH
MOV TMOD,#21h
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
SETB TR0
SETB ET0
SETB EA
WAIT_KEY:JB KEY,$ ;等候按键!
JNB SW1,SW1_OK
JNB SW2,SW2_OK
JNB SW3,SW3_OK
JNB SW4,SW4_OK
JNB SW5,SW5_OKA
JNB SW6,SW6_OKA
JMP WAIT_KEY
SW5_OKA: JMP SW5_OK
SW6_OKA: JMP SW6_OK
SW1_OK: MOV A,HOR
CJNE A,#24,SW1_OVER
MOV HOR,#00H
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW1_OVER:INC HOR ;时加1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW2_OK: MOV A,HOR
CJNE A,#00,SW2_OVER
MOV HOR,#23
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW2_OVER:DEC HOR ;时减1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
JMP WAIT_KEY
SW3_OK: MOV A,MIN
CJNE A,#59,SW3_OVER
MOV MIN,#00H
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW3_OVER:INC MIN ;分加1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW4_OK: MOV A,MIN
CJNE A,#00,SW4_OVER
MOV MIN,#59
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW4_OVER:DEC MIN ;分减1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW5_OK: MOV A,SEC
CJNE A,#59,SW5_OVER
MOV SEC,#00H
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW5_OVER:INC SEC ;秒加1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW6_OK: MOV A,SEC
CJNE A,#00,SW6_OVER
MOV HOR,#59
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
SW6_OVER:DEC SEC ;时减1
SETB F_BEEP
CLR BEEP
LCALL DEL
SETB BEEP
CLR F_BEEP
JMP WAIT_KEY
DEL: MOV R5,#02 ;为演示方便,人为插入的延时
DEL01: MOV R6,#200
DEL02: MOV R7,#200
DJNZ R7,$
DJNZ R6,DEL02
DJNZ R5,DEL01
RET
BIN_BCD: MOV B,#10
DIV AB
RET
;------------- T0 INTRRUPT 数码管扫描定时中断---------------------------
T0_INT: PUSH ACC
PUSH PSW
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#250,CONT_SCAN ;250*4MS=1S
MOV BUFF_LED_LP,#00H
INC SEC
MOV A,SEC
CJNE A,#60,CONT_SCAN
MOV SEC,#00H
INC MIN
MOV A,MIN
CJNE A,#60,CONT_SCAN
MOV MIN,#00H
INC HOR
MOV A,HOR
CJNE A,#24,CONT_SCAN
MOV HOR,#00H
clr beep
clr p1.0
lcall del
setb beep
setb p1.0
CONT_SCAN:MOV A,SEC
LCALL BIN_BCD
MOV BUFF_LED6,B
MOV BUFF_LED5,A
MOV A,MIN
LCALL BIN_BCD
MOV BUFF_LED4,B
MOV BUFF_LED3,A
MOV A,HOR
LCALL BIN_BCD
MOV BUFF_LED2,B
MOV BUFF_LED1,A
MOV A,BUFF_LED_LP
MOV B,#06
DIV AB
MOV A,B
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
AJMP SCAN_L5
AJMP SCAN_L6
SCAN_L1: MOV DIG_PORT,#01111111B
MOV A,BUFF_LED1
JMP END_SCAN
SCAN_L2: MOV DIG_PORT,#10111111B
MOV A,BUFF_LED2
JMP END_SCAN
SCAN_L3: MOV DIG_PORT,#11011111B
MOV A,BUFF_LED3
JMP END_SCAN
SCAN_L4: MOV DIG_PORT,#11101111B
MOV A,BUFF_LED4
JMP END_SCAN
SCAN_L5: MOV DIG_PORT,#11110111B
MOV A,BUFF_LED5
JMP END_SCAN
SCAN_L6: MOV DIG_PORT,#11111011B
MOV A,BUFF_LED6
END_SCAN: MOV DPTR,#TAB_LED
MOVC A,@A+DPTR
MOV LED_PORT,A
JNB F_BEEP,EXIT_T0
CLR BEEP
EXIT_T0: POP PSW
POP ACC
RETI
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;数码管显示字型表
DB 82H,0F8H,80H,90H,88H,83H,0A7H
DB 0A1H,86H,8EH
END
『贰』 电子钟课程设计:
目录
1 设计目的 3
2 设计要求指标 3
2.1 基本功能 3
2.2 扩展功能 4
3.方案论证与比较 4
4 总体框图设计 4
5 电路原理分析 4
5.1数字钟的构成 4
5.1.1 分频器电路 5
5.1.2 时间计数器电路 5
5.1.3分频器电路 6
5.1.4振荡器电路 6
5.1.5数字时钟的计数显示电路 6
5.2 校时电路 7
5.3 整点报时电路 8
6系统仿真与调试 8
7.结论 8
参考文献 9
实验作品附图 10
数字钟
摘要:
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。目前,数字钟的功能越来越强,并且有多种专门的大规模集成电路可供选择。
从有利于学习的角度考虑,这里主要介绍以中小规模集成电路设计数字钟的方法。
经过了数字电路设计这门课程的系统学习,特别经过了关于组合逻辑电路与时序逻辑电路部分的学习,我们已经具备了设计小规模集成电路的能力,借由本次设计的机会,充分将所学的知识运用到实际中去。
本次课程设计要求设计一个数字钟,基本要求为数字钟的时间周期为24小时,数字钟显示时、分、秒,数字钟的时间基准一秒对应现实生活中的时钟的一秒。供扩展的方面涉及到定时自动报警、按时自动打铃、定时广播、定时启闭路灯等。因此,研究数字钟及扩大其应用,有着非常现实的意义。
1 设计目的
1.掌握数字钟的设计、组装与调试方法。
2.熟悉集成元器件的选择和集成电路芯片的逻辑功能及使用方法。
3.掌握面包板结构及其接线方法
4.熟悉仿真软件的使用。
2 设计要求及指标
2.1基本功能
1)时钟显示功能,能够正确显示“时”、“分”、“秒”。
2)具有快速校准时、分、秒的功能。
3)用555定时器与RC组成的多谐振荡器产生一个标准频率(1Hz)的方波脉冲信号。
2.2扩展功能
1)用晶体振荡器产生一个标准频率(1Hz)的脉冲信号。
2)具有整点报时的功能。
3)具有闹钟的功能。
4)……
3、方案论证与比较
本设计方案使用555多谐振荡器来产生1HZ的信号。通过改变相应的电阻电容值可使频率微调,不必使用分频器来对高频信号进行分频使电路繁复。虽然此振荡器没有石英晶体稳定度和精确性高,由于设计方便,操作简单,成为了设计时的首选,但是由于与实验中使用的555芯片产生的脉冲相比较,利用晶振产生的脉冲信号更加的稳定,同过电压表的测量能很好的观察到这一点,同时在显示上能够更加接进预定的值,受外界环境的干扰较少,一定程度上优于使用555芯片产生信号方式。我们组依然同时设计了555和晶振两个信号产生电路。(本实验报告中着重按照原方案设计的555电路进行说明)
4、 系统设计框图
数字式计时器一般由振荡器、分频器、计数器、译码器、显示器等几部分组成。在本设计中555振荡器及其相应外部电路组成标准秒信号发生器,由不同进制的计数器、译码器和显示器组成计时系统。秒信号送入计数器进行计数,把累计的结果以‘时’、‘分’、‘秒’的数字显示出来。‘时’显示由二十四进制计数器、译码器、显示器构成,‘分’、‘秒’显示分别由六十进制计数器、译码器、显示器构成。其原理框图如图1.1所示。
5、电路原理分析
5.1数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定.在此使用555振荡器组成1Hz的信号。
数字钟原理框图(1.1)
5.1.1振荡器电路
555定时器组成的振荡器电路给数字钟提供一个频率为1Hz的方波信号。其中OUT为输出。
5.1.2时间计数器电路
时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器.
5.1.3分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768( ),即实现该分频功能的计数器相当于15级2进制计数器。
5.1.4振荡器电路
利用555定时器组成的多谐振荡器接通电源后,电容C1被充电,当电压上升到一定数值时里面集成的三极管导通,然后通过电阻和三极管放电,不断的充放电从而产生一定周期的脉冲,通过改变电路上器件的值可以微调脉冲周期。
5.1.5数字时钟的计数显示控制
在设计中,我们使用的是74**160十进制计数器,来实现计数的功能,实验中主要用到了160的置数清零功能(特点:消耗一个时钟脉冲),清零功能(特点:不耗时钟脉冲),在上级160控制下级160时候通过组合电路(主要利用与非门)实现,在连接电路的时候要注意并且强调使能端的连接,其将影响到整一个电路的是否工作。
电路的控制原理如下:
秒钟由个位向十位进位:0000—0001—0010—0011—0100—0101—0110—0111—1000—1001实现个位的计数,采用的是置数的方式(利用RCO端口),当电路计数到1001的时候采用一个二输入与非门接上级输入的高位和低位输出作为下级的信号,实现了秒区的个位和十位的显示与控制。设计中注意到接的是一个与非门而不是与门,目标在产生一个时钟脉冲。实现正确的显示。
由秒区向分区的显示控制:
基本原理同上,在秒区十位向时区个位显示的时:0000—0001—0010—0011—0100—0101产生了六个脉冲的时候向下级输出一个时钟脉冲,利用的还是与非门,目标仍是实现正确的计时显示。
分区的显示及整体电路反馈清零:
当数值显示达到:23:59的时候要实现清零的工作,采用CLR清零的方式反馈清零。具体设计接出控制端的9,5,3,2用十六进制表示后高电平对应引脚接与非,将非门输出信号的值反馈给各个160芯片的清零端(CLR)既可以实现清零了。
5.2 校时功能的实现
当重新接通电源或走时出现误差时都需要对时间进行校正.通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可.
根据要求,数字钟应具有分校正功能,因此,应截断分个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中.
在实验实现过程中使用的是通过开关(普通开关)来实现高低电平的切换,手动赋予需要的高低电平来实现脉冲的供给,将脉冲提供到所需要的输入(CLK)端口,实现校时,仿真过程中能够正常校时并且在校时的时候达到了预定的效果;而在我们进入实际电路连接的时候,利用开关(手控导线点触实现)来实现校时再不像仿真那样的精确了,原因分析是由于使用的是普通的开关同时利用的是手动的对CLK端口赋予脉冲信号,在实现手动生成脉冲信号的过程中产生了扰动,即相当于产生了多个的脉冲信号对需要的数码管进行校时,如此,并没有达到仿真的精确效果,但是在实验中通过改进电路的校时方式,不是用手触开关产生脉冲信号(如若需用手触则需要使用一个锁存器实现去抖动,才能够在脉冲生成时候不产生干扰的脉冲,实现正常的校时),而是使用信号发生器实现信号的提供,对需要校时的数码管在相对应的CLK端口提供脉冲信号实现校时,利用此方式实现校时则比手触开关方式效果要好。
5.3 报时的实现
报时功能的实现原理较为简单,即对所需要报时的输出量进行控制,并对控制产生的信号作为LED显示的信号源,电路连接中要注意到的是在实现LED显示的时候最好连接上一个保护电阻对LED灯器到保护的作用。例如我们的校时时间是 23:59,0010—0011—0101—1001;利用相应的门电路实现满足端口输出是上述条件的时候进行报时即可。
6、系统仿真与调试
7、结论
学贵以致用,通过几天的数字钟设计过程,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计,虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业素质的一种提高。当最终调试成功的时候也是对自己的一种肯定。在当前金融危机大的社会背景下,能够增加自身砝码的不仅仅是一纸文凭证书,更为重要的是毕业生是否能够适应社会大潮流的需要,契合企业的要求即又较硬的动手操作及设计能力。此次的设计作业不仅增强了自己在专业设计方面的信心,鼓舞了自己,更是一次兴趣的培养,为自己以后的学习方向的明确了重点。
另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,最终一一解决设计中遇到的问题。还有在实验设计中我们曾遇到多块芯片以及数码管损坏的情况造成了数字钟的显示没有达到预期的效果,或是根本不显示,通过错误排除最终确认是元件问题,并向老师咨询跟换元件最终的到解决。在我们曾经遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息。
『叁』 电子时钟课程设计
微机原理
课程设计,
电子时钟
,全做好发来,用8253计时。8255和
点阵屏
。说清楚就可以。
『肆』 单片机课程设计电子时钟程序
#include <at89x51.h> //头文件包含
#define uchar unsigned char //宏定义
#define uint unsigned int
#define ON 0 //定义0为打开
#define OFF 1 //定义1为关闭
#define LEDBus P1 //定义p1口为数码管段码口
sbit MIAO =P1^2; //秒点
sbit HOU_S=P3^0; //时十位位选
sbit HOU_G=P3^1; //时个位位选
sbit MIN_S=P3^2; //分十位位选
sbit MIN_G=P3^3; //分个位位选
sbit H_KEY=P3^4; //时调整键
sbit M_KEY=P3^5; //分调整键
bit SHAN; //闪烁标志位
uchar second,minute,hour; //定义秒、分、时寄存器
uchar code LEDTab[]={0x14,0xd7,0x4c, //数码管段码表0--9
0x45,0x87,0x25,0x24,0x57,0x04,0x05};
void delay(uchar t); //延时函数
void init(); //初始化函数
void display(); //显示函数
void min_tiao(); //分调整函数
void hou_tiao(); //时调整函数
/***************************************
函 数 名:main
功 能:主函数
说 明:
入口参数:无
返 回 值:无
****************************************/
void main()
{
init(); //调用初始化函数
while(1) //主程序循环
{
if(!H_KEY) hou_tiao(); //如果时调整键按下(为0),调用时调整函数
if(!M_KEY) min_tiao(); //如果分调整键按下(为0),调用分调整函数
display(); //调用显示函数
}
}
/***************************************
函 数 名:init
功 能:初始化函数
说 明:初始化定时器及中断
入口参数:无
返 回 值:无
***************************************/
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0; //定时器0模式1,50毫秒
ET0=1;TR0=1;EA=1; //开定时器0中断、启动定时器0、开总中断
}
/***************************************
函 数 名:display
功 能:显示函数
说 明:
入口参数:无
返 回 值:无
***************************************/
void display()
{
LEDBus=LEDTab[minute%10]; //分个位送数码管显示
MIAO=SHAN; //秒点闪烁
MIN_G=ON; //打开分个位位选
delay(1); //显示1毫秒
MIN_G=OFF; //关闭分个位位选
LEDBus=LEDTab[minute/10]; //分十位送数码管显示
MIAO=SHAN; //秒点闪烁
MIN_S=ON; //打开分十位位选
delay(1); //显示1毫秒
MIN_S=OFF; //关闭分十位位选
LEDBus=LEDTab[hour%10]; //时个位送数码管显示
HOU_G=ON; //打开时个位位选
delay(1); //显示1毫秒
HOU_G=OFF; //关闭时个位位选
if(hour/10) //如果时十位为0,不显示十位数字
{
LEDBus=LEDTab[hour/10]; //时十位送数码管显示
HOU_S=ON; //打开时十位位选
delay(1); //显示1毫秒
HOU_S=OFF; //关闭时十位位选
}
}
/***************************************
函 数 名:min_tiao
功 能:分调整
说 明:
入口参数:无
返 回 值:无
***************************************/
void min_tiao()
{
while(!M_KEY) display(); //等待分调整键松开
second=0;minute++; //秒清零、分加1
if(minute==60) minute=0; //如果分等于60,分变0
}
/***************************************
函 数 名:hou_tiao
功 能:时调整
说 明:
入口参数:无
返 回 值:无
***************************************/
void hou_tiao()
{
while(!H_KEY) display(); //等待时调整键松开
second=0;hour++; //秒清零,时加1
if(hour==24) hour=0; //如果时等于24,时变0
}
/***************************************
函 数 名:delay
功 能:延时函数
说 明:
入口参数:t:延时时间长短
返 回 值:无
***************************************/
void delay(uchar t)
{
uchar i; //定义变量
for(;t>0;t--) //如果t大于0,t减1(外层循环)
for(i=124;i>0;i--); //i等于124,如果i大于0,i减1
}
/***************************************
函 数 名:timer0
功 能:定时器0中断函数
说 明:
入口参数:无
返 回 值:无
***************************************/
void timer0() interrupt 1 //定时器0(中断1)
{
uchar tim1,tim2; //定义临时变量
TL0=TL0+0XB0;TH0=0X3C; //重装定时器初值
tim1++; //每中断一次tim1加1
if(tim1==10) //中断10(0.5秒)
{
SHAN=!SHAN; //闪烁标志取反
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second==60) //如果秒到60
{
second=0;minute++; //秒变0,分加1
if(minute==60) //如果分到60
{
minute=0;hour++; //分变0,时加1
if(hour==24) hour=0; //如果时到24,时变0
}
}
}
}
}
/***************************************
program end 程序结束
『伍』 单片机课程设计 电子时钟设计
基于AVR单片机Mega16的电子时钟设计
摘要】 Mega16是一款采用先进RISC精简指令,内置A/D的8位单片机内,可支持低电压联机Flash和EEPROM写入功能容;同时还支持Basic和C等高级语言编程。用它设计电子时钟不仅成本低,硬件简单,而且很容易实现系统移植。介绍了如何利用AVR系列单片机Mega16及1602字符液晶来设计电子时钟的方法,同时给出了相应的电路原理及部分语言程序。
『陆』 单片机de课程设计 数字电子钟
可以代做的
『柒』 电子钟课程设计(微机原理)急需!!!!
电子闹钟接线图
设计原理:
计时功能:
用到的8254的功能只是相当于一个分频计,输入一定频率的脉冲信号使每隔一秒就会在OUT0端产生0到1的跃变,作为中断IRQ的请求信号。由于秒、分的进制形式不同,可通过中断程序控制,由此完成计时功能。
显示功能:
可以用四位二进制码分别对应表示X4X3X2X1的逻辑值(1--高电平,0--低电平),实现时钟的显示功能。具体操作:首先将秒的个位数据通过8255的B端口送给数码管,同时将二进制码“0111”通过8255的A端口送给小键盘X4X3X2X1,这样通过计算机的扫描后,就会在数码管4上显示秒的个位值;接着将秒的十位数据送给数码管,同时将二进制码“1011”送给小键盘X4X3X2X1,这样就会在数码管3上显示相应的数值;同样的道理,分别将分的个位、十位送给数码管,“1101” 、“1110”送给小键盘X4X3X2X1,就会依次在数码管2、1上显示分的个位、十位数值。特别注意分秒的间隔点,由于数码管共阴极,将数码二进制最高位置1,其他为置0即可。
按键功能:
由于X1,X2,X3,X4低电平显示相应的数码管,利用读回的Y1,Y2逻辑值辨别究竟按下哪个键,并通过相应的编程来完成不同键的按键功能。
(1)1键清除功能的设置:
在判别了按键的逻辑值为01110后,将存储时间的每一个内存单元赋0,这样在数码管显示的就是00.00,便达到了清除功能的目的。
(2)2键启动、3键停止计时功能的设置:
在进行2键和3键功能设置之前,我们必须定义一个暂停标志位:PAUSE,它用标准的逻辑值(0、1)来表示,假如PAUSE=0,在进行计时设置的时候,让其自动加1,依次显示时间的各位;假如PAUSE=1,我们就将其返回,停止加1,即暂停计时。
接着,假如我们判别的是2键被按下,就令PAUSE=0,让计数器计时,自动加1;假如我们按下的是3键,就令PAUSE=1,让计数器暂停计时,即停止加1。
(3)4键终止程序功能的设置:
从上面的分析,我们已经知道,只有同时将对应键盘X列的低电平送到相应的数码管才会使得数码管亮,所以我们在判别了是4键被按下后,只要将键盘对应的二进制码全部赋高电平,并送到数码管,同时结束程序,就可以实现熄灭数码管、退出程序的功能。
(4)5键重置初始值功能的设置:
在这里我们设置了两个标志位:调整位标志ADJUST和闪烁标志FLASH。它们的具体设置如下:
ADJUST初始设置为00H,表示非调整状态,01H表示调整秒的个位,02H表示调整秒的十位,03H表示调整分的个位,04H表示调整分的十位。
FLASH设置为逻辑值,初始设置为00H,表示非闪烁状态,0FFH表示闪烁,其闪烁功能实现的过程为:假如FLASH=0FFH,则将00H送给数码管,让数码管不显示。然后,在中断计时程序里面,加入FLASH取反语句,由于计时程序每秒加1循环一次,这样FLASH也实现了每秒改变逻辑值一次。也就是说,数码管闪烁的周期是1秒。当然,闪烁标志位只是在有对应位需要调整的时候才用的着。
要实现5键设置初始时间的功能,我们就必须增加一个键(6键)来控制时间的增加。
(5)6键时间位加1功能的设置
这里,我们再引进一个标志位:按键标志KEYMARK。其设置为逻辑值,初始设置为0,表示允许响应此次按键,并在响应过后,将其置1;KEMARK为1时,表示不响应此次按键。之所以要设置此标志位,是因为键盘扫描的速度非常快,假如我按下6键需要调整时间加1,我按下的时间再怎么短,计算机一定已经扫描了无数次,这样一来,我只按了一次,时间位就会响应无数次,实现了无数次的加1,从而无法实现6键的功能。
汇编源程序:
INTCSR_BYTE0 EQU 9438H
INTCSR_BYTE1 EQU 9439H
INTCSR_BYTE2 EQU 943AH
INTCSR_BYTE3 EQU 943BH
IMB4_BYTE3 EQU 941FH
MY8254_COUNT0 EQU 9C40H
MY8254_COUNT1 EQU 9C41H
MY8254_COUNT2 EQU 9C42H
MY8254_MODE EQU 9C43H
MY8255_A EQU 9C60H
MY8255_B EQU 9C61H
MY8255_C EQU 9C62H
MY8255_MODE EQU 9C63H
IRQ EQU 01C8H
DATA SEGMENT
CSBAK DW ?
IPBAK DW ?
MKBAK DB ?
ADJUST DB 00H ;调整位标志
FLASH DB 00H ;闪烁标志位
PAUSE DB 0B ;暂停标志位
KEYMARK DB 0B ;按键标志位
INKEY DB 00H ;按键
SECONDA DB 00H ;秒个位
SECONDB DB 00H ;秒十位
MINUTEA DB 00H ;分个位
MINUTEB DB 00H ;分十位
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;数码管0-9的编码
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
CLI
MOV AX,DATA
MOV DS,AX
MOV DX,INTCSR_BYTE0
MOV AL,00H
OUT DX,AL
MOV DX,INTCSR_BYTE1
MOV AL,1FH
OUT DX,AL
MOV DX,INTCSR_BYTE2
MOV AL,3FH
OUT DX,AL
MOV DX,INTCSR_BYTE3
MOV AL,00H
OUT DX,AL
MOV AX,0000H
MOV ES,AX
MOV DI,01ccH ;保存系统中断矢量
MOV AX,ES:[DI]
MOV IPBAK,AX
MOV AX,OFFSET MYINT
CLD
STOSW
MOV AX,ES:[DI]
MOV CSBAK,AX
MOV AX,SEG MYINT ;设置中断矢量
STOSW
IN AL,0A1H
MOV MKBAK,AL
AND AL,0F7H
OUT 0A1H,AL
STI ;开中断
MOV DX,MY8254_MODE ;8254初始化
MOV AL,15H ; 00010101:计数器0,只读低八位,方式2分频器,十进制
OUT DX,AL
MOV DX,MY8254_COUNT0
MOV AL,0
OUT DX,AL
MOV DX,MY8255_MODE ;8255初始化
MOV AL,81H ;10000001:A口:方式0,输出,B口:方式 0 ,
;输出,C口:低四位输入,高四位输出
OUT DX,AL
A1: NOP ;等待
MOV CX,32H
A2: MOV DX, MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LED
MOV AL,SECONDA
XLAT LED
CMP ADJUST,01H ;是否调整秒的个位
JNE DIS_SECONDA
CMP FLASH,0FFH ;是否闪烁
JNE DIS_SECONDA
AND AL,00H ;熄灭数码管(若FLASH=1)
DIS_SECONDA: ;显示秒的个位
OUT DX, AL
MOV DX,MY8255_A
MOV AL,0111B
OUT DX,AL
CALL KEYCTR ;调用按键处理程序
CALL DELAY ;调用延迟程序
MOV DX,MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LED
MOV AL,SECONDB
XLAT LED
CMP ADJUST,02H ;是否调整秒的十位
JNE DIS_SECONDB
CMP FLASH,0FFH
JNE DIS_SECONDB
AND AL,00H
DIS_SECONDB: ;显示秒的十位
OUT DX,AL
MOV DX,MY8255_A
MOV AL,1011B
OUT DX,AL
CALL KEYCTR
CALL DELAY
MOV DX,MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET LED
MOV AL,MINUTEA
XLAT LED
CMP ADJUST,03H ;是否调整分的个位
JNE DIS_MINUTEA
CMP FLASH,0FFH
JNE DIS_MINUTEA
AND AL,00H
DIS_MINUTEA: ;显示分的个位
ADD AL,80H ;显示XX.XX中的点“.”
OUT DX,AL
MOV DX,MY8255_A
MOV AL,1101B
OUT DX,AL
CALL KEYCTR
CALL DELAY
MOV DX,MY8255_B
MOV AX,DATA
MOV DS,AX
MOV BX , OFFSET LED
MOV AL, MINUTEB
XLAT LED
CMP ADJUST,04H ;是否调整分的十位
JNE DIS_MINUTEB
CMP FLASH,0FFH
JNE DIS_MINUTEB
AND AL,00H
DIS_MINUTEB: ;显示分的十位
OUT DX,AL
MOV DX,MY8255_A
MOV AL , 1110B
OUT DX,AL
CALL KEYCTR
CALL DELAY
LOOP SK1
JMP SK2
SK1: JMP A2
SK2: JMP A1
MYINT: PUSH DS
PUSH AX
PUSH DX
MOV DX,IMB4_BYTE3
IN AL,DX
MOV DX,INTCSR_BYTE2
MOV AL,3FH
OUT DX,AL
;清8259中断标志
MOV AL,63H ;根据中断号修改
OUT 0A0H,AL
MOV AL,62H
OUT 20H,AL
MOV AX,DATA
MOV DS,AX
NOT FLASH ;中断处理程序
MOV KEYMARK,0B
CMP PAUSE,0B
JNE L1
INC SECONDA
CMP SECONDA,0AH
JC L1
MOV SECONDA,00H
INC SECONDB
CMP SECONDB,06H
JC L1
MOV SECONDB,00H
INC MINUTEA
CMP MINUTEA,0AH
JC L1
INC MINUTEB
MOV MINUTEA,00H
CMP MINUTEB,06H
JC L1
MOV MINUTEB,00H
L1: POP DS
POP AX
POP DX
IRET
KEYCTR PROC NEAR
MOV INKEY,AL
MOV DX,MY8255_C
IN AL,DX
AND AL,03H ;高六位清零
CMP AL,10B ;是否按下Y1行
JNE INY2
ADD INKEY,00H
JMP JUDGKEY
INY2: CMP AL,01B ;是否按下Y2行
JNE SKIP
ADD INKEY,10000B
JUDGKEY:
CMP INKEY,01110B ;是否按下1键
JNE KEY2
AND SECONDA,00H ;时间位清零
AND SECONDB,00H
AND MINUTEA,00H
AND MINUTEB,00H
SKIP: JMP BACK
KEY2: CMP INKEY,01101B ;是否按下2键
JNE KEY3
AND PAUSE,0B ;启动计时
JMP BACK
KEY3: CMP INKEY,01011B ;是否按下3键
JNE KEY4
MOV PAUSE,1B ;暂停计时
JMP BACK
KEY4: CMP INKEY,00111B ;是否按下4键
JNE KEY5
MOV DX,MY8255_A
MOV AL,0FFH ;熄灭数码管,程序退出
OUT DX,AL
CALL DELAY
MOV AX,4C00H
INT 21H
JMP BACK
KEY5: CMP INKEY,11110B ;是否按下5键
JNE KEY6
CMP KEYMARK,0B
JNE KEY6
MOV KEYMARK,1B
MOV PAUSE,1B
CMP ADJUST,04H ;是否已调整完分的十位
JE TL
INC ADJUST
JMP BACK
TL: AND ADJUST,00H
JMP BACK
KEY6: CMP INKEY,11101B ;是否按下6键
JNE BACK
CMP KEYMARK,0B
JNE BACK
MOV KEYMARK,1B
CMP ADJUST,01H ;是否调整秒的个位
JNE AD1
INC SECONDA ;秒的个位加1
CALL OUTCLEAR ;判断溢出
JMP BACK
AD1: CMP ADJUST,02H ;是否调整秒的十位
JNE AD2
INC SECONDB
CALL OUTCLEAR
JMP BACK
AD2: CMP ADJUST,03H ;是否调整分的个位
JNE AD3
INC MINUTEA
CALL OUTCLEAR
JMP BACK
AD3: CMP ADJUST,04H ;是否调整分的十位
JNE BACK
INC MINUTEB
CALL OUTCLEAR
BACK: RET
KEYCTR ENDP
OUTCLEAR PROC NEAR ;溢出清零程序
CMP SECONDA,0AH
JC Q1
AND SECONDA,00H
Q1: CMP SECONDB,06H
JC Q2
AND SECONDB,00H
Q2: CMP MINUTEA,0AH
JC Q3
AND MINUTEA,00H
Q3: CMP MINUTEB,06H
JC Q4
AND MINUTEB,00H
Q4: RET
OUTCLEAR ENDP
DELAY: PUSH CX ;延迟程序
MOV CX,1111H
DXMS: LOOP DXMS
POP CX
RET
CODE ENDS
END START