www.pudn.com > SpeechClock11654.rar > system.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Õû³ýµ          
        r3| = 0x8000;       				//ÈòÄê [YEAR].15=1 
        RETF; 
 
GetDaysOfTheMonth_30: 
        CMP     r4,100;       				//ÅжÏÊÇ·ñÄܱ»100Õû³ý 
        JB      GetDaysOfTheMonth_40;  		//²»Äܱ»100Õû³ý£¬ÅжÏÊÇ·ñÄܱ»4Õû³ý  
        r4 -= 100; 
        JNZ     GetDaysOfTheMonth_30; 
        JMP     GetDaysOfTheMonth_50;     	//Äܱ»100Õû³ý£¬²»ÊÇÈòÄê   
GetDaysOfTheMonth_40: 
        TEST    r4,0x0003;             
        JZ      GetDaysOfTheMonth_20;   	//Äܱ»4Õû³ý      
 
GetDaysOfTheMonth_50:                   	//ƽÄê [YEAR].15=0 
        r3 &= 0x7FFF; 
        RETF;      
      .ENDP     
 
//***************µ÷Õûʱ¼ä**********************************//  
//**************Ôö¼Ó 
.PUBLIC  _Adjust_Time_Up 
_Adjust_Time_Up: .PROC 
      	PUSH  bp,bp TO [sp]; 
	    bp=sp+1; 
        r1=[bp+3];     
         
        CMP r1,0; 
        JE  Adjust_Up_00 
        CMP r1,1; 
        JE  Adjust_Up_01 
        CMP r1,2; 
        JE  Adjust_Up_02 
        CMP r1,3; 
        JE  Adjust_Up_03 
        CMP r1,4; 
        JE  Adjust_Up_04 
        CMP r1,5; 
        JE  Adjust_Up_05 
        POP bp,bp  FROM [sp]; 
        RETF 
         
  Adjust_Up_00:  GOTO   Adjust_Up_Time_00;            
  Adjust_Up_01:  GOTO   Adjust_Up_Time_01;        
  Adjust_Up_02:  GOTO   Adjust_Up_Time_02;         
  Adjust_Up_03:  GOTO   Adjust_Up_Time_03;                  
  Adjust_Up_04:  GOTO   Adjust_Up_Time_04;        
  Adjust_Up_05:  GOTO   Adjust_Up_Time_05;              
               
  Adjust_Up_Time_00:    					//µ÷ÕûÄê 
        r3=[Year]; 
        r3&=0x7FFF 
        r3+=1; 
        CMP     r3,3099;  					//2099Äê 
        JBE  YearUp_NoOver 
        r3=2001 
  YearUp_NoOver:       
        CALL F_CalcLeapYear_or_NonLeapYear; 
        [Year] = r3; 
        POP bp,bp  FROM [sp]; 
        RETF        
         
  Adjust_Up_Time_01:   						//µ÷ÕûÔÂ 
        r3=[MonDayHr]; 
        r2=0x3C00; 
        r2&=r3; 
        CMP r2,12*1024; 
        JB  MonUp_NoOver; 
        r3&=0x03FF; 
   MonUp_NoOver: 
        r3+=0x0400; 
        [MonDayHr]=r3;      
        POP bp,bp FROM [sp]; 
        RETF        
          
  Adjust_Up_Time_02:   						//µ÷ÕûÈÕ 
        r3=[MonDayHr]; 
        r2=0x03E0; 
        r2&=r3; 
        CMP r2,31*32; 
        JB  DayUp_NoOver; 
        r3&=0x3C1F;   
   DayUp_NoOver: 
        r3+=0x0020; 
        [MonDayHr]=r3;       
        POP bp,bp  FROM [sp]; 
        RETF        
   
  Adjust_Up_Time_03:    					//µ÷Õûʱ 
        r3=0x0001 
        r3+=[MonDayHr]; 
        r2=0x001F; 
        r2&=r3; 
        CMP r2,23; 
        JBE  HourUp_NoOver; 
        r3&=0x3FE0;   
        r3+=0x0000;   
   HourUp_NoOver: 
        [MonDayHr]=r3;       
        POP bp,bp  FROM [sp]; 
        RETF        
         
  Adjust_Up_Time_04:    					//µ÷Õû·Ö 
        r3=0x0080; 
        r3+=[MinSec]; 
        r2=0x1F80; 
        r2&=r3; 
        CMP r2,59*128; 
        JBE  MinUp_NoOver; 
        r3&=0x007F; 
        r3+=0x0000; 
   MinUp_NoOver: 
        [MinSec]=r3;       
        POP bp,bp  FROM [sp]; 
        RETF        
   
  Adjust_Up_Time_05:    					//µ÷ÕûÃë 
        r3=0x0002; 
        r3+=[MinSec]; 
        r2=0x007E; 
        r2&=r3; 
        CMP r2,59*2; 
        JBE  SecUp_NoOver; 
        r3&=0x1F80; 
        r3+=0x0000; 
   SecUp_NoOver: 
        [MinSec]=r3;       
        POP bp,bp  FROM [sp]; 
        RETF        
       .ENDP           
 
//**************¼õÉÙ 
.PUBLIC  _Adjust_Time_Down 
_Adjust_Time_Down: .PROC 
      	PUSH  bp,bp  TO [sp]; 
	    bp=sp+1; 
        r1=[bp+3];     
         
        CMP r1,0; 
        JE  Adjust_Down_00 
        CMP r1,1; 
        JE  Adjust_Down_01 
        CMP r1,2; 
        JE  Adjust_Down_02 
        CMP r1,3; 
        JE  Adjust_Down_03 
        CMP r1,4; 
        JE  Adjust_Down_04 
        CMP r1,5; 
        JE  Adjust_Down_05 
        JMP Adjust_Down_Time_Ret 
 
Adjust_Down_00: GOTO   Adjust_Down_Time_00;  
Adjust_Down_01: GOTO   Adjust_Down_Time_01;  
Adjust_Down_02: GOTO   Adjust_Down_Time_02;  
Adjust_Down_03: GOTO   Adjust_Down_Time_03;  
Adjust_Down_04: GOTO   Adjust_Down_Time_04;  
Adjust_Down_05: GOTO   Adjust_Down_Time_05;  
         
  Adjust_Down_Time_00:    					//µ÷ÕûÄê 
        r3=[Year]; 
        r3&=0x7FFF 
        r3-=1; 
        CMP     r3,2001;  					//2099Äê 
        JAE  YearDown_NoOver 
        r3=3099 
 YearDown_NoOver:     
        CALL F_CalcLeapYear_or_NonLeapYear; 
        [Year] = r3; 
        JMP Adjust_Down_Time_Ret; 
         
  Adjust_Down_Time_01:   					//µ÷ÕûÔÂ 
        r3=[MonDayHr]; 
        r2=0x3C00; 
        r2&=r3; 
        CMP r2,0x0400; 
        JA  MonDown_NoOver; 
        r3&=0x03FF; 
        r3+=0x3400;     					//13,13-1=12£¨ÏÂÃæ-1£© 
   MonDown_NoOver: 
        r3-=0x0400;     					//-1  
        [MonDayHr]=r3;      
        JMP Adjust_Down_Time_Ret; 
            
   
  Adjust_Down_Time_02:   					//µ÷ÕûÈÕ 
        r3=[MonDayHr]; 
        r2=0x03E0; 
        r2&=r3; 
        CMP r2,0x0020; 
        JA  DayDown_NoOver; 
        r3&=0x3C1F; 
        r3+=0x0400;    						//32  32-1=31 
   DayDown_NoOver: 
        r3-=0x0020;    
        [MonDayHr]=r3;      
        JMP Adjust_Down_Time_Ret;  
  
  Adjust_Down_Time_Ret: 
        POP bp,bp FROM [sp]; 
        RETF   
  
  Adjust_Down_Time_03:    					//µ÷Õûʱ 
        r3=[MonDayHr]; 
        r2=0x001F; 
        r2&=r3; 
        CMP r2,0; 
        JA  HourDown_NoOver; 
        r3&=0x3FE0; 
        r3+=0x0018; 
   HourDown_NoOver: 
        r3-=0x001; 
        [MonDayHr]=r3;      
        JMP Adjust_Down_Time_Ret;   
   
  Adjust_Down_Time_04:    					//µ÷Õû·Ö 
        r3=[MinSec]; 
        r2=0x1F80; 
        r2&=r3; 
        CMP r2,0; 
        JA  MinDown_NoOver; 
        r3&=0x007F; 
        r3+=0x1E00;    						//60   60-1=59 
   MinDown_NoOver: 
        r3-=0x0080; 
        [MinSec]=r3;      
        JMP Adjust_Down_Time_Ret;  
   
  Adjust_Down_Time_05:    					//µ÷ÕûÃë 
        r3=[MinSec]; 
        r2=0x007E; 
        r2&=r3; 
        CMP r2,0; 
        JA  SecDown_NoOver; 
        r3&=0x1F80; 
        r3+=0x0078;     					//60    60-1=59 
   SecDown_NoOver: 
        r3-=0x0002; 
        [MinSec]=r3;      
        JMP Adjust_Down_Time_Ret;  
   
      .ENDP    
  
 //===============================================  
 //        ¶Áʱ¼ä 
 //===============================================       
.PUBLIC _ReadRealYear   //Ä꣺16½øÖÆ 
_ReadRealYear: .PROC 
      r1=0x7FFF;///////////////////////////////// 
      r1&=[Year]; 
      RETF 
      .ENDP 
           
.PUBLIC _ReadRealMonthDay   				//Ô¡¢ÈÕ 
_ReadRealMonthDay: .PROC 
      r4=[MonDayHr]; 
      r1=r4 LSR 2;    						// Ô --¸ß°Ëλ,16½øÖÆ/////////////////////// 
      r1&=0xFF00  
      r3=r4 LSR 4     						//ÈÕ----µÍ°Ëλ,16½øÖÆ  
      r3=r3 LSR 1 
      r3&=0x001F 
      r1|=r3 
      RETF 
    .ENDP 
 
.PUBLIC _ReadRealHourMin    				//ʱ¡¢·Ö 
 _ReadRealHourMin: .PROC 
        r4=[MonDayHr]   
        r4&=0x001F     						//ʱ´æÓÚ¸ß8λ,16½øÖÆ 
        r4+=1 
        r4=r4 LSL 4 
        r4=r4 LSL 4 
        r2=[MinSec]   						//·Ö´æÓÚµÍ8룬16½øÖÆ 
        r2&=0x1F80 
        r1=r2 lsr 4 
        r1=r1 lsr 3 
        r1|=r4 
        retf 
        .ENDP 
  
 .PUBLIC _ReadRealSecond    				//Ãë  16½øÖÆ  
 _ReadRealSecond: .PROC 
     r4=0x007E; 
     r4&=[MinSec]; 
     r1=r4 lsr 1; 
     retf 
     .ENDP 
  
//======================================================= 
  
       
.PUBLIC _Start256HzRTC        				//´ò¿ª256HzÖÐ¶Ï 
_Start256HzRTC: .PROC 
      r1=0 
      [P_TimeBase_Clear]=r1 
      r1=0x0040 
      [P_TimeBase_Setup]=r1      			//TMB2 CLKsour=256Hz 
     
      r1 = C_IRQ6_TMB2 ;  					//256Hz 
      r1|=[R_InterruptStatus]  
	  [R_InterruptStatus] = r1 
      [P_INT_Ctrl]=r1 
      retf 
    .ENDP 
      
 .PUBLIC _Stop256HzRTC           			//¹Ø±Õ256HzÖÐ¶Ï 
_Stop256HzRTC: .PROC 
     r1 = C_IRQ6_TMB2 ;  					//256Hz 
     r1^=0xFFFF        						//È¡·´  
     r1&=[R_InterruptStatus]  
	 [R_InterruptStatus] = r1 
     [P_INT_Ctrl]=r1   
     retf 
     .ENDP     
  
.EXTERNAL  Key_Scan_Init 
.PUBLIC _SP_GoSleep 
_SP_GoSleep: .PROC 
	    r1=0x00ff;	           				//µÈ´ý¼üÊÍ·Å 
        r1 &= [P_IOA_Data];	 
        jnz    WaitKeyUp; 
        call Key_Scan_Init 
        
        r1 = [P_IOA_Latch];     			//Ëø´æÊý¾Ý 
		r1 = [P_IOA_Latch];	  
		r1 = 0x0017;            			//ÈõÕñ¡¢Í£Ö¹Ë¯Ãß 
		[P_SystemClock] = r1; 
	      r1=32           					//ÑÓʱ 
  WakeUpWaitDelay:       
          r1-=1 
          jnz WakeUpWaitDelay 	 
          r1=0 
          [P_SystemClock]=r1    			//¹Ø±Õ32768HʱÖÓ¡¢CPUCLKΪFosc 
WaitKeyUp:    
		retf;  	               
		.ENDP