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