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

📄 system.asm

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 ASM
字号:
//===================================================
//文件名称:system.asm
//功能描述:系统初始化
//完成日期:2003-6-12
//======================================================
.INCLUDE hardware.inc  
.EXTERNAL  _SecondAddOne
 
.RAM
.PUBLIC     Year; 
.PUBLIC     MonDayHr; 
.PUBLIC     MinSec; 
.PUBLIC     Per500msSet; 

.VAR   Year          //年 b15--if leap year
.VAR   MonDayHr      //月日时  b13--b10(month) b9--b5(day)  b4--b0(hour) 
.VAR   MinSec        //分秒    b12--b7(minute) b6--b1(second) b0--500ms
.VAR   Per500msSet   //500ms 标志

.CODE

//////////////////////////////////////////////////////////////////
// 功能:系统初始化              
// 入口:无
// 出口:无
//////////////////////////////////////////////////////////////////

.PUBLIC _System_Initial;
_System_Initial: .PROC

 //---------------- 系统时钟、中断 --------------------// 
     r1=0
     [P_SystemClock]=r1

     r1=0
     [R_InterruptStatus] = r1
     [P_INT_Ctrl]=r1
     IRQ OFF
     FIQ OFF

//----------------IO口--------------//
	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时 
                    // 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;
//==========================================================================//

.PUBLIC	_LightOn;
_LightOn:	.PROC         //点亮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

//----------------------------------------------//
//功能:万年历调整
//入口:500ms标志  [Per500msSet]----0xFFFF,500ms到
//出口:无
//----------------------------------------------//

.PUBLIC _Calendar_Counter
 _Calendar_Counter: .PROC
        r1 = [Per500msSet];   //500ms标志/////////////////////////////
        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,置调整标志
        [_SecondAddOne]=r4
        
        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---返回值
                                            //闰年(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;
//----------------------------------------------------------------------------//
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
        
        
//----------------------------------------------------------------------------//
//功能:计算本月天数
//出口: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 + -