?? system.asm
字號(hào):
.INCLUDE hardware.inc
.EXTERNAL _SecondAddOne
.PUBLIC Year;
.PUBLIC MonDayHr;
.PUBLIC MinSec;
.PUBLIC Per500msSet;
//*********************RAM空間占用*************************//
.RAM
.VAR Year //年 b15--if leap year
.VAR MonDayHr //月日時(shí) b13--b10(month) b9--b5(day) b4--b0(hour)
.VAR MinSec //分秒 b12--b7(minute) b6--b1(second) b0--500ms
.VAR Per500msSet //500ms 標(biāo)志
.CODE
//*********************************************************//
//函數(shù):System_Initial()
//描述:鍵盤掃描初始化
//參數(shù):無
//返回:無
//*********************************************************//
.PUBLIC _System_Initial;
_System_Initial: .PROC
//******************系統(tǒng)時(shí)鐘、中斷*************************//
r1=0
[P_SystemClock]=r1
r1=0
[R_InterruptStatus] = r1
[P_INT_Ctrl]=r1
IRQ OFF
FIQ OFF
//*********************I/O口*******************************//
r1=0xff00
[P_IOA_Attrib] = r1 //A7--A0 輸入
[P_IOA_Dir] = r1 //A15--A8 輸出
r1 = 0x0000
[P_IOA_Data] = r1
//*********************萬年歷******************************//
r1=2001
[Year]=r1 //2001年 b15--not leap year
r1=0x0420
[MonDayHr]=r1 //1月1日1時(shí)
// b13--b10(month) b9--b5(day) b4--b0(hour)
r1=0x0000
[MinSec]=r1 //0分0秒
//b12--b7(minute) b6--b1(second) b0--500ms
[Per500msSet]=r1
//*******************中斷**********************************//
r1 = C_IRQ5_2Hz+ C_IRQ3_KEY //2Hz+KeyUp
r1|=[R_InterruptStatus]
[R_InterruptStatus] = r1
[P_INT_Ctrl]=r1
IRQ ON
retf;
.ENDP;
//*********************************************************//
//函數(shù):Clear_WatchDog()
//描述:看門狗清0
//參數(shù):無
//返回:無
//*********************************************************//
.PUBLIC _Clear_WatchDog;
_Clear_WatchDog: .PROC
r1=0x0001; // Clear watch dog
[P_Watchdog_Clear]=r1; //
retf;
.ENDP
//*********************************************************//
//函數(shù):LightOn()
//描述:點(diǎn)亮放光二極管
//參數(shù):無
//返回:無
//*********************************************************//
.PUBLIC _LightOn;
_LightOn: .PROC //點(diǎn)亮IOA15 LED
r1= 0x8000;
r1 |= [P_IOA_Buffer];
[P_IOA_Buffer] = r1;
retf;
.ENDP
.PUBLIC _LightOff; //熄滅 IOA15 LED
_LightOff: .PROC
r1= 0x7FFF;
r1&= [P_IOA_Buffer];
[P_IOA_Buffer] = r1;
retf;
.ENDP
//*********************************************************//
//函數(shù):Calendar_Counter()
//描述:萬年歷調(diào)整
//參數(shù):500ms標(biāo)志 [Per500msSet]----0xFFFF,500ms到
//返回:無
//*********************************************************//
.PUBLIC _Calendar_Counter
_Calendar_Counter: .PROC
r1 = [Per500msSet]; //500ms標(biāo)志
JNZ Update_Time;
RETF;
Update_Time:
r1 = 0;
[Per500msSet] = r1;
//**************minute & second
r1 = [MinSec];
r1 += 1; //秒+1
r2 = r1 AND 0x007E; //是否到60秒?
CMP r2,60*2;
JB _2HzRtc_90;
r1 &= 0x1F80;
r1 += 0x0080;
r4=0xFFFF //分+1,置調(diào)整標(biāo)志
[_SecondAddOne]=r4
CMP r1,60*128; //是否到60分
JB _2HzRtc_90;
r1+=0x0003; //手工校正
//**************month, day, hour
r2 = [MonDayHr];
r2 += 1; //時(shí)+1
r3 = r2 AND 0x001F;
CMP r3,24; //是否到24小時(shí)
JB _2HzRtc_80;
r2& = 0x3FE0; //小時(shí)清0
r3 = r2 LSR 4;
r3 = r3 LSR 1;
r3 &= 0x001F;
CALL F_GetDaysOfTheMonth; //讀本月天數(shù)
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 //計(jì)算平閏年,r3---返回值
//閏年(b15=1) 平年(b15=0)
[Year] = r3;
_2HzRtc_75:
r2 += 0x0020; //天+1
_2HzRtc_80:
[MonDayHr] = r2;
_2HzRtc_85:
r1 = 0x0000; //r1 = 0x0000;
_2HzRtc_90:
[MinSec] = r1;
RETF;
//**************Table
TB_DaysOfMonth: //高字節(jié)---閏年天數(shù), 低字節(jié)---- 平年天數(shù)
.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
//*********************************************************//
//函數(shù):F_GetDaysOfTheMonth
//描述:計(jì)算本月天數(shù)
//參數(shù):無
//返回:r1--天數(shù)
//*********************************************************//
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;
//**************平閏年計(jì)算*********************************//
//描述:閏年條件:
// 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整除
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -