实时日历/时钟系统的实现

合集下载

STM32-RTC实时时钟-毫秒计时实现

STM32-RTC实时时钟-毫秒计时实现

STM32-RTC实时时钟-毫秒计时实现OS:Windows 64Development kit:MDK5.14IDE:UV4MCU:STM32F103C8T61、RTC时钟简介 STM32 的实时时钟(RTC)是⼀个独⽴的定时器,在相应软件配置下,可提供时钟⽇历的功能。

详细资料请参考ALIENTEK的官⽅⽂档——《STM32F1开发指南(精英版-库函数版)》,以下为博主摘录要点:RTC 模块和时钟配置系统(RCC_BDCR 寄存器)在后备区域,系统复位后,会⾃动禁⽌访问后备寄存器和 RTC ,所以在要设置时间之前,先要取消备份区域(BKP)的写保护RTC 内核完全独⽴于 RTC APB1 接⼝,⽽软件是通过 APB1 接⼝访问 RTC 的预分频值、计数器值和闹钟值,因此需要等待时钟同步,寄存器同步标志位(RSF)会硬件置1RTC相关寄存器包括:控制寄存器(CRH、CRL)、预分频装载寄存器(PRLH、PRLL)、预分频器余数寄存器(DIVH、DIVL)、计数寄存器(CNTH、CNTL)、闹钟寄存器(ALRH、ALRL)STM32备份寄存器,存RTC校验值和⼀些重要参数,最⼤字节84,可由VBAT供电计数器时钟频率:RTCCLK频率/(预分频装载寄存器值+1)2、软硬件设计 由于RTC是STM32芯⽚⾃带的时钟资源,所以⾃主开发的时候只需要在设计时加上晶振电路和纽扣电池即可。

编程时在HARDWARE⽂件夹新建 rtc.c、rtc.h ⽂件。

3、时钟配置与函数编写 为了使⽤RTC时钟,需要进⾏配置和时间获取,基本上按照例程来写就可以了。

为避免零散,我将附上完整代码。

函数说明如下:rtc.c中需要编写的函数列表RTC_Init(void)配置时钟RTC_NVIC_Config(void)中断分组RTC_IRQHandler(void)秒中断处理RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)设置时间RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8sec)闹钟设置RTC_Get(void)获取时钟RTC_Get_Week(u16 year,u8 month,u8 day)星期计算Is_Leap_Year(u16 year)闰年判断 事实上,以上函数并不都要,闹钟没有⽤到的话就不要,秒中断也可以不作处理,看项⽬需求。

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302是一种实时时钟(RTC)电路芯片,由Dallas Semiconductor (现被Maxim Integrated收购)设计和制造。

它提供了一个准确的时间和日期计时功能,适用于许多应用,例如电子设备、仪器仪表、通讯设备和计算机系统等。

DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部集成了一个时钟发生器电路,它使用外部XTAL晶体和一个频率分频器来产生准确的时钟信号。

晶体的频率通常为32.768kHz,这是由于此频率具有较好的稳定性。

2.电源管理:DS1302芯片可以使用3V到5.5V的电源供电。

它内部具有电源管理电路,可以自动切换到低功耗模式以延长电池寿命。

3.时间计数器:DS1302芯片内部包含一个时间计数器,用于计算并保存当前时间、日期和星期。

它采用24小时制,并提供了BCD编码的小时、分钟、秒、日、月和年信息。

4.控制和数据接口:DS1302芯片使用串行接口与外部器件进行通信,如微控制器或外部检测电路。

控制和数据信息通过三根线SCLK(串行时钟)、I/O(串行数据输入/输出)和CE(片选)进行传输。

5.电源备份:为了确保即使在电源中断的情况下仍能保持时间数据,DS1302芯片通过附带的外部电池来提供电源备份功能。

当主电源中断时,芯片会自动切换到电池供电模式,并将时间数据存储在内部RAM中。

DS1302芯片的应用包括但不限于以下几个方面:1.时钟和日历显示:DS1302芯片可以直接连接到LCD显示屏、LED显示器或数码管等设备,用于显示当前时间和日期。

2.定时控制:DS1302芯片可以用作定时器或闹钟,在特定的时间触发一些事件。

例如,可以使用它作为控制家庭设备的定时开关。

3.数据记录:由于DS1302芯片具有时间计数功能,它可以用于记录事件的时间戳,如数据采集、操作记录或系统状态记录。

4.电源失效保护:DS1302芯片的电源备份功能可确保即使在电源中断的情况下,时间数据也能被保存,以避免系统重新启动后时间重置的问题。

多功能电子钟毕业设计

多功能电子钟毕业设计

多功能电子钟毕业设计本文主要介绍了一款多功能电子钟的设计方案,其中包括时钟、定时器、闹钟、日历、温度显示等多种功能。

通过硬件和软件的相结合,实现了这种多功能的电子钟,具有易操作、准确显示、功能多样等特点。

本设计可用于家庭、实验室、工作室等多种场合。

一、设计目标随着现代科技的发展,电子钟成为人们生活中不可缺少的一部分。

因此,本文设计了一款多功能电子钟,集时钟、定时器、闹钟、日历、温度显示等多种功能于一身,方便人们的日常生活。

二、设计原理该电子钟的各项功能均用单片机控制实现。

电子钟的控制部分是基于51单片机进行设计。

时钟的原理是通过一个晶振来控制芯片的工作频率,从而达到时钟的准确显示。

使用DS1302进行存储和控制时间。

定时器的原理是通过定时器中断进行实现,通过设定定时器的计数值即可实现定时器的功能。

闹钟的原理是通过设定一个“警报时间”来实现,当时间到达“警报时间”时,闹钟就会开始响铃。

日历的原理是通过读取DS1302中存储的日期信息进行实现。

温度显示的原理是通过使用DS18B20传感器实现对温度的检测。

三、硬件设计本设计的硬件主要由以下部分组成:显示部分、按键部分、计时器部分、DS1302时钟芯片、DS18B20温度传感器、单片机及其外设(如LCD12864液晶屏等)。

1.显示部分本设计采用LCD12864液晶屏进行显示。

2.按键部分本设计采用4个按键T1~T4,T1键用于切换时间制式;T2键用于设定时间和日期等;T3键用于设定闹钟;T4键用于定时器的设定。

3.计时器部分本设计采用计时器555进行固定时间的计时。

4. DS1302时钟芯片DS1302时钟芯片是一种用于实现实时时钟的芯片,本设计将其用于控制电子钟的时间。

5. DS18B20温度传感器DS18B20温度传感器是一种用于测量温度的芯片,本设计将其用于温度显示功能。

6. 单片机及其外设本设计采用AT89C52单片机进行控制,其外设包括LCD12864液晶屏、DS1302时钟芯片、DS18B20温度传感器等。

实时时钟,日历芯片-BM8563,兼容PCF8563,参考源代码

实时时钟,日历芯片-BM8563,兼容PCF8563,参考源代码

_nop_(); _nop_(); }
/******************************************************************** 函 数 名:Stop_I2C(void) 功 能:停止 I2C 总线的传输 说 明: 调 用: 入口参数:无 返 回 值:无 ***********************************************************************/ void Stop_I2C(void) { SCL=0; _nop_(); SCL=1; SomeNOP(); SDA=1; SomeNOP(); }
/******************************************************************** 函 数 名: GetBM8563(void) 功 能:从 BM8563 的内部寄存器(时间、状态、报警等寄存器)读取数据 说 明:该程序函数用来读取 BM8563 的内部寄存器,譬如时间,报警,状态等寄存器 采用页写的方式,设置数据的个数为 no,no 参数设置为 1 就是单字节方式 调 用:Start_I2C(),SendByte(),RcvByte(),Ack_I2C(),Stop_I2C() 入口参数:sla(BM8563 从地址) , suba(BM8563 内部寄存器地址) *s(设置读取数据存储的指针) , no(传输数据的个数) 返 回 值:有,返回布尔量(bit)用来鉴定传输成功否 ***********************************************************************/ bit GetBM8563(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2C(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); Start_I2C(); SendByte(sla+1); if(ack==0)return(0); for (i=0;i<no-1;i++) { *s=RcvByte(); Ack_I2C(0); s++; } *s=RcvByte(); Ack_I2C(1); Stop_I2C();//除最后一个字节外,其他都要从 MASTER 发应答。 return(1); }

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302芯片是一种低功耗的实时时钟(RTC)电路。

它包含了一个真正的时钟/日历芯片和31个静态RAM存储单元,用于存储时钟和日期信息。

DS1302芯片的工作电压范围为2.0V至5.5V,并且具有极低的功耗,非常适合于移动电子设备和电池供电的应用。

DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部具有一个实时时钟发生器,它通过晶振和电容电路生成稳定的振荡信号,用于计时。

2.时钟/计时电路:DS1302芯片内部的时钟/计时电路可以精确地计算并保持当前的时间和日期。

它具有秒、分钟、小时、日期、月份、星期和年份等不同的计时单元。

3.RAM存储单元:DS1302芯片包含31个静态RAM存储单元,用于存储时钟和日期信息。

这些存储单元可以通过SPI接口进行读写操作,并且在断电情况下也能够保持数据。

4.控制接口:DS1302芯片通过3线接口与微控制器通信,包括一个时钟线、一个数据线和一个使能线。

这种接口使得与微控制器的通信非常简单,并且能够高效地读写时钟和日期信息以及控制芯片的其他功能。

DS1302芯片的应用如下:1.实时时钟:DS1302芯片可以用作电子设备中的实时时钟。

例如,它可以用于计算机、嵌入式系统、电子游戏等设备中,以提供准确的时间和日期信息。

2.定时器:DS1302芯片的计时功能可以用于设计各种定时器应用。

例如,它可以用于计时器、倒计时器、定时开关等应用中,以实现定时功能。

3.时钟显示:DS1302芯片可以与显示模块结合使用,用于显示当前的时间和日期。

例如,它可以用于数字钟、计时器、时钟频率计等应用中。

4.能量管理:由于DS1302芯片具有低功耗特性,因此它可以用于电池供电的设备中,以实现节能的能量管理策略。

例如,它可以用于手持设备、无线传感器网络等应用中,以延长电池寿命。

综上所述,DS1302芯片是一种低功耗的实时时钟电路,具有精确计时、可靠存储和简单接口等优点,适用于计时、显示和能量管理等各种应用中。

题目:电子日历时钟系统程序设计

题目:电子日历时钟系统程序设计

题目:电子日历时钟系统程序设计一、功能:1.可通过M键切换显示模式:日期(年、月、日)、时间(小时、分、秒)、秒表(小时、分、秒、1/100秒)、闹钟(小时、分、秒)。

2.在日期显示模式,可通过A键依次使年、月、日闪烁或变色,这时可通过I键加1调整。

3.在时间显示模式,可通过A键依次使小时、分、秒闪烁或变色,这时可通过I键加1调整。

4.在秒表显示模式,可通过I键切换(启动/暂停)计时,当暂停计时时可通过A键复位。

5.在闹钟显示模式,可通过A键依次使On/Off标志、小时、分、秒闪烁或变色,这时可通过I键切换On/Off标志或加1调整。

6.调整和秒表操作不影响日期和时间的准确性。

7.可通过Q键结束程序。

二、任务与要求:1.实现方案,流程图(20分)2.实现日期的显示和调整(15分)3.实现时间的显示和调整(15分)4.实现日期和时间的准确性(5分)5.实现程序正常结束(5分)6.实现秒表功能(20分)7.实现闹钟功能,发声10秒(20分)8.基本实现前5项要求,再实现其它扩展要求,视难度加分。

答辩中误导答辩教师(由答辩教师认定,如某些同学参考其它资料但坚持声称全是自己编写的情况),视情节扣分。

n组设计雷同(由答辩教师认定),第一组正常计分,其余n-1组不计分。

设计报告总体要求:①写出主要设计思路,工作原理;②画出硬件接线图;③调试出现的问题及解决方法;④提交程序清单。

三、编程提示:PC机系统中的8253定时器0工作于方式3,外部提供一个时钟作为CLK信号,频率f=1.1931816MHz。

定时器0输出方波的频率: f out=1.1931816/65536=18.2Hz输出方波的周期T out=1/18.2=54.945ms。

8253A每隔55ms引起一次中断,作为定时信号。

可用55945ms作基本计时单位。

用BIOS调用INT 1AH可以取得该定时单位。

例:1秒=18.2 (计时单位)。

主要利用PC机系统功能调用实现电子日历时钟。

实时日历时钟温度方案与实现

实时日历时钟温度方案与实现

单片机原理及应用课程设计目录1.课程设计题目与要求1.1课程设计内容利用STC89C52RC单片机设计实现实时日历/时间/温度在LCD1602上的显示1.2主要设备与器材PC机一台,HOT51增强型单片机开发板,STC89C52RC单片机一块,LCD1602液晶屏,DS1302时钟芯片,DS18B20温度传感器等,其它器材任选。

1.3设计要求<1)在LCD1602上显示年月日,星期,时分秒,温度,通过3个独立按键修改时间。

<2)显示格式:LCD第一行:年-月-日星期LCD第二行:时-分-秒温度1.4 设计人员分工伍国豪:整体电路设计,焊接电路刘青梅、何盈财:软件设计2.课设所需软件简介2.1 Keil uVision4的简要介绍2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。

新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。

新版本支持更多最新的ARM芯片,还添加了一些其他新功能。

1. 系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍Keil C51开发系统各部分功能和使用。

2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE>,可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及C51编译器编译生成目标文件(.OBJ>。

桌面日历系统的设计与实现

桌面日历系统的设计与实现

桌面日历系统的设计与实现摘要自上个世纪以来,随着电脑的慢慢普及,人们的工作和生活愈来愈方便和快捷,也使愈来愈多的人依托于电脑办公。

而传统的日程记事本慢慢显现出在现今时期的不足和局限性,比如不便携带、不便查阅、不能自动提示等等,电脑桌面日历由此孕育而生。

专门快,桌面日历就以其方便的日期查询、个性化的日程安排、精准的闹钟提示与配套的日记系统、美观的界面设计,受到广大电脑办公者的喜爱。

本设计确实是针对当前网络上众多的桌面日历,综合其各项大体功能来开发一套属于自己的个性化日历日记系统。

本设计要紧采纳C#+SQL的C/S设计模式,来实现不同用户的登录、日程编辑、日程提示、日期查询、节假日治理等工作。

方便了利用者对每日行程的把握,也爱惜了各利用者之间的私人信息。

本设计依照功能模块分为用户登录模块、用户注册、日历和时刻模块、节假日模块、日程行程模块、自动提示模块、数据库模块。

本文详细地介绍了该日历日程系统的功能需求、系统设计和具体实现。

并简要介绍了系统开发采纳的进程及方式。

关键词:桌面日历;日程;多用户系统需求分析用户需求该系统的用户要紧分为三种:未登录用户、登录用户、治理员。

未登录用户只能查看日历主界面和注册模块,登录用户能够利用除删除用户和修改其他用户之外功能,治理员能够利用该桌面日历所有功能。

登录用户和系统治理员都是通过密码验证登录,当角色操作完成后点击“注销”或“退出”按钮退出登录状态。

功能需求系统功能模块要紧包括以下几个方面:1,用户注册模块;2,登录模块;3,日记提示模块;4,节假日模块;5,日历主模块;6,用户信息、节假日信息和日记信息都保留在数据库模块中.以下依照不同的用户对具体功能进行描述:未登录用户未登录用户运行该系统后进入日历主界面,能够查看日历信息,能够查看当前的系统时刻,当点击日历上某一天时能够查看该天是不是是已设置的节假日。

用户当点击“日记记录”或“节日设置”的时候,系统提示对话框显示“该用户为未登录用户”,点击确信按钮后进入登录界面,输入账号和密码后实现用户登录。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

山东科技大学信电学院07级大神的课程设计代码,实时日历/时钟的设计及实现825982538255仅供学弟学妹参考,课程设计还要自己做。

.386Init macro op1,op2,op3,op4,op5,op6mov cx,00hmov dh,op1mov dl,op2op6:mov ah,02hmov bh,00hint 10hpush cxmov ah,0ahmov al,op3mov bh,00hmov cx,01hint 10hpop cxinc cxinc op4cmp cx,op5jne op6endmdata segmentshijian db 10 dup(':') ;存放时间riqi db 20 dup(' ') ;存放日期str1 db ' Welcome to use this clock ',0ah,0dhdb '* show time--t ',0ah,0dhdb '* set time--s ',0ah,0dh,'$'str2 db ' _ _ ',0ah,0dhdb ' ( ) ( )',0ah,0dhdb ' | |_| | ',0ah,0dhdb ' | _ | /^_` )( ^_`\ ( ^_`\ ( ) ( ) ',0ah,0dhdb ' | | | |( (_| || (_) )| (_) )| (_) | ',0ah,0dhdb ' (_) (_)`\__,_)| ,__/^| ,__/^`\__, | ',0ah,0dhdb ' | | | | ( )_| | ',0ah,0dhdb ' (_) (_) `\___/^ ',0ah,0dhdb ' _ _ _ _ ',0ah,0dhdb ' ( ) ( ) ( ) ( ) ',0ah,0dhdb ' | `\| | __ _ _ _ `\`\_/^/^__ _ _ _ __ ',0ah,0dhdb ' | , ` | /^__`\( ) ( ) ( ) `\ /^/^__`\ /^_` )( ^__) ',0ah,0dhdb ' |`\ | ( ___/| \_/ \_/ | | |( ___/( (_| || | ',0ah,0dhdb ' (_) (_)`\____)`\___x___/^ (_)`\____)`\__ _)(_) ',0ah,0dh,'$'str3 db ' change date--d',0ah,0dhdb ' change time--c',0ah,0dhdb ' time is right--r ',0ah,0dhdb ' return to menu--m ',0ah,0dhdb ' return to doc--o ',0ah,0dh,'$'year db 'please press a new year:',0ah,0dh,'$'month db 'please press a new month:',0ah,0dh,'$'day db 'please press a new day:',0ah,0dh,'$'hour db 'please press a new hour:',0ah,0dh,'$'minu db 'please press a new minute:',0ah,0dh,'$'seco db 'please press a new second:',0ah,0dh,'$'chag db 'Are you sure(y/n)?',0ah,0dh,'$'error db 'press error,please input right button:',0ah,0dh,'$'wrong db 'You have pressed the wrong button, press a new button:',0ah,0dh,'$'cant db 'cant change the time, please rechange:',0ah,0dh,'$'data endscode segment use16assume ds:data,cs:codestart:mov ax,datamov ds,axmov es,axmov ax,0700h ;清屏,al滚动行数mov bh,1ah ;背景、字体颜色mov cx,0 ;窗口左上角坐标mov dx,2479h ;窗口右下角坐标(Y'X)int 10hInit 00d,00d,0Dh,dl,80d,sign1Init 24d,00d,0Dh,dl,80d,sign2Init 00d,00d,2ah,dh,25d,sign3Init 00d,79d,2ah,dh,25d,sign4mov ah,02h ;设置光标位置(1)mov bh,00h ;显示页码mov dh,07h ;行坐标mov dl,02h ;列坐标int 10hlea dx,str1 ;显示提示字符串mov ah,09hint 21hinput:mov ah,01h ;键盘输入int 21hcmp al,'t'jz desk2 ;跳转下一页面cmp al,'s'jnz error1call chandate ;更改日期call chantime ;更改时间jmp desk2error1:call huilea dx,error ;提示输入错误mov ah,09hint 21hjmp inputmov ah,4chint 21hdesk2:call clear ;清屏mov ah,02h ;设置光标位置(2)mov bh,00h ;页码mov dh,0ah ;Y行坐标mov dl,00h ;列X坐标int 10hlea dx,str3 ;显示字符串2call yinmov ah,09hint 21hclear1:mov ah,1 ;查询键盘缓冲区,测试键盘是否有输入(不将字符读出,用于提前测试按键为何字符)int 16hjz shan ;缓冲区为空,zf=1无输入zf=0有输入xor ax,ax ;不为空则取出,清空int 16hjmp clear1shan:mov ah,02h ;设置光标位置(2)mov bh,00h ;页码mov dh,01h ;Y行坐标mov dl,00h ;列X坐标int 10hlea dx,str2 ;显示字符串2call yinmov ah,09hint 21hmov ah,2ch ;提取系统时间CH=时(0~23),CL=分(0~59),DH=秒(0~59),DL =百分秒(0~99)int 21hmov bl,dhcmp bl,30hjb kuangsub bl,12 ;59-2chkuang:Init 05d,42d,bl,dl,25d,sign9 ;横向Init 08d,42d,bl,dl,25d,sign10Init 05d,42d,bl,dh,04d,sign11 ;纵向Init 05d,67d,bl,dh,04d,sign12push axmov ah,00mov al,blmov bl,2div blInit 00d,00d,al,dh,25d,sign5inc alInit 24d,00d,al,dl,80d,sign6inc alInit 00d,79d,al,dh,25d,sign7inc alInit 00d,00d,al,dl,80d,sign8pop axmov si,0 ;清空后别的指令;读取日期mov ah,2ah ;CX=年,AL=星期DH=月,DL=日int 21hmov ax,cx ;年call ascyear ;年ASC码转换and ah,0 ;ah置零mov al,dh ;月call ascdate ;ASC码转换and ah,0mov al,dl ;日call ascdate ;ASC码转换lea bp,riqi ;显示日期ES:BP=显示字符串的地址mov dx,0632h ;DH,DL=起始行,列mov cx,10 ;CX=显示字符串长度mov bx,004eh ;BH=页码BL=属性(若AL=00H或01H)背景字体颜色mov ax,1301h ;AL=显示输出方式1——字符串中只含显示字符,其显示属性在BL 中。

显示后,光标位置改变int 10hmov si,0mov ah,2ch ;读取时间CH=时(0~23),CL=分(0~59),DH=秒(0~59),DL=百分秒(0~99)int 21hand ah,0mov al,ch ;时call asctime ;ASC码转换and ah,0mov al,cl ;分call asctimeand ah,0mov al,dh ;秒call asctimelea bp,shijian ;显示时间,bp显示时间的地址mov dx,0733hmov cx,8 ;字符串长度mov bx,005fh ;颜色mov ax,1301h ;视频中断(INT 10H)13H号功能:显示指定地址、指定长度的字符串int 10hmov ah,02h ;设置光标位置mov bh,00h ;页码mov dh,0fh ;y坐标mov dl,00h ;x坐标int 10hcall delay1 ;时间延迟mov ah,01h ;键盘中断int 16hcmp al,'o'jnz menujmp end1menu:cmp al,'m'jnz rightxor ax,axint 16hjmp startright:cmp al,'r'jnz date1call yin ;时间确定,隐藏光标call clear ;清除字符串2jmp shandate1:cmp al,'d'jnz time1call chandatejmp desk2time1:cmp al,'c'jnz clear1call chantimejmp desk2end1:mov ah,4ch ;主程序结束int 21h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; asctime proc ;时间asc码转换mov bl,10div bl ;al商ah余数add al,'0'mov shijian[si],alinc siadd ah,'0'mov shijian[si],ahinc siinc siretasctime endpascyear proc ;年asc码转换mov bl,100div bl ;al商ah余数push axand ah,0mov bl,10div bladd al,'0'mov riqi[si],alinc siadd ah,'0'mov riqi[si],ahinc sipop axmov al,ahand ah,0mov bl,10div bladd al,'0'mov riqi[si],alinc siadd ah,'0'mov riqi[si],ahinc siinc siretascyear endpascdate proc ;月日asc码转换mov bl,10div bladd al,'0'mov riqi[si],alinc siadd ah,'0'mov riqi[si],ahinc siinc siretascdate endpdelay1 proc ;精确延迟时间子程序mov dx,04ffh ;循环次数up: xor cx,cx ;空指令没有意义a: noploop adec dxjnz upretdelay1 endpchandate procmov ah,1 ;清空键盘缓冲区;查询键盘缓冲区int 16hjz c ;缓冲区为空xor ax,ax ;不为空则取出,清空int 16hc:call huichanyear:lea dx,year ;更改年mov ah,09hint 21hand cx,0 ;存放结果mov ah,01hint 21hcall ceshi ;第一个数字是否(0-9)sub al,30hand ah,0mov bx,1000mul bxadd cx,axmov ah,01hint 21hcall ceshi ;第二个数字sub al,30hand ah,0mov bl,100mul bladd cx,axmov ah,01hint 21hcall ceshi ;第三个数字sub al,30hand ah,0mov bl,10mul bladd cx,axmov ah,01hint 21hcall ceshi ;第四个数字sub al,30hand ah,0add cx,axpush cx ;保护年call huichanmonth:lea dx,month ;更改月mov ah,09hint 21hcall chan ;更改月日时分秒子程序返回bhcmp bh,1jae ocall cuojmp chanmontho:cmp bh,12jbe qcall cuojmp chanmonthq:mov dh,bhpush dx ;保护月call huipop dx ;退出保护月pop cx ;退出保护年call chanday ;闰年判断得出日的范围push cx ;重新保护年mov dl,bh ;日push dx ;保护月日call huilea dx,chagmov ah,09hint 21hpop dxpop cx ;退出保护年input2:mov ah,01hint 21hcmp al,'n'jz ccmp al,'y'jz judgepush dxcall huilea dx,wrongmov ah,09hint 21hpop dxjmp input2judge:mov ah,2bh ;CX=年(1980~2099),DH=月(1~12),DL=日(1~31) int 21hcmp al,0 ;测试更改是否成功,出口参数:AL=00H--设置成功,0FFH--设置失败jz returncall huilea dx,cantmov ah,09hint 21hjmp chanyearreturn:retchandate endpchantime proc ;更改时间mov ah,1 ;清空键盘缓冲区;查询键盘缓冲区int 16hjz we ;缓冲区为空xor ax,ax ;不为空则取出,清空int 16hwe:call huichanhour:lea dx,hour ;更改小时mov ah,09hint 21hcall chancmp bh,0jae rcall cuojmp chanhourr:cmp bh,23jbe scall cuojmp chanhours:;mov dh,bhmov ch,bh ;CH=时(0~23)call huichanmin:lea dx,minu ;更改分钟mov ah,09hint 21hcall chancmp bh,0jae wcall cuojmp chanminw:cmp bh,59jbe vcall cuojmp chanminv:;mov dh,bhmov cl,bh ;CL=分(0~59)call huichansec:lea dx,seco ;更改秒mov ah,09hint 21hcall chancmp bh,0jae xcall cuojmp chansecx:cmp bh,59jbe ycall cuojmp chansecy:mov dh,bh ;DH=秒(0~59),mov dl,00h ;定义1/100秒从0开始DL=百分秒(0~99) push cxpush dxcall huilea dx,chagmov ah,09hint 21hpop dxpop cxinput3:mov ah,01hint 21hcmp al,'n'jz wecmp al,'y'jz judge2push dxcall huilea dx,wrongmov ah,09hint 21hpop dxjmp input3judge2:mov ah,2dhint 21hcmp al,0 ;修改是否成功jz return1call huilea dx,cantmov ah,09hint 21hjmp chanhourreturn1:retchantime endphui proc ;光标换行mov dl,0ahmov ah,02hint 21hmov dl,0dhmov ah,02hint 21hrethui endpchan procg2:mov ah,01h ;更改月日时分秒子程序int 21hsub al,30hmov bl,10mul bljae g3 ;输入大于0跳转call huilea dx,errorint 21hjmp g2g3:mov bh,al ;bh出口参数mov ah,01h ;输入第二个数字int 21hsub al,30hadd bh,aljae g1 ;输入第二个数大于0call huilea dx,errormov ah,09hint 21hjmp g2g1:retchan endpclear proc ;清屏子程序mov ax,0600hmov bh,2eh ;背景,字体颜色mov cx,0mov dx,2479hint 10hretclear endpyin proc ;隐藏光标mov cx,2000hmov ah,01hint 10hretyin endpceshi proc ;测试输入数字cmp al,30hjae lcall huilea dx,errormov ah,09hint 21hjmp chanyearl:cmp al,39hjbe ncall huilea dx,errorint 21hjmp chanyearn:retceshi endpcuo proc ;显示错误call huilea dx,errormov ah,09hint 21hretcuo endpchanday procb2:push dx;月d:lea dx,day ;更改日mov ah,09hint 21hmov ah,01hint 21hsub al,30hmov bl,10mul bljae d1;al-30>=0跳到d1call huilea dx,errormov ah,09hint 21hjmp dd1:mov bh,almov ah,01hint 21hsub al,30hadd bh,aljae mcall huilea dx,errormov ah,09hint 21hjmp dm:pop dxcmp dh,1jz a1cmp dh,2jz a2jz a1cmp dh,4jz a3cmp dh,5jz a1cmp dh,6jz a3cmp dh,7jz a1cmp dh,8jz a1cmp dh,9jz a3cmp dh,10jz a1cmp dh,11jz a3cmp dh,12jz a1a1:cmp bh,1jae b1push dxcall cuopop dxjmp b2b1:cmp bh,31jbe b3push dxcall cuopop dxjmp b2a3:cmp bh,1jae c1push dxcall cuopop dxjmp b2c1:cmp bh,30jbe b3push dxcall cuopop dxjmp b2a2:mov ax,cxpush bxpush dxcwd ;扩展mov bx,4 ;DX.AX商:ax,DX.AX余数:dxdiv bxcmp dx,0pop dxpop bxjnz lab1;不等于零跳到lab1mov ax,cxmov bl,100div blcmp ah,0jnz lab2mov ax,cxpush bxpush dxcwdmov bx,400div bxcmp dx,0pop dxpop bxjz lab2lab1:cmp bh,1jae d2push dxcall cuopop dxjmp b2d2:cmp bh,28jbe b3push dxcall cuopop dxjmp b2lab2:cmp bh,1jae d3push dxcall cuopop dxjmp b2d3:cmp bh,29jbe b3push dxcall cuopop dxjmp b2b3:ret chanday endp code endsend start。

相关文档
最新文档