📄 time.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 + -