⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 time.asm

📁 SpeechClock是在凌阳提供的电子钟的范例的基础之上实现的电子时钟的源程序 调试环境:unSPIDE184 运行设备:SPCE061A+LED&KEY模板 功能:时钟显示(日期与时间) L
💻 ASM
字号:
//*********************Time.asm****************************//
//_Calendar_Counter 万年历调整
//		F_GetDaysOfTheMonth			计算本月天数
//		F_CalcLeapYear_or_NonLeapYear	平闰年计算
//_Adjust_Time_Up	调整时间_增加
//_Adjust_Time_Down 调整时间_减少
//_ReadRealYear		读时间_年
//_ReadRealMonthDay 读时间_月、日
//_ReadRealSecond   读时间_秒
	//?Ln424?  ?Ln51?
//*********************************************************//
.INCLUDE 		hardware.inc  
.EXTERNAL 		_SecondAddOne
.EXTERNAL		Year; 
.EXTERNAL		MonDayHr; 
.EXTERNAL		MinSec; 
.EXTERNAL   	_LED_ss;
.EXTERNAL   	_LED_mm;
.EXTERNAL   	_LED_hh;
.EXTERNAL   	_LED_DD;
.EXTERNAL   	_LED_MM;
.EXTERNAL  		_LED_YY;
.CODE
//*********************************************************//
//函数:Calendar_Counter()
//描述:万年历调整
//参数:无
//返回:无
//*********************************************************//

.PUBLIC _Calendar_Counter
 _Calendar_Counter: .PROC            
//**************minute & second
        r1 = [MinSec];						//B0 为500ms
        r1 += 1;            				//秒+1
        r2 = r1 AND 0x007E;  				//是否到60秒? 
        CMP     r2,60*2;
        JB      _2HzRtc_90;
        r1 &= 0x1F80;               
        r1 += 0x0080;               
        
        r4=0xFFFF            				//分+1,置调整标志
        [_SecondAddOne]=r4					//main()中判断是否到达闹钟时间用
        
        CMP     r1,60*128;  				//是否到60分
        JB      _2HzRtc_90; 
        
        //r1+=0x0003;      					//手工校正 加了一分半钟时间? 为无用代码
        
//**************month, day, hour
        r2 = [MonDayHr];
        r2 += 1;                    		//时+1
        r3 = r2 AND 0x001F;         
        CMP  r3,24;         				//是否到24小时
        JB      _2HzRtc_80;
        r2& = 0x3FE0;         				//小时清0
        r3 = r2 LSR 4;
        r3 = r3 LSR 1;
        r3 &= 0x001F;
        
        CALL    F_GetDaysOfTheMonth;  		//读本月天数
       
        CMP  r3,r1;         
        JB   _2HzRtc_75;
        r2 &= 0x3C00;
        r2 += 0x0400;             			//月+1
        CMP  r2,13*1024;       				//月超过12?
        JB   _2HzRtc_75;
        r2 = 0x0400;                		//月置1
//**************year
        r3 = [Year];
        r3 += 1;                 			//年+1
        r3 &=0x7FFF
        CMP     r3,3099;       				//3099年
        JBE     _2HzRtc_70;
        r3 = 2001;             				//2001年
_2HzRtc_70:
        CALL F_CalcLeapYear_or_NonLeapYear  //计算平闰年,r3---返回值  每当年变化时,将新的一年是否为闰年先计算出来
                                            //year 闰年(b15=1) 平年(b15=0) 所以给year初始值的时候要注意勿忘标记b15
        [Year] = r3;
		CALL _LED_YY;
_2HzRtc_75:
        r2 += 0x0020;               		//天+1
_2HzRtc_80:
        [MonDayHr] = r2;
        CALL _LED_hh;
        CALL _LED_DD;
        CALL _LED_MM;        
_2HzRtc_85:
        r1 = 0x0000;          				//r1 = 0x0000;
_2HzRtc_90:
        [MinSec] = r1;
        CALL _LED_ss;
        CALL _LED_mm;        
        RETF;
//--Calendar_Counter() ENDS ------------------//

//**************Table
TB_DaysOfMonth:     						//高字节---闰年天数, 低字节---- 平年天数
        .DW     31*256+31;
        .DW     31*256+31;          		//1 month
        .DW     29*256+28;          		//2 month
        .DW     31*256+31;          		//3 month
        .DW     30*256+30;          		//4 month
        .DW     31*256+31;          		//5 month
        .DW     30*256+30;          		//6 month
        .DW     31*256+31;          		//7 month
        .DW     31*256+31;          		//8 month
        .DW     30*256+30;          		//9 month
        .DW     31*256+31;          		//10 month
        .DW     30*256+30;          		//11 month
        .DW     31*256+31;          		//12 month
        
//*********************************************************//
//函数:F_GetDaysOfTheMonth
//描述:计算本月天数
//参数:无
//返回:r1--天数
//*********************************************************// 
F_GetDaysOfTheMonth:
        r1 = [MonDayHr];
        r1 = r1 LSR 4;
        r1 = r1 LSR 4;
        r1 = r1 LSR 2;

        r1 &= 0x000F;
        bp = r1 + TB_DaysOfMonth;
        r1 = [bp];

        r4 = 0x8000 
        TEST r4,[Year];        				//平闰年?
        JNZ   GetDaysOfTheMonth_LeapYear;
        
GetDaysOfTheMonth_NonLeapYear:  			//平年
        r1 &= 0x00FF;
        RETF;
        
GetDaysOfTheMonth_LeapYear:     			//闰年           
        r1 = r1 LSR 4;
        r1 = r1 LSR 4;
        RETF;        
//**************平闰年计算*********************************//
//描述:闰年条件:
//		1、能被400整除
//		2、能被4整除,但不能被100整除
//*********************************************************//         
F_CalcLeapYear_or_NonLeapYear:
        r4=r3;
        CMP     r4,0;
        JZ      GetDaysOfTheMonth_20;
GetDaysOfTheMonth_10:
        CMP     r4,400;            			//判断是否能被400整除
        JB      GetDaysOfTheMonth_30;     	//不能被400整除
        r4 -= 400;
        JNZ     GetDaysOfTheMonth_10;
GetDaysOfTheMonth_20:       				//闰年--能被400整除 或 能被4整除但不能被100整除

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -