📄 system.asm
字号:
//********************system.asm****************************//
//_System_Initial 系统初始化
//_Clear_WatchDog 看门狗清0
//_SP_GoSleep 进入睡眠模式
//_Start256HzRTC 打开256Hz中断 ?P_TimeBase_Clear会不会影响时基信号触发的中断?
//_Stop256HzRTC 关闭256Hz中断
//*********************************************************//
.INCLUDE hardware.inc
.DEFINE CPU_FRIQUENCY 0x0000
.EXTERNAL _LED_ss;
.EXTERNAL _LED_mm;
.EXTERNAL _LED_hh;
.EXTERNAL _LED_DD;
.EXTERNAL _LED_MM;
.EXTERNAL _LED_YY;
.PUBLIC Year;
.PUBLIC MonDayHr;
.PUBLIC MinSec;
//*********************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
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//********************* C O D E ***************************//
.CODE
//*********************************************************//
//函数:System_Initial()
//描述:系统初始化
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _System_Initial;
_System_Initial: .PROC
//******************系统时钟、中断*************************//
r1=CPU_FRIQUENCY //r1=0
[P_SystemClock]=r1 //Fosc=49MHz,n=1 //[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=0xffff //B15--B0 输出
[P_IOB_Attrib] =r1
[P_IOB_Dir] = r1
r1= 0x0000
[P_IOB_Data] = r1
//*********************万年历******************************//
r1=2005
[Year]=r1 //2005年 b15--not leap year
r1=0x1C46
[MonDayHr]=r1 //7月2日6时
// b13--b10(month) b9--b5(day) b4--b0(hour)
r1=0x0ee8
[MinSec]=r1 //0分0秒
//b12--b7(minute) b6--b1(second) b0--500ms
//LED显示缓冲区初始化
CALL _LED_ss;
CALL _LED_mm;
CALL _LED_hh;
CALL _LED_DD;
CALL _LED_MM;
CALL _LED_YY;
//*******************中断**********************************//
r1 = C_IRQ5_2Hz+C_IRQ4_1KHz //IRQ5_2Hz Time_Count & Calendar_Count
//IRQ4_1KHz LED_Display
//FIQ_TimA F_FIQ_Service_SACM_A2000 由SACM_A2000_Initial()设置并启用
//IRQ6_TMB2 TimeChangeCount变量 由 Start256HzRTC()设置并启用
r1|=[R_InterruptStatus]
[R_InterruptStatus] = r1
[P_INT_Ctrl]=r1
IRQ ON //FIQ 由SACM_A2000_Initial()打开
retf;
.ENDP;
//----------------System_Initial() ENDS--------------------//
//*********************************************************//
//函数:Clear_WatchDog()
//描述:看门狗清0
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _Clear_WatchDog;
_Clear_WatchDog: .PROC
r1=0x0001; // Clear watch dog
[P_Watchdog_Clear]=r1;
retf;
.ENDP
//--Clear_WatchDog() ENDS-----------------------------------//
//*********************************************************//
//函数:SP_GoSleep()
//描述:进入睡眠模式
//参数:无
//返回:无
//*********************************************************//
.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 //延时,睡眠后PC停在这条指令上,唤醒后从这儿继续执行
WakeUpWaitDelay:
r1-=1
jnz WakeUpWaitDelay
r1=CPU_FRIQUENCY
[P_SystemClock]=r1 //关闭32768H时钟、CPUCLK为Fosc
WaitKeyUp:
retf;
.ENDP
//----_SP_GoSleep() ENDS--------------------------------//
.PUBLIC _Start256HzRTC //打开256Hz中断
_Start256HzRTC: .PROC
r1=0
[P_TimeBase_Clear]=r1
r1=0x0004
r1|=[P_TimeBase_Setup]
[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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -