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

📄 system.asm

📁 关于凌阳单片机的应用--语音播报电子钟。功能为实时当前的时间。
💻 ASM
字号:
.INCLUDE hardware.inc  
.EXTERNAL  _SecondAddOne
.PUBLIC		Year; 
.PUBLIC		MonDayHr; 
.PUBLIC		MinSec; 
.PUBLIC		Per500msSet; 
//*********************RAM空间占用*************************//
.RAM
.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
//*********************************************************//
//函数:System_Initial()
//描述:键盘扫描初始化
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _System_Initial;
_System_Initial: .PROC
//******************系统时钟、中断*************************//

     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时 
                    						// 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;
//*********************************************************//
//函数:Clear_WatchDog()
//描述:看门狗清0
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _Clear_WatchDog;
_Clear_WatchDog: 	.PROC
		r1=0x0001;                      	// Clear watch dog
		[P_Watchdog_Clear]=r1;       		//
		retf;
		.ENDP
//*********************************************************//
//函数:LightOn()
//描述:点亮放光二极管
//参数:无
//返回:无
//*********************************************************//
.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
//*********************************************************//
//函数:Calendar_Counter()
//描述:万年历调整
//参数: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;
//**************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 + -