基于单片机的实时时钟
摘要:
时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。本文利用单片机实现数字时钟计时功能的主要内容,其中AT89C51是核心元件同时采用数码管动态显示“时”,“分”,“秒”的现代计时装置。与传统机械表相比,它具有走时精确,显示直观等特点。它的计时周期为24小时,显满刻度为“23时59分59秒”,另外具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。
本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟
关键词:C51单片机 动态显示 键盘输入 电压检测 电池功耗
目录
第1章 前言 4
第2章 系统设计 4
2.1 电路组成及工作原理 4
2.2 硬件部分 5
2.2.1 单片机系统 5
2.2.1.1 5
2.2.2.2 AT89C51的主要性能参数 5
2.2.2 显示部分 6
2.2.2.1 LED显示结构与原理 6
2.2.2.2 LED显示器接口及显示方式 7
2.2.3 键盘工作模块 8
2.2.3.1 独立式按键结构 9
2.2.3.2 独立式按键的软件结构 9
2.2.4 电压检测电路 9
2.2.5 备用电池功耗问题 10
2.2.6 直流稳压电源部分 10
2.2.6.1 主要技术指标 11
2.2.6.2 滤波电路 11
2.2.7 相关参数计算 12
第3章 软件设计(图) 13
3.1 13
3.2 13
3.3 13
第4章 系统调试 17
4.1 硬件调试 17
4.2 软件调试 17
4.3 时钟计时检测 17
第5章 致谢 18
第6章 参考文献 19
附录(一) 20
附录(二) 29
第1章 前言
单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由直流电源供电,通过数码管能够准确显
数字时钟是现代社会应用广泛的计时工具,在航天、电子等科研单位,工厂、医院、学校等企事业单位,各种体育赛事及至我们每个人的日常生活中都发挥着重要的作用。本系统是基于AT89C51单片机设计的一个具有六位LED显示的数字时实时钟,采用独立式按键进行时间调整,同时引入一个内部充电电源在停止外部供电时,仍具有内部计时的功能。该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点
第2章 系统设计
2.1 电路组成及工作原理
本文数字时钟设计原理主要利用AT89C51单片机,由单片机的P0口控制数码管的位显示, P2口控制数码管的段显示,P1口与按键相接用于时间的校正。在设计中引入两个电源电路,一个是外部电源系统产生+5V电压,用于给CPU及显示电路提供工作电压,这是数字时钟正常工作时的总电压。另一个是备用电源,当外部电源关断时由它提供工作电压使CPU继续工作,利用单片机的空闲方式降低功耗,数码管不显示但能使计时保持正常,不会造成掉电时计时清零的现象。针对内外两个电源情况又加入了MC34064电压检测电路,用于时实判断是哪各电源在工作。
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。
2.2 硬件部分
2.2.1 单片机系统
2.2.1.1 单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU),随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/O口),可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED驱动电路),脉宽调制电路(PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。
本文采用的单片机为AT89C51,AT89C51是一种低功耗、高性能的片内含有4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。它的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.2.2.2 AT89C51的主要性能参数:
与MCS-51产品指令系统完全兼容
4k 字节可重擦写FLASH闪速存储器
1000次擦写周期
全静态操作:0Hz—24MHz
三级加密程序存储器
128×8字节内部RAM
32个可编程I/O口线
2个16位定时/计数器
6个中断源
可编程串行URAR通道
低功耗空闲和掉电模式
AT89C51提供以下标准功能:4k 字节FLASH闪速存储器,128字节内部RAM,32个I/O口线,2个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51降至0Hz的静态逻辑操作,并支持两种可选的节电工作模式。空闲方式体制CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器体制工作并禁止其他所有不见工作直到下一个硬件复位。
2.2.2 显示部分
单片机应用系统中使用的显示器主要有发光二极管显示器,简称LED(Light Emitting Diode);液晶显示器LCD(Liquid Crystal Display);近几年也有配置CRT显示器的。而目前在单片机系统中,通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
2.2.2.1 LED显示结构与原理
单片机中通常用七段LED构成字型“8”,另外,还有一个小数点发光二极管以显示小数位!这种显示器有共阴和共阳两种!发光二极管的阳极连在一起的(公共端)称为共阳极显示器,阴极连在一起的称为共阴极显示器。(如下图所示)
一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划(段)
a_g,另一个小数点为dp发光二极管。当在某段发光二极管上施加一定的正向电压时,该段笔画即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。
由于共阴极连接需加驱动,故在这里我采用的是共阳阳极连接。
以共阳极LED为例,如图(b)所示,各LED公共阳极K0接高电平,若向各控制端a,b, ┄,g,dp顺次送入00011110信号,则该显示器显示“⒎”字型。
共阴极7段LED显示数字0 ~ F、文字、符号及小数点的编码(a段为最地位,dp点为最高位)如(图2-1)所示。
共阴极7 段LED显示字型编码表
显示字符 共阴极段选码 显示字符 共阴极段选码
0 3FH 5 6DH
1 06H 6 7DH
2 5BH 7 07H
3 4FH 8 7FH
4 66H 9 6FH
“灭”(黑) 00H
图2-1
2.2.2.2 LED显示器接口及显示方式
LED显示器有静态显示方式和动态显示方式两种。静态显示就是当显示器显示某个字符时,相应的段恒定的导通或截止,直到显示另一个字符为止。LED显示器工作于静态显示方式时,各位的共阴极接地;若为共阳极则接+5V电源。每位的段选线分别与一个8位锁存器的输出口相连,显示器中的各位相互独立,而且各位的显示字符一经确定,相应锁存的输出将维持不变。
正因为如此,静态显示器的亮度较高。这种显示方式编程容易,管理也较简单,但占用I/O口线资源较多。因此,在显示位数较多的情况下,一般都采用动态显示方式。
由于所有6位段皆由一个I/O口控制,因此,在每一瞬间,6位LED会显示相 同的字符。要想每位显示不同的字符,就必须采用扫描方法流点亮各位LED,即在每一瞬间只使某一位显示字符。在此瞬间,段选控制I/O口输出相应字符段选码(字型码),而位选则控制I/O口在该显示位送入选通电平(因为LED为共阴,故应送低电平),以保证该位显示相应字符。如此轮流,使每位分时显示该位应显示字符。例如,要求显示“LL0-20”时,I/O1和I/O2轮流送入段选码、位选码
图2-2
在多位LED显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8位I/O口控制。而共阴(共阳)极公共端分别由相应的I/O口线控制,实现各位的分时选通。
段选码,位选码每送入一次后延时1MS,因人的视觉暂留时间为0.1S(100MS),所以每位显示的时间不能超过20MS,并保持延时一段时间,以造成视觉暂留效果,给人看上去每个数码管总在亮。这种方式称为软件扫描方式。
2.2.3 键盘工作模块
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。由于其经济实用,较多地应用于单片机系统中。在本套设计中由于只需要几个功能键,此时,可采用独立式按键结构
2.2.3.1 独立式按键结构
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如(图3.1)所示。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,采用。
图2.1 独立式按键电路
2.2.3.2 独立式按键的软件结构
独立式按键的软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。图3.1中的I/O口采用P1口。
2.2.4电压检测电路
电路核心元件是MC34064,它具有电压检测功能。工作方式是低电平有效, 因此将其1脚与单片机的P1.7相接,2脚接VCC,3脚接地。当外部电源+5V供电时,P1.7为高电平送入累加器C,此时C=1调入显示,时钟进入正常的计时显示状态。当+5V没接入而采用备用电源工作时,P1.7为低电平送入累加器C,此时C=0单片机进入空闲方式,关断显示但内部计时仍在进行。这样就能很好地判断是外部+5V电源供电还是备用电池供电,根据CPU的工作状态进而实现时钟断电仍能计时,当重新接入+5V电源时实现计时显示同步运行的功能。
2.2.5备用电池功耗问题
在设计方案中采用+3.6V可充电电池作为备用电源,但若把电池直接并联在外部+5V电源引脚两端时,存在着电池功耗问题如:1.接入+5V时会对电池B1进行电流很大的强充电过程,这会直接影响电池的使用寿命。2.停止外部+5V供电时,此时外部电源等效于一个电压源,充电电池B1既要对CPU供电又要对电压源供电,这样会使电池电量消耗过大,使得电池供电效率大大降低。
为解决上述问题,我们引入两个1N5819如图所示:1.若+5V接入时,一方面为显示部分和复位电路提供+5V 工作电压,另一方面通过V8、 R15对电池B1进行涓流充电,同时通过V7向CPU提供工作电压。从而很好地解决电池充电时,电流过大影响电池使用寿命的问题。2.当外部+5V电源断开时,由电池B1经V7向CPU提供工作电压,同时由于V8截止故不会造成电池B1对外部的放电,从而提高了电池的供电效率,能够长时间地为CPU提供工作电压。如(图5-1)
图5-1
2.2.6 直流稳压电源部分
直流稳压电源是给电子设备提供稳定直流电压的电子电路。这次电路需要的是+5V直流电源。
6.1设计分析
本电源设计可采用集成三端稳压器构成,只要加上一些外围元件即可实现。其框图和电路分别示于图2-1和图2-2所示。
图6-1 直流稳压电源框图
2.2.6.1 主要技术指标
(1) 输入交流电压220V(50~60Hz)。
(2) 输出直流电压5V,输出电流1A。
(3) 输入交流在220V上下波动10%时,输出电压相对变化量小于2%。
(4) 输入电阻R0<0.1Ω。
(5) 输出最大波纹电压小于10Mv。
图6-2
2.2.6.2 滤波电路
它的任务是将全滤波形的输出通过RC滤波网络以后变成更平坦的直流电压,减小脉动,提高整流的效果。这是整流管中通过的电流的瞬间值要比平均值大得多,特别在接通电源瞬间有相当大的冲击电流(即充电电流)通过整流管,这一点要引起注意。
(1) 电源变压器
它的任务是把电源电压220V变压到合适的大小。如果U2的值太大,会造成集成端稳压器7805的功豪大,温升高,且浪费电能。反之,如果U2的值小到一定程度,三端稳压器不能正常工作,失去稳压作用.因此U2的值应大小合适,这个值应该使三端稳压器在交流电网电压最低和输出电流最大时能正常工作。而且在正常稳压的前提下,它的压降尽可能小,以减小功耗。
(2) 整流电路
它的任务是将正弦波变换成直流电压。这里一般采用桥式整流电路来实现,既可用四个二极管来组成,也可用整流桥堆来完成,只是参数一定要选择合理。
(3) 稳压电路
要求输出恒定的直流电压,且要达到设计中所提出的要求。在此选用一片7805芯片来实现。
2.2.7相关参数计算
关于驱动电路中的限流电阻R,通常根据LED的工作电流计算而得到的。
例如:(1.) R1=(VCC-V0)/I0 其中VCC=+5V, V0的压降为+1.4v, I0的工作电流为10mA 所以R1=(5V-1.4V)/10mA=360Ω,要想得到10mA的工作电流必须使限流电阻大于360Ω,故在电路中我选用了390Ω的电阻。
(2) 对于连接位选显信号的电阻选用上,由Ic<100Ib,I0=10mA,得Ib>0.1 mA,根据R2=(VCC-Vbc)/Ib=(5v-0.7v)/0.1 mA=4.3kΩ,若要Ib>0.1 mA则必须使R2>4.3 kΩ,因此选用了比较接近的4.7 kΩ
第3章 软件设计(图)
3.1时钟主程序流程图1
3.2键盘中断处理程序流程图2
3.3定时中断服务程序流程图3
第4章 系统调试
4.1 硬件调试:主要检查了电路板有无虚焊、短路、连线是否正常,尤其是单片机的各使能端的接线,I/O接口连线是否有误。由于我们采用了六个数码管并联接入P2口的段选端,因此接线较多,经常容易出现管脚间短路现象。这是硬件设计不足之处,今后将注意元件的选配使设计更简洁实用。
4.2 软件调试:在LCA51仿真机上,对定时中断程序、显示子程序、按键中断子程序进行了分段调试,结果功能正常。
4.3 时钟计时检测:通过与其它计时器对比观察发现数字时钟走时过快,检查定时中断程序发现T0的初始值设定有误,因此重新设置:
根据T0选择工作模式1,定时时间为50ms, focs=12MHz,
由 T=(2^16-T0初始值) ×振荡周期×12
设T0的初始值为X,
则:(2^16-X)×1/12×10^6s×12=50ms
X=15625,
转化二进制值为:X=0011110010111010, 即TH=#3CH,TL=#0BAH
第5章 致谢
在设计过程中,通过针对性地查找资料,了解了些电子方面的资料,既增长了自己见识,补充最新的专业知识,又提高了自己的应用能力。
这次对AT89C51有了一个全面的认识,在此基础上结合以前所学的专业知识,从而把我所学的知识贯穿到一起,对电子专业有了一个更全面的认识!
总之这次毕业设计让我把理论设计和工程实践相结合、巩固基础知识与培养创新意识相结合、个人作用和集体协作相结合等方面全面的培养学生的全面素质。这些在我今后的学习和工作当中都会有很大的帮助。
最后,我要感谢我的指导老师,在这次毕业设计中给了我许多的帮助。同时也感谢无锡商院明天更美好!
第6章 参考文献
[1] 实用单片机电子钟的设计/丁辉、姚庆文 无线电2003年合订本(下)
[2] 于海生.微型计算机控制技术[M] .清华大学出版社.1999-6
[3] 孙涵芳.MCS-51系列单片机原理及应用[M] .北京航空航天大学出版社.1996-4
[4] 黄正谨.综合电子设计与实践[M] .东南大学出版社.2002-3
[5] 杨欣等.电子设计从零开始[M] .清华大学出版社.2005-10
[6] 谢嘉奎.电子线路[M] .高等教育出版社.2003-2
[7] 夏路易,石宗义.电路原理图与电路设计教程Protel 99SE[M] .北京希望电子出版社.2002
附录(一)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; DEF RAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HOUR EQU 20H
MIN EQU 21H
SEC EQU 22H
SEC01 EQU 23H
KEYFL EQU 24H
KEYREG EQU 25H
TMINTFL EQU 26H
SETFL EQU 27H
DSPDAT1 EQU 28H
DSPDAT2 EQU 29H
DSPDAT3 EQU 2AH
DSPDAT4 EQU 2BH
DSPDAT5 EQU 2CH
DSPDAT6 EQU 2DH
SHFL EQU 2EH
SMFL EQU 2FH
SSFL EQU 30H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MAIN ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP START
ORG 000BH
LJMP TIMEINT
ORG 0100H
START: MOV R7,#250
LOOP: NOP
NOP
DJNZ R7,LOOP
MOV IE,#00H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV SETFL,#00H
MOV KEYFL,#00H
MOV KEYREG,#00H
MOV TMINTFL,#00H
MOV SHFL,#00H
MOV SMFL,#00H
MOV SSFL,#00H
MOV TMOD,#01H
MOV TCON,#00H
MOV TH0,#3CH
MOV TL0,#0BAH
MOV IE,#82H
MOV TCON,#10H
MAIN: MOV A,SETFL
JNZ MAIN1
MOV TMINTFL,#00H
MOV R0,HOUR
MOV A,TMINTFL
JNZ MAIN2
MOV R1,MIN
MOV A,TMINTFL
JNZ MAIN2
MOV R2,SEC
MOV C,P1.7
JNC MAIN3
LCALL CODECHA
MAIN1: MOV C,P1.7
JNC MAIN3
LCALL DISP
MOV C,P1.7
JNC MAIN3
MOV A,P1
ANL A,#1FH
MOV KEYREG,A
CLR C
SUBB A,#1FH
JZ MAIN1A
MOV A,KEYFL
JNZ MAIN2
MOV C,P1.7
JNC MAIN3
LCALL KEY
LJMP MAIN2
MAIN1A: LCALL DISP
MOV A,P1
ANL A,#1FH
CLR C
SUBB A,#1FH
JNZ MAIN2
MOV KEYFL,#00H
MAIN2: NOP
MOV C,P1.7
JC MAIN
MAIN3: MOV PCON,#01H
LJMP MAIN2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TIMEINT SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIMEINT: MOV IE,#00H
MOV TCON,#00H
MOV TH0,#3CH
MOV TL0,#0BAH
MOV TCON,#10H
MOV IE,#82H
PUSH PSW
PUSH ACC
INC SEC01
MOV A,#19
CLR C
SUBB A,SEC01
JC TIMEINT1
LJMP TIMEINT4
TIMEINT1: MOV SEC01,#00H
MOV TMINTFL,#0FFH
MOV A,SEC
ADD A,#1
DA A
MOV SEC,A
CLR C
SUBB A,#60H
JNC TIMEINT2
LJMP TIMEINT4
TIMEINT2: MOV SEC,#00H
MOV A,MIN
ADD A,#1
DA A
MOV MIN,A
CLR C
SUBB A,#60H
JNC TIMEINT3
LJMP TIMEINT4
TIMEINT3: MOV MIN, #00H
MOV A,HOUR
ADD A,#1
DA A
MOV HOUR,A
CLR C
SUBB A,#24H
JC TIMEINT4
MOV HOUR,#00H
TIMEINT4: POP ACC
POP PSW
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;CODECHA SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODECHA: MOV A,R0
SWAP A
ANL A,#0FH
MOV DSPDAT1,A
MOV A,R0
ANL A,#0FH
MOV DSPDAT2,A
MOV A,R1
SWAP A
ANL A,#0FH
MOV DSPDAT3,A
MOV A,R1
ANL A,#0FH
MOV DSPDAT4,A
MOV A,R2
SWAP A
ANL A,#0FH
MOV DSPDAT5,A
MOV A,R2
ANL A,#0FH
MOV DSPDAT6,A
MOV C,P1.7
JNC CODECHA2
MOV DPTR,#TABDSP
MOV R0,#DSPDAT1
MOV R1,#6
CODECHA1: MOV A,@R0
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R1,CODECHA1
CODECHA2: RET
TABDSP: DB 88H,0BEH,0C4H,94H,0B2H
DB 91H,81H,0BCH,80H,90H,0FFH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; DISP SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP: MOV R2,#6
MOV R1,#0FEH
MOV R0,#DSPDAT1
DISP1: MOV C,P1.7
JNC DISP2
MOV P2,@R0
MOV C,P1.7
JNC DISP2
MOV P0,R1
MOV C,P1.7
JNC DISP2
LCALL DEL1MS
MOV P2,#0FFH
MOV P0,#0FFH
MOV A,R1
RL A
MOV R1,A
INC R0
DJNZ R2,DISP1
DISP2: MOV P2,#0FFH
MOV P0,#0FFH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; DEL1MS SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEL1MS: MOV C,P1.7
JNC DEL1MS2
MOV R6,#249
DEL1MS1: MOV C,P1.7
JNC DEL1MS2
NOP
DJNZ R6,DEL1MS1
DEL1MS2: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; KEY SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY: LCALL DISP
MOV A,P1
ANL A,#1FH
CLR C
SUBB A,KEYREG
JNZ KEY5
MOV KEYFL,#0FFH
MOV A,KEYREG
RRC A
JC KEY1
MOV C,P1.7
JNC KEY5
LCALL SHKEY
LJMP KEY5
KEY1: RRC A
JC KEY2
MOV C,P1.7
JNC KEY5
LCALL SMKEY
LJMP KEY5
KEY2: RRC A
JC KEY3
MOV C,P1.7
JNC KEY5
LCALL SSKEY
LJMP KEY5
KEY3: RRC A
JC KEY4
MOV C,P1.7
JNC KEY5
LCALL INCKEY
LJMP KEY5
KEY4: RRC A
JC KEY5
MOV C,P1.7
JNC KEY5
LCALL ENTER
KEY5: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SHKEY SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHKEY: MOV IE,#00H
MOV TCON,#00H
MOV SETFL,#0FFH
MOV SHFL,#0FFH
MOV SMFL,#00H
MOV SSFL,#00H
MOV R0,HOUR
MOV R1,#0AAH
MOV R2,#0AAH
LCALL CODECHA
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SMKEY SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SMKEY: MOV IE,#00H
MOV TCON,#00H
MOV SETFL,#0FFH
MOV SMFL,#0FFH
MOV SHFL,#00H
MOV SSFL,#00H
MOV R1,MIN
MOV R0,#0AAH
MOV R2,#0AAH
LCALL CODECHA
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SSKEY SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SSKEY: MOV IE,#00H
MOV TCON,#00H
MOV SETFL,#0FFH
MOV SSFL,#0FFH
MOV SHFL,#00H
MOV SMFL,#00H
MOV R2,SEC
MOV R0,#0AAH
MOV R1,#0AAH
LCALL CODECHA
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INCKEY SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCKEY: MOV A,SHFL
JZ INCKEY1
MOV A,HOUR
ADD A,#1
DA A
MOV HOUR,A
CLR C
SUBB A,#24H
JC INCKEY1A
MOV HOUR,#00H
INCKEY1A: MOV R0,HOUR
MOV R1,#0AAH
MOV R2,#0AAH
LCALL CODECHA
LJMP INCKEY3
INCKEY1: MOV A,SMFL
JZ INCKEY2
MOV A,MIN
ADD A,#1
DA A
MOV MIN,A
CLR C
SUBB A,#60H
JC INCKEY2A
MOV MIN,#00H
INCKEY2A: MOV R1,MIN
MOV R0,#0AAH
MOV R2,#0AAH
LCALL CODECHA
LJMP INCKEY3
INCKEY2: MOV A,SSFL
JZ INCKEY3
MOV A,SEC
ADD A,#1
DA A
MOV SEC,A
CLR C
SUBB A,#60H
JC INCKEY3A
MOV SEC,#00H
INCKEY3A: MOV R2,SEC
MOV R0,#0AAH
MOV R1,#0AAH
LCALL CODECHA
INCKEY3: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ENTER SUB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ENTER: MOV A,SETFL
JZ ENTER1
MOV SEC01,#00H
MOV SETFL,#00H
MOV SHFL,#00H
MOV SMFL,#00H
MOV SSFL,#00H
MOV TCON,#00H
MOV TH0,#3CH
MOV TL0,#0BAH
MOV IE,#82H
MOV TCON,#10H
ENTER1: RET
END
附录(二) |
|