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

📄 initsystem.asm

📁 该程序是用C编写的
💻 ASM
字号:
.include hardware.inc
.code
.public initsystem
initsystem:.PROC
	IRQ OFF
	FIQ OFF
	r1 = 0xfff
	[P_IOB_Dir] = r1
	[P_IOB_Attrib] = r1 
	r1 = 0x05b//2
	[P_IOB_Data] = r1
	r1 = 0x13f//0
	[P_IOB_Data] = r1
	r1 = 0x23f//0
	[P_IOB_Data] = r1
	r1 = 0x3ed//5
	[P_IOB_Data] = r1
	r1 = 0x43f//0
	[P_IOB_Data] = r1
	r1 = 0x586//1
	[P_IOB_Data] = r1
	r1 = 0x63f//0
	[P_IOB_Data] = r1
	r1 = 0x706//1
	[P_IOB_Data] = r1
delay:
	r2 = 0x0000
	r2 += 1
	cmp r2,100
	jne delay;
	IRQ ON;
	.ENDP

.PUBLIC _Clear_WatchDog;
_Clear_WatchDog: 	.PROC
		r1=0x0001;                      	// Clear watch dog
		[P_Watchdog_Clear]=r1;       		//
		retf;
		.ENDP	
		
.PUBLIC _Calendar_Counter
_Calendar_Counter: .PROC
        r1 = [halfsec];   				//500ms标志
        JNZ  Update_Time;
        RETF;
Update_Time:
        r1 = 0;
        [halfsec] = 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,置调整标志
        [_SecondAddOne]=r4
        
        CMP     r1,60*128;  				//是否到60分
        JB      _2HzRtc_90; 
        
        r1+=0x0003;      					//手工校正 
        
//**************month, day, hour
        r2 = [mondayhour];
        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---返回值
                                            //闰年(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:     						//高字节---闰年天数, 低字节---- 平年天数
        .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 = [mondayhour];
        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 + -